MyBatis Day2

本文深入探讨了MyBatis的SQL映射文件,包括mapper元素及其属性,以及条件查询的实现方式,如单一查询和多条件查询。此外,还详细介绍了resultMap元素用于自定义结果映射,以及MyBatis的一级和二级缓存机制,提供了如何配置和使用缓存的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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映射文件详解。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值