一.Mybatis简介
MyBatis(之前被称为iBatis)是一种开源的持久化框架,它将面向关系数据库的持久层操作封装起来,使得开发人员可以通过简单的配置来实现对数据库的操作。MyBatis提供了灵活且强大的SQL映射功能,能够将数据库表的记录映射到Java对象上,从而简化了数据库操作和数据持久化的过程。
以下是MyBatis的一些主要特点和功能:
简单易用:MyBatis采用了简单的XML或注解配置方式,使得开发人员可以快速上手并且容易理解。
灵活性:MyBatis不强制开发者遵循特定的编程模型,开发人员可以使用自己习惯的编码风格进行开发。同时,MyBatis支持动态SQL,可以根据不同的条件生成不同的SQL语句,增加了灵活性和可扩展性。
SQL映射:MyBatis提供了强大的SQL映射功能,通过配置SQL语句和结果映射规则,将数据的提取、转换和映射工作交给MyBatis框架完成,减少了手动编写JDBC代码的工作量。
执行器和事务:MyBatis提供了多种执行器(Simple、Reuse、Batch)和事务管理方式,开发人员可以根据需要选择适合的执行器和事务管理方式,以提高数据库操作的性能和可靠性。
插件机制:MyBatis支持自定义插件,开发人员可以通过插件机制来扩展或修改MyBatis的行为,例如增加缓存支持、打印SQL日志等。
总的来说,MyBatis是一个轻量级且灵活的持久化框架,它通过将数据库操作和Java对象之间的映射工作进行封装,简化了数据持久化的过程。它的目标是提供开发人员更直观、高效的数据库访问方式,并且与各种Java框架(如Spring、Spring Boot)和持久化标准(如JPA)可以良好集成。
二.场景应用
1.动态SQL
1.1 介绍
MyBatis中的动态SQL是指在SQL语句中根据不同的条件动态生成不同的SQL片段,从而实现灵活的查询和更新操作。动态SQL使得我们能够根据不同的情况生成不同的SQL语句,避免了编写大量重复的SQL语句,提高了代码的可维护性和可读性
1.2 案例演示
(1).foreach元素的使用
当我们的SQL语句的查询条件的数量存在多个时,可以使用foreach元素进行遍历条件结果,最后进行SQL查询,在我们Mybatis生成的xml中进行配置
<select id="selectById" resultType="com.YU.model.Book" parameterType="java.lang.List" >
select
<include refid="Base_Column_List" />
from t_mvc_book
where bid in
<foreach collection="bids" item="bid" open="(" close=")" separator=",">
#{bid}
</foreach>
</select>
在BookMapper接口中定义方法
List<Book> selectById(@Param("bids") List bids);
在业务逻辑层中编写接口类及它的实现类
List<Book> selectById(List bids);
@Override
public List<Book> selectById(List bids) {
return BookMapper.selectById(bids);
}
开始测试
在测试类中编写Junit测试方法
@Test public void selectById(){ //创造一个集合 List<Integer> bids = Arrays.asList(new Integer[]{58, 89, 61}); bookBiz.selectById(bids).forEach(System.out::println); }
运行结果:
小结:我们在不确定使用SQL语句时可以使用动态SQL ,大大得增加了SQL语句的灵活性,我们可以通过Mybatis中封装好的foreach元素配合动态SQL遍历出不确定的条件元素,总而言之:动态SQL为我们的开发增加了可扩展性,提高了我们的开发效率,降低了开发难度
当然在Mybatis中不止有foreach一个元素可供动态SQL使用,还有if、choose、when、otherwise、bind元素等等,下面介绍它们的用法,就不进行测试了
(2) if元素:
if元素用于在SQL语句中添加条件判断。可以根据某个条件的值来选择是否包含特定的SQL片段。示例:
<select id="getUserList" parameterType="User" resultType="User">
SELECT * FROM users
WHERE 1=1
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
上述示例中,根据传入的User对象的name和age属性是否为空,决定是否在SQL语句中添加对应的查询条件。
(3) choose、when、otherwise元素:
choose元素用于实现类似于Java的switch语句的功能。当某个条件满足时,执行对应的SQL片段。示例:
<select id="getUserList" parameterType="User" resultType="User">
SELECT * FROM users
WHERE 1=1
<choose>
<when test="name != null">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND status = 'ACTIVE'
</otherwise>
</choose>
</select>
上述示例中,当name和age都为空时,查询条件为status=‘ACTIVE’;当name不为空时,查询条件为name=#{name};当age不为空时,查询条件为age=#{age}。
(4) bind元素:
"bind"元素是一种用于定义和绑定变量的XML元素。该元素可以在MyBatis的XML映射文件中使用,用于在SQL语句中定义和使用临时变量。示例:
<select id="getUserById" resultType="User">
<bind name="userId" value="1"/>
SELECT * FROM users WHERE id = #{userId}
</select>
在上面的示例中,“bind"元素用于定义一个名为"userId"的变量,并将其值设置为"1”。然后,该变量可以在后续的SQL语句中使用,通过"#{userId}"的方式引用变量的值。
"bind"元素有两个属性:
- “name”:指定变量的名称。
- “value”:指定变量的值。
2.Mybatis中的模糊查询
三种写法
(1).#
<select id="like1" resultType="com.YU.model.Book" parameterType="java.util.List" >
select
<include refid="Base_Column_List" />
from t_mvc_book
where bname like #{bname}
</select>
测试结果
(2). $
<select id="like2" resultType="com.YU.model.Book" parameterType="java.util.List" >
select
<include refid="Base_Column_List" />
from t_mvc_book
where bname like '${bname}'
</select>
(3).concat
<select id="like3" resultType="com.YU.model.Book" parameterType="java.util.List" >
select
<include refid="Base_Column_List" />
from t_mvc_book
where bname like concat('%',#{bname},'%')
</select>
总结:由测试结果可以得出Mybatis中 '#' 和 '$' 的区别
1.内在形式:$是占位符传参,#是预处理SQL
2.外在形式:$传参时不带引号,需要自行添加,#传参自带引号
3.$传参存在sql注入的危险,#不存在
4.$可以用作动态列,完成动态SQL的开发
在实际开发过程中,尽量不使用$··,#能很大程度防止SQL注入
三.resultMap和resultType的区别
1.简介
resultType
和resultMap
是Mybatis中映射查询结果的两种方式
resultType
:resultType
是一种简单的映射方式,用于指定查询结果的目标类型。你可以通过指定目标类型的全限定名或简单类型名来使用它。例如,如果你有一个User
类,你可以使用resultType="com.example.User"
来告诉MyBatis将查询结果映射到该类的对象。在使用resultType
时,MyBatis通过反射创建目标类型的对象,并将查询结果的列与目标对象的属性进行匹配。
resultMap
:resultMap
提供了更灵活和详细的结果映射方式。通过使用resultMap
,你可以定义一个映射规则,将查询结果中的列映射到指定Java对象的属性。你可以在resultMap
中指定列名和属性名之间的映射关系,还可以执行一些其他的映射操作,如类型转换、关联对象的加载等。通过使用resultMap
,你可以更好地控制结果的映射过程。
2.区别
- 简单性:
resultType
比resultMap
更简单,只需要指定目标类型即可,而resultMap
需要定义详细的映射规则。- 灵活性:
resultMap
比resultType
更灵活,可以定义复杂的映射规则,并在映射过程中执行一些额外的操作。- 可读性:由于
resultType
只指定目标类型,因此在查看代码时,可能需要跳转到目标类型的定义处以了解其属性。而resultMap
可以在同一个地方定义所有的映射规则,使代码更易读。
3.总结与归纳
(1)
在使用MyBatis中拥有多个场景,返回的结果是多样的,resultType/resultMap
1返回单表的对应的实体类,仅有一个查询结果,可以用resultType/resultMap
2返回单表的对应的实体类,有多个查询结果,可以用resultType/resultMap
3返回多表对应结果,仅有一个查询结果,通常用resultType也可以用resultMap
4返回多表对应结果,有多个查询结果,通常用resultType也可以用resultMap
5返回单个列段,仅有一个查询结果,就用resultType
6返回单个列段,有多个查询结果,就用resultType
(2)
如果是单表的情况下,resultType与resultMap都可以使用。
1 使用resultMap返回映射关系,指的是实体类与数据库字段的关系2 使用resultType返回List<T>
3 使用resultType返回单个对象
4 使用resultType返回List<Map>【适用于多表查询返回结果集】
5 使用resultType返回Map<String,Object>【适用于多表查询返回单个结果集】
今天的学习总结就到这里了,大家的支持是博主更新的动力,觉得写得好的话记得点赞加收藏