《MyBatis 从入门到上手:超全基础操作 + XML 配置指南》

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:
    1. namespace="com.example.mybatis.mapper.UserInfoMapper" 绑定接口
    2. <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:

相关推荐
jarreyer5 小时前
mysql常见指标计算笔记
数据库·mysql
狮智先生5 小时前
【学习笔记】利用blender生成的mesh模型(ply格式)并不是水密的
笔记·学习·blender
源代码•宸5 小时前
goframe框架签到系统项目(安装 redis )
服务器·数据库·经验分享·redis·后端·缓存·golang
5 小时前
TIDB——TIKV——分布式事务与MVCC
数据库·分布式·tidb·分布式数据库·tikv·
gis分享者5 小时前
学习threejs,生成复杂3D迷宫游戏
学习·游戏·3d·threejs·cannon·迷宫·cannon-es
5 小时前
TIDB——TIKV——RocksDB
数据库·分布式·tidb·分布式数据库·
Gauss松鼠会5 小时前
【openGauss】如何在openGauss中实现类似Oracle中constructor function、member function的功能
数据库·oracle·database·gaussdb
deardao5 小时前
【张量等变学习】张量学习与正交,洛伦兹和辛对称
人工智能·学习·自然语言处理
会编程的吕洞宾5 小时前
智能体学习记录一
人工智能·学习