MyBatis框架学习

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

一、什么是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注解

⑤测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值