MyBatis真正的特色在于SQL映射语句,功能强大,使用简单
SQL映射文件的几个顶级元素
mapper --SQL映射文件的根元素,有一个namespace属性
cache --配置给定命名空间的缓存
cache-ref --从其他命名空间引用缓存配置
resultMap -- 用来描述数据库结果集和对象的对应关系
sql --可以重用的SQL块,也可以被其他语句引用
insert --映射插入语句
update --映射更新语句
delete --映射删除语句
select --映射查询语句
mapper
mapper指的是映射器,是定义数据库操作的接口,用于执行与数据库的交互,并将Java对象与数据库表之间进行映射。
namespace属性 区别不同的mapper
namespace和子元素的id联合保证唯一
绑定DAO接口
namespace的命名必须跟某个接口同名
接口中的方法与映射文件中的SQl语句id一一对应
常见的属性:
1.select : 用于标注查询操作的方法
2.insert : 用于标注插入操作的方法
3.update : 用于标注更新操作的方法
4.delete : 用于标注删除操作的方法
5.Results :用于定义结果集映射规则
6.Result : 用于定义单个属性的映射规则
7.@Param:用于指定方法参数的名称
8.@Options:用于指定一些特殊的选项
MyBatis框架的条件查询
1.实现单一查询
select是元素MyBatis中最常用的元素之一
select元素有很多属性,可以详细配置每一条查询语句
a. id:命名空间中唯一的标识符,接口中的方法与映射文件中的SQL语句id一一对应
b. parameterType:传入SQL语句的参数类型
c.resultType:SQL语句返回值类型的完整类名或别名
实现:
先在SysUserMapper接口中添加查询方法
在SysUserMapper.xml中添加SQL语句映射
<!--根据用户的真实姓名进行模糊查询-->
<select id="getUsersByRealName" resultType="pojo.SysUser" parameterType="java.lang.String">
SELECT * from t_sysuser where realName like CONCAT ('%', #{realName}, '%')
</select>
在测试类中添加测试方法
public void getUsersByRealName() throws IOException{
SqlSession sqlSession=null;
try {
sqlSession=getSqlSession(sqlSession);
List<SysUser>userList=sqlSession.getMapper(SysUserMapper.class).getUsersByRealName("赵");
System.out.println(userList.toString());
}finally {
sqlSession.close();
}
}
然后我们就能得到运行的结果,其中select中使用了一个新的属性——parameterType,它表示为SQL语句传入的参数的类型,使用完全限定名或别名,支持基础数据类型和复杂数据类型。
2.实现多条件查询
有三种入参方法,根据自己的需求来选择使用那个方法
1.将查询条件封装成Java对象作为入参
先在SysUserMapper接口中添加查询方法,使用SysUser类作为参数,使用属性realName和roleId封装两个条件
在SysUserMapper.xml中添加SQL语句映射
<select id="getUserListByPojo" resultType="pojo.SysUser" parameterType="pojo.SysUser">
select * from t_sysuser where realName like CONCAT ('%', #{realName}, '%')and roleId=#{roleId}
</select>
在测试类中添加测试方法
public void getUserListByPojo() throws IOException{
SqlSession sqlSession=null;
try {
sqlSession=getSqlSession(sqlSession);
SysUser sysUser=new SysUser();
sysUser.setRealName("赵");
sysUser.setRoleId(3);
List<SysUser>userList=sqlSession.getMapper(SysUserMapper.class).getUserListByPojo(sysUser);
System.out.println(userList.toString());
}finally {
sqlSession.close();
}
}
2.将查询条件封装成Map对象作为入参
<select id="getUserListByMap" resultType="pojo.SysUser" parameterType="map">
select * from t_sysuser where realName like CONCAT ('%' #{rName}, '%')and roleId=#{rId}
</select>
public void getUserListByMap() throws IOException{
SqlSession sqlSession=null;
try {
sqlSession=getSqlSession(sqlSession);
Map<String, Object>userMap=new HashMap<String,Object>();
userMap.put("rName","五");
userMap.put("rId",3);
List<SysUser>userList=sqlSession.getMapper(SysUserMapper.class).getUserListByMap(userMap);
System.out.println(userList.toString());
}finally {
sqlSession.close();
}
}
3.使用@param注解实现多参数入参
<select id="getUserListByParams" resultType="pojo.SysUser">
select * from t_sysuser where realName like CONCAT ('%' #{realName} '%')and roleId=#{roleId}
</select>
public void getUserListByParams() throws IOException{
SqlSession sqlSession=null;
try {
sqlSession=getSqlSession(sqlSession);
List<SysUser>userList=sqlSession.getMapper(SysUserMapper.class).getUserListByParams("星",3);
System.out.println(userList.toString());
}finally {
sqlSession.close();
}
}
MyBatis框架的结果映射
1.使用resultMap元素自定义结果映射
resultMap元素的属性
id:resultMap的唯一标识
type:映射的结果类型
resultMap元素的子元素
id:指定和数据表主键字段对应的标识属性
设置此项可提高MyBatis性能
result:指定结果集字段和实体类属性的映射关系
association:映射“多对一”或“一对一”关系
collection:映射“一对多”关系
2.嵌套结果映射
1.association
多对一”或“一对一”
association元素用来处理“has-one”类型的关系,复杂的关联类型,映射一个嵌套JavaBean属性
属性:
a. property:用来映射查询结果子集的实体属性
b. javaType:完整Java类名或者别名
c. resultMap:引用外部resultMap
子元素:
a. id
b. result
2.collection
是“一对多”关系,即实体类内部嵌套的是一个集合类型的属性
属性:
a. property:实体类中用来映射查询结果子集的集合属性
b. ofType:集合中元素的类型,完整Java类名或者别名
c. resultMap:引用外部resultMap
子元素:
a. id
b. result
resultType与resultMap
resultType:直接表示返回类型,适用于比较简单的数据封装场景
resultMap:是对外部resultMap的引用,能够处理结果集字段名与实体类属性名不一致,或者需要对连接查询结果使用嵌套映射等较为复杂的问题
二者本质上都是基于Map数据结构,不能同时使用
MyBatis框架的缓存
一级缓存
一级缓存是基于PerpetualCache的HashMap本地缓存,默认是SqlSession级别的缓存,在SqlSession的一个生命周期内有效。当SqlSession关闭后,该SqlSession中所有的一级缓存会被清空。MyBatis框架的一级缓存默认是开启的
二级缓存
二级缓存是SqlSessionFactory级别的,其作用域超出了一个SqlSession的范围,缓存中的数据可以被所有SqlSession共享。MyBatis框架的二级缓存默认是关闭的,使用时需要在Mybatis框架的核心配置文件中设置开启
二级缓存的使用方法
MyBatis的全局cache配置
在SQL映射文件中设置缓存,默认情况下是没有开启缓存的
在SQL映射文件配置支持cache后,如果需要对个别查询进行调整,可以单独设置
cache元素中各种属性的作用:
a. eviction: 选择缓存回收策略,主要包括以下几种策略。
LRU:这是默认选项,最近最少回收.移除最长时间不被使用的缓存对象。
FIFO: 先进先出,按照对象进入缓存的顺序来移除它们。
SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象。
WEAK:弱引用,更积极地移除基于垃圾回收器和弱引用规则的对象。
b. flushInterval: 设定缓存刷新间隔,以毫秒(ms) 为单位设定缓存多长时间自动刷新一次,默认
不自动刷新。
c. size:设定缓存中最多存放多少个对象,默认是1024。
d. readOnly: 设定缓存数据是否只读。默认是false, 表示缓存数据会用于读写操作,MyBatis框
架会返回缓存对象的副本以避免脏读: true 表示缓存数据只用于读操作,MyBatis 框架会为所
有从缓存中获取数据的操作返回缓存对象的相同实例,以获得更好的性能。
以上就是我们的一个SQl映射文件详解。