MyBatis的基础操作
一、打印⽇志
在Mybatis当中我们可以借助⽇志,查看到sql语句的执⾏、执⾏传递的参数以及执⾏结果
在配置⽂件中进⾏配置即可

重新运⾏程序,可以看到SQL执⾏内容,以及传递参数和执⾏结果

- ①:查询语句 ②:传递参数及类型 ③:SQL执⾏结果
二、参数传递
解决 "SQL 中参数不能写死 " 的问题,实现根据方法入参动态拼接 SQL 条件(以 "根据 id 查询用户" 为例)。
参数传递的两种方式
1. 单普通类型参数(无需别名)
- 规则 :当 Mapper 方法只有 1 个普通类型(如
Integer/String)参数时,SQL 中#{}内的名称可任意写(建议与参数名一致,增强可读性)。 - 示例:

2. 使用@Param指定别名(通用方式)
- 规则 :通过
@Param("别名")给参数命名后,SQL 中#{}必须使用该别名。 - 适用场景:方法有多个参数、或参数名不直观时,避免参数绑定混乱。
- 示例:

三、增(Insert)
SQL语句:
把SQL中的常量替换为动态的参数:
Mapper接⼝:

直接使⽤UserInfo对象的属性名来获取参数
测试代码:

如果设置了 @Param 属性,#{...}需要使⽤参数.属性来获取

注意:如果你的user_info表主键id是自增类型 (绝大多数场景都是),必须给@Insert补充@Options注解,否则插入后无法获取自增的主键 ID

useGeneratedKeys = true:告诉 MyBatis "获取数据库自增的主键值";keyProperty = "id":把自增的主键值赋值到UserInfo对象的id属性;- 插入后可直接获取主键:

四、删(Delete)
SQL语句:

把SQL中的常量替换为动态的参数:
Mapper接⼝:

五、改(Update)
SQL语句:

把SQL中的常量替换为动态的参数
Mapper接⼝:

六、查(Select)

查询结果:

从运⾏结果上可以看到,我们SQL语句中,查询了delete_flag,create_time,update_time,但是这⼏个 属性却没有赋值.
- MyBatis 会根据方法的返回结果进行赋值.
- 方法用对象 UserInfo 接收返回结果,MySQL 查询出来数据为一条,就会自动赋值给对象.
- 方法用 List<UserInfo>接收返回结果,MySQL 查询出来数据为一条或多条时,也会自动赋值给 List.
- 但如果 MySQL 查询返回多条,但是方法使用 UserInfo 接收,MyBatis 执行就会报错.
原因分析:当⾃动映射查询结果时,MyBatis会获取结果中返回的列名并在Java类中查找相同名字的属性(忽略⼤⼩写)。这意味着如果发现了ID列和id属性,MyBatis会将列ID的值赋给id属性

解决办法**:**
1. 起别名
在SQL语句中,给列名起别名,保持别名和实体类属性名⼀样

2. 结果映射


如果其他SQL,也希望可以复⽤这个映射关系,可以给这个Results定义⼀个名称

使⽤id 属性给该Results 定义别名,使⽤@ResultMap 注解来复⽤其他定义的 ResultMap

3. 开启驼峰命名
通常数据库列使⽤蛇形命名法 进⾏命名(下划线分割各个单词),⽽Java属性⼀般遵循驼峰命名法 约定.为了在这两种命名⽅式之间启⽤⾃动映射 ,需要将mapUnderscoreToCamelCase 设置为true。

驼峰命名规则:
- abc_xyz => abcXyz
- 表中字段名:abc_xyz
- 类中属性名:abcXyz
Java代码不做任何处理

七、MyBatisXML配置⽂件
MyBatis 开发方式
MyBatis 支持两种开发方式:
- 注解方式:适用于简单的增删改查功能
- XML 方式:适用于复杂 SQL 功能,需将 SQL 语句写在 XML 配置文件中
MyBatis XML 方式的核心步骤
需完成两项配置:
- 配置数据库连接字符串与 MyBatis
- 编写持久层代码
7.1配置连接字符串和MyBatis

7.2写持久层代码
持久层代码分两部分 1. ⽅法定义Interface 2. ⽅法实现:XXX.xml

7.2.1添加mapper接⼝
数据持久层的接⼝定义:

7.2.2添加UserInfoXMLMapper.xml
数据持久成的实现,MyBatis的固定xml格式:

| 标签 | 核心属性 | 属性说明 |
|---|---|---|
<mapper> |
namespace | 填写 Mapper 接口全限定名,绑定 XML 与接口 |
<select> |
id | 与接口方法名一致,匹配接口方法与 SQL 逻辑 |
| resultType | 填写实体类全限定名,指定 SQL 结果映射的 Java 对象类型 |
关联示例(UserInfoMapper)
- 接口:定义
queryAllUser()方法 - XML:
namespace="com.example.mybatis.mapper.UserInfoMapper"绑定接口<select id="queryAllUser" resultType="com.example.mybatis.model.UserInfo">select username, password, age, gender, phone from user_info</select>实现方法
7.3增(Insert)
UserInfoMapper接⼝:

UserInfoMapper.xml实现:

返回⾃增id
接⼝定义不变,Mapper.xml实现设置useGeneratedKeys和keyProperty属性


7.4删(Delete)
UserInfoMapper接⼝:

UserInfoMapper.xml实现:

7.5改(Update)
UserInfoMapper接⼝:

UserInfoMapper.xml实现:

7.6查(Select)
同样的,使⽤XML的⽅式进⾏查询,也存在数据封装的问题 我们把SQL语句进⾏简单修改,查询更多的字段内容

运⾏结果:

结果显⽰:deleteFlag,createTime,updateTime也没有进⾏赋值.
解决办法和注解类似:1. 起别名 2. 结果映射 3. 开启驼峰命名 其中1,3的解决办法和注解⼀样,不再多说,接下来看下xml如何来写结果映射
Mapper.xml:


