一、什么是MyBatis
1.1 概述
①MyBatis是一个持久层框架,用java编写的。
②它封装了jdbc操作的很多细节,使开发者只需关注sql语句本身,而无需关注注册驱动,创建连接等繁琐的过程
③它使用了ORM思想实现了结果集的封装
Tips:ORM思想
Object Relational Mapping(对象关系映射)
就是把数据库表和实体类及实体类的属性对应起来,让我们可以操作实体类即实现操作数据表。
二、 MyBatis入门
2.1 环境搭建(maven搭建)
①创建maven工程并导入坐标
<groupId>com.hong</groupId>
<artifactId>day01_01mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
②创建实体类(有get,set方法,标准javabean)

③创建MyBatis的主配置文件(SqlMapConfig.xml)

④创建映射配置文件(IUserDao.xml)

⑤创建测试类

Tips:
1.mybatis的映射配置文件位置必须和dao接口的包结构相同
2.映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
3.映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
2.2基于注解的mybatis方式
①在持久层接口添加注解

②修改SqlMapConfig.xml

三、Mapper动态代理开发
只写接口,不写dao实现类,实现类由mybatis生成

接口和映射配置文件对应

四、结果封装
当我们建实体类时,出现实体类属性和数据库表的类名不一致时,如何解决?
①把实体类名字改成和数据库表的类名一致
②Sql语句中使用别名(执行效率最快的,开发效率慢)
③在配置文件中配置(开发效率快)
resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装
①定义resultMap
<resultMap type="com.hong.domain.User" id="userMap">
<id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="sex" property="userSex"/>
<result column="address" property="userAddress"/>
<result column="birthday" property="userBirthday"/>
</resultMap>

②映射配置

Tips1:typeAliases标签
用来配置domain类中的别名的
在SqlMapConfig.xml中配置

指定包后,该包下的实体类都会注册别名,类名就是别名,不区分大小写
Tips2:在mapper中也有package标签
用于dao接口所在的包,指定之后就不用写mapper或resource或class了(也是用来起别名的)
五、MyBatis的动态SQL语句
Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。
1. 动态 SQL 之if标签
有时在 id 如果不为空时可以根据 id 查询,
如果 username 不能为空时还要加入用户名作为条件判断,
此时就可以用到if标签
<select id="findByUser" resultType="user" parameterType="user">
select * from user where 1=1
<if test="username!=null and username != '' ">
and username like #{username}
</if>
<!--如果地址不为空就输出地址-->
<if test="address != null">
and address like #{address}
</if>
</select>
2. 动态 SQL 之where标签
为了简化上面 where 1=1 的条件拼装,我们可以采用标签来简化开发

3. 动态标签之foreach标签
<foreach collection="ids" open="id in ( " close=")" item="uid"
separator=",">
#{uid}
</foreach>
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
separator:代表分隔符
更多动态SQL等用过再写吧(嘻嘻)
Tips:可以用sql标签抽取重复的sql语句
<sql id="defaultUser">
select * from user
</sql>
六、Mybatis 延迟加载策略
延迟加载:
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.
好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
坏处:
因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。
**立即加载:**不管用不用,只要一调用方法,马上发起查询
一对一,多对一通常采用立即加载
一对多,多对多通常采用延迟加载
在SqlMapConfig配置文件中添加加延迟加载的配置。
<!-- 开启延迟加载的支持 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
七、MyBatis缓存
什么是缓存?
缓存是存在于内存中的临时数据
为什么使用缓存?
减少和数据库的交互次数,提高执行效率
什么情况适用缓存?
①经常查询但不经常改变的数据
②数据的正确与否对最终的结果影响不大的
1.一级缓存
一级缓存是 SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在。(SqlSession对象的缓存)
提供缓存的区域是在SqlSession中的,该区域的结构是Map。当SqlSession对象消失是,mybatis的一级缓存也就消失了
Tips:可以使用SqlSession.clearCache()方法清理缓存
Tips2:在SqlSession执行了commit操作后,清空SqlSession中的一级缓存,这样做的目的是为了让缓存中存储的是最新的消息,避免脏读。
2.二级缓存(存的是值)
二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。
二级缓存由同一个SqlSessionFactory对象创建的SqlSession共享其缓存

①让MyBatis框架支持二级缓存(在 SqlMapConfig.xml 中配置)

Tips: 因为 cacheEnabled 的取值默认就为 true,所以这一步可以省略不配置。
②让当前的映射文件支持二级缓存(在映射配置文件中配置)

③让当前的操作支持二级缓存(在select标签中配置)

Tips:将 UserDao.xml 映射文件中的select标签中设置 useCache=”true”代表当前这个 statement 要使用二级缓存
Tips2::针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。
xml开发(复杂Sql语句)
①创建maven项目,建表
②建好各层结构
(com.hong.springcloud.dao(controller,service,entity。。。))
在entity中建实体类
在dao中写方法接口

③resource中application.yaml配置基本属性
mapper/mapper.xml中编写接口具体实现(如下举个例子)

④启动类加@MapperScan注解
⑤测试
本文全面解析MyBatis框架,涵盖环境搭建、动态SQL、延迟加载、缓存机制等内容,深入探讨ORM思想及其在MyBatis中的应用。
874

被折叠的 条评论
为什么被折叠?



