MyBatis 与其使用方法讲解
ORM
在讲解 Mybatis 之前,我们需了解一个概念 ORM(Object-Relational Mapping)对象关系映射,其是数据库与 Java 对象进行映射的一个技术.通过使用 ORM,我们可以不用编写负责的 Sql 语句,而是通过操作对象来实现增删改查操作
缺优分析
优点提高开发效率,减少代码的重复性和维护成本增加代码的可读性,降低复杂度对数据库查询的细节进行抽象,隐藏了 sql 语句
缺点在进行多表联查时,或存在 where 条件时,ORM 语句会变得复杂
MyBatis
mybatis 是一个支持自定义 SQL 的持久层框架,通过 XML 文件来实现 SQL 配置和数据映射,MyBatis 允许开发者手动编写 SQL 语句,提高灵活性
Mybatis 通过
mapper
文件,将 sql 查询和 Java 对象绑定到一起,简化了 JDBC 代码的编写,手动设置参数,获取结果集的工作
MyBatis 的工作流程
其分为以下几步

MyBatis 的基本使用
环境准备
引入依赖包:
创建 mybatis 配置文件(
mybatis-config.xml
)
springboot 中的
application.yml
创建 Mapper 映射文件

创建 Mapper 接口:

MyBatis 日志配置
引入 SpringBoot 中的 log4j
在 SpringBoot 中在
application.yml
中mybatis
配置项中进行配置
配置
log4j.properties
文件
一个基本的 mybatis 的 XML 模板如下
CURD 实现
select 查询
使用
<select>
标签实现基本查询
id
:对应 Mapper 接口中的方法名,必须一致resultType
:指定返回结果映射到哪个 Java 类传参
#{}
与${}
的区别#{}
的特点事先进行预编译:使用#{}
的参数会被 Mybatis 当作 JDBC 中的?
占位符防止 sql 注入:由于会事先进行预编译,Mybatis 能够防止 Sql 注入类型转换:会根据参数类型进行适当的类型转换${}
的特点字符串拼接:&{}
直接将字符串进行替换,相当于在 Sql 中直接拼接传入的参数存在 sql 注入的风险:没有预编译,会引发 sql 注入问题多条件查询
模糊查询
使用 LIKE 关键字和 CONCAT()函数进行查询
insert 插入
使用
<insert>
标签实现基本插入操作
parameterType
:表示入参类型实现回填自增主键
使用
userGeneratedKeys
和keyProperty
实现
userGeneratedKeys
:表示是否启动自增keyProperty
:表示将生成的主键赋值给哪个 java 对象的哪个属性如user.id
update 更新
使用
<update>
标签实现基本更新
delete 删除
使用
<delete>
标签基本查询
传参方式
多参数传参(使用 @Param)
当方法有多个参数时,使用
@Param
注解明确参数名
Mapper 接口
对象参数
当参数为一个 Java 对象时,MyBatis 自动将对象属性映射到 Sql 语句中的占位符
#{name}
对应 user.name,#{age}
对应 user.ageMapper 接口
Map 参数
通过 Map 传递多个参数或动态参数
Mapper 接口
集合/数组参数
适用于批量查询,比如 WHERE id IN (…)
<foreach>
是动态 sql 中的知识点等下会系统讲解Mapper 接口
动态 sql
与标签
<where>
:生成 WHERE 子句,并自动判断去掉开头多余的AND/OR
关键字,使 sql 更简洁<if>
:用于判断传参条件,根据条件决定是否拼接某段 SQL 语句,适用于传参条件不固定,只有在满足条件时接入某个子串
当
name
为非空,会添加AND name LIKE CONCAT('%', #{name}, '%')
当age
为非空时会添加AND age = #{age}
结合标签使用,能自动处理首个 AND,使得 SQL 语句正确
其作用在于动态拼接 SQL 片段前添加或去除特点字符,比如前缀,后缀,以及多余的分隔符如
,
常用于 INSERT 和 UPDATE 语句,避免出现多余逗号
INSERT 语句
标签包裹字段列表和对应值部分
suffixOverrides=”,”
表示自动去除多余的逗号,确保 sql 语法正确
UPDATE 语句
<set>
标签是<trim>
的特性化
<set>
标签内部原理类似<trim>
,会自动去除多余逗号<foreach>
用于遍历集合,数组和 Map,常用于批量操作或动态生成 IN 子句其主要属性 collection:集合或数组名称(可用
@Param()
指定对应名称,默认为list
或array
)item:循环时每个元素的别名 open:循环生成 sql 片段的前缀 separator:循环时的分隔符 close:循环生成 sql 片段的后缀
当 ids 不为 null 时,进入
<if test="ids != null">
生成的 sql 片段为SELECT * FROM AND WHERE id IN(#{id},#{id},…)
其中标签遍历集合 ids,用逗号进行分隔,并在开头添加
(
括号,结尾添加)
括号最终标签会去除第一个 AND,使 sql 合法
SELECT * FROM id WHERE IN(#{id},#{id},…)
MyBatis 的映射
基本映射
用于单一的字段对应
假设有一个 user 表,其中有字段
id,name,age
其在 Java 中有个简单的对应类 User,其属性分别也是id,name,age
那么在 Mapper.xml 进行 select 查询时
MyBatis 会将查询的结果中每一列值自动赋值给 User 对象中相同的属性
数据库列表的 id→User 对象的 id
数据库列表的 name→User 对象的 name
数据库列表的 age→User 对象的 age
这样可能就会出现一种情况,数据库列表的列名与对象的属性名不一致,通常使用开启驼峰转换来解决→在
application.yml
的 mybatis 配置中添加如下配置:
一对一映射
当查询中需要查询一个对象时
现假设,数据库有两张表一个 user(用户)表,另一个 user_detail(用户详细信息)表,在 Java 中我们可以创建两个类 User 和 UserDetail 类
然后再创建一个 UserVo 类,其中包含 User 的属性和一个 UserDatail 对象
XML 配置如下:
<resultMap>
标签用于定义一组映射规则,将查询的结果转换为一个指定类型的 Java 对象属性 id:为该映射指定一个唯一标识,供其在 XML 中引用使用,如<resultMap id="userResultMap" type="com.example.User">
type:指定映射结果对应的 Java 类型(对象的全路径)<result>
标签用于将数据库列映射到 Java 对象的属性,在<resultMap>
中使用属性 property:Java 对象中的属性名称,如<result property="userName" column="user_name"/>
其表示将查询到的 user_name 列的值赋值给 userName 属性 cloumn:数据库查询结果中的列名,如column="user_name”
表示 sql 查询列名为 user_name 的值<id>
标签<id>
类似于<result>
主要用于映射主键字段属性 property:与<result>
相同,映射到 Java 对象的主键属性 column:对应数据库中的主键列名<association>
标签表示一个一对一关连当查询到结果时,MyBatis 会将用户的基本字段{id,name,age}
直接映射到 UserVo 中,同时将详细信息{detail_id,address,phone}
封装为一个 UserDetail 对象,并赋值到 UserVo 的userDetail
对象中
一对多映射
提供用于有列表对象的查询
现假设一个老师(Teacher)类和一个学生(student)类,一个老师可以对应多个学生,在 Java 中我们可以设计 Teacher 类, 使用 List 属性来存放老师的所有学生
XML 配置如下:
<collection>
标签:用于表示一对多关系,把查询结果中的学生记录封装成一个列表,并赋值到 Teacher 对象中的student
属性
文章转载自:ihav2carryon
评论