学习Mybatis的第二天

1.如何实现一条单一条件查询?

如果仅仅是传入一个简单数据类型的查询条件,如一个基本数据类型或其他包装类型,或一个String类型等等,Mybatis框架的处理方式也非常的简单。以实现根据用户的真实姓名模糊匹配来查询用户信息为例子。

(1)在SysUserMapper 接口中添加员工查询方法
/**
 * 根据用户的真实姓名模糊匹配查询用户,参数realName 为需要传递给SQL语句的查询条件
 */
public List<SysUser> getUserByRealName(String realName);
(2)在SysUserMapper.xml 中添加SQL映射:
<select id="getUserByRealName" resultType="sysuser" parameterType="java.lang.String">
    select * from sys_user where realName like concat('%',#{param},'%')
</select>
(3)在测试类中添加测试方法
// 省略创建SqlSession的代码
List(SysUser) userList=sqlSession.getMapper(SysUserMapper.class).getUserByRealName("李");

2.Mybatis 框架内建的部分别名与java数据类型的映射关系,类型别名只是 Java 类型的较短名称。它仅与 XML 配置相关,并且只是为了减少完全限定类名的冗余类型而存在。例如:

<typeAliases>
    <!-- <typeAlias type="真实路径" alias="别名"></typeAlias> -->
	<typeAlias type="com.ffyc.mybatisPro.model.Grade" alias="Grade"></typeAlias>
	<typeAlias type="com.ffyc.mybatisPro.model.Student" alias="Student"></typeAlias>
</typeAliases>

3.实现多条件查询

 (1)将查条件封装成java对象作为入参,在SysUserMapper接口中添加查询方法,使用SysUser类作为参数,使用属性realName和roleId封装两个查询代码
/**
 *查询用户表
 *@Param SysUser
 */
public List<SysUser> getUserListByPojo (SysUser sysuser);
(2)在SysUserMapper.xml 中添加SQL语句映射,使用SysUser作为参数,绑定realName和roleId属性获取查询条件。
<select id="getUserListByPojo" resultType="sysuser" parameterType="sysuser">
    select * from t_sys_suer where realName like concat('%',#{realName},'%') and roleId=#            
    {roleId}
</select>
(3)测试使用SysUser类型提供查询条件
//省略创建SqlSession的代码
SysUser sysuser=new SysUser();
user.setRealName("李");
user.setRoleId(3);
List<SysUser> userList=sqlsession.getMapper(sysUserMapper.class).getUserListByPojo(user);

4.将查询条件封装成Map对象作为入参

(1)在SysUserMapper接口中添加查询方法,使用SysUser类作为参数
/**
 *查询用户列表
 *@param Map
 */
public List<SysUser> getUserLimit(Map map);
(2)在SysUserMapper.xml 中添加SQL语句映射,使用Map作为参数,绑定key为rName和rId的键值对(key-value)获取查询条件
<select id="getUserLimit" resultType="pojo.SysUser" parameterType="java.util.Map">
        select * from t_sys_user where realName like concat('%',#{realName },'%')
        and roleId=#{roleId}
</select>
(3)测试使用SysUser类型提供查询条件
        //省略s、SqlSession的代码
        Map map=new HashMap();
        map.put("realName","赵");
        map.put("rId",3);
        val userLimit = sqlSession.getMapper(SysUserMapper.class).getUserLimit2(0,3);
        System.out.println(userLimit.toString());

5.使用@Param注解实现分页查询

(1)在SysUserMapper接口中添加查询方法,使用@Param注解为参数命名
 //分页查询 注解版
    public List<SysUser> getUserLimit2(@Param("pageIndex")Integer pageIndex,@Param("pageSize") Integer pageSize);
(2)在SysUserMapper.xml 中添加SQL语句映射,使用@Param注解指定的名称绑定查询条件
 <select id="getUserLimit2" resultType="pojo.SysUser" parameterType="java.util.Map">
        select
            <include refid="base_column"></include>
        from
            t_sysuser limit #{pageIndex},#{pageSize}
    </select>
(3)测试使用SysUser类型提供查询条件
 //省略SqlSession
 val userLimit = sqlSession.getMapper(SysUserMapper.class).getUserLimit2(0,3);
 System.out.println(userLimit.toString());

5.什么是Mybatis的结果映射?

Mybatis框架的结果映射是指将数据库查询结果映射到Java对象的过程。当使用Mybatis进行数据库查询操作时,查询结果通常是一组记录,每条记录包含多个字段。为了方便数据操作和处理,Mybatis提供了结果映射的功能,将查询结果转化为Java对象,使得我们可以通过面向对象的方式来处理数据。

结果映射可以将数据库查询结果的列与Java对象的属性进行对应,将每个字段的值赋给相应的属性。这样,在查询结果中的每一行都会被映射成一个Java对象,并且对象的属性值会与查询结果的列值保持一致。通过结果映射,我们可以方便地使用Java对象来表示和操作查询结果,而无需直接处理底层的ResultSet。

Mybatis支持多种类型的结果映射,包括基本类型映射、简单对象映射、关联对象映射、集合映射以及枚举映射等。通过配置文件或注解,我们可以指定如何进行结果映射,定义查询结果与Java对象之间的映射规则。

总结来说,Mybatis框架的结果映射是将数据库查询结果映射到Java对象的过程,使得我们可以通过Java对象来方便地处理和操作查询结果。这种结果映射的方式使得数据操作更加灵活和便捷。

怎么使用?

在SysUserMapper.xml 中,添加sql标签,id属性是名字,里面存放要查询的字段

 <sql id="base_column">
        `id`, `account`, `realName`, `password`,
        `sex`, `birthday`, `phone`, `address`, `roleId`,
        `createdUserId`, `createdTime`, `updatedUserId`, `updatedTime`,
        `idPicPath`, `workPicPath`, `islock`
    </sql>

写查询语句的时候将*变成 <include refid="base_column"></include> ,refid是sql标签的id

<select id="getUserByName" parameterType="java.lang.String" resultType="pojo.SysUser">
        select
            <include refid="base_column"></include>
        from
            t_sysuser
        where
              realName=#{realName}
</select>

6.使用resultMap元素实现嵌套结果映射,实现两表联查

resultMap 元素的属性
u id resultMap 的唯一标识
u type 映射的结果类型
resultMap 元素的子元素
id 指定和数据表主键字段对应的标识属性
设置此项可提高 MyBatis 性能
result 指定结果集字段和实体类属性的映射关系
association :映射“多对一”或“一对一”关系
collection :映射“一对多” 关系
(1)association
association
复杂的关联类型 映射一个嵌套 JavaBean 属性
多对 一对一
属性
property :用来 映射查询结果子集 实体 属性
javaType :完整 Java 类名或者别名
resultMap 引用外部 resultMap
元素
id
r esult
(2)collection    
复杂类型集合 映射嵌套 结果集到一个 列表
一对多
属性
property :实体类中用来映射查询结果子集的集合属性
ofType 集合中元素的类型,完整 Java 类名或者 别名
resultMap :引用外部 resultMap
元素
id
result
(3)Mybatis自动映射

                        自动映射的前提:属性名与字段名一致。在mybatis-config.xml中添加

 (4)在SysUserMapper接口中添加查询方法
//两表连查询
    public List<SysUser> getUserRoleMap(Map map);
(5)在SysUserMapper.xml 中添加SQL语句映射
<!--两表查询-->
    <!--resultMap id属性随便命名不需要在接口定义方法-->
    <resultMap id="getUserRole" type="pojo.SysUser">
        <id property="id" column="id"></id>

        <!-- 一对多的映射 -->
        <collection property="sysRole" ofType="pojo.SysRole">
            <id property="id" column="id"></id>
        </collection>
    </resultMap>
    
    <select id="getUserRoleMap" resultMap="getUserRole" parameterType="java.util.Map">
        select
               account,realName,password,sex,birthday,phone,roleName
        from
             t_sysuser,t_sysrole
        where
              t_sysuser.roleId=t_sysrole.id LIMIT #{pageIndex},#{pageSize}
    </select>
(6)在SysUserMapper.xml 中添加SQL语句映射
List<SysUser> userList=null;
        Map map=new HashMap();
        map.put("pageIndex",0);
        map.put("pageSize",3);

        SqlSession sqlSession=MyBatisUtil.createSqlSession();
        userList = sqlSession.getMapper(SysUserMapper.class).getUserRoleMap(map);
       if (userList!=null){
           for (SysUser sysUser:userList){
               String sex="";
               if (sysUser.getSex()==1){
                    sex="男";
               }else {
                   sex="女";
               }
               System.out.println("账号:"+sysUser.getAccount()+"  姓名:"+sysUser.getRealName()+"  角色:"+sysUser.getRoleName()+"  性别:"+sex+"  年龄:"+sysUser.getAge1(sysUser.getBirthday())+"  密码:"+sysUser.getPhone());
           }
       }

7.Mybatis的缓存

在MyBatis中,缓存是一种提高性能的机制,它存储了已经查询过的结果,以便下次查询相同的数据时可以直接从缓存中获取,而不需要再访问数据库。

MyBatis的缓存分为两级:一级缓存和二级缓存。

  1. 一级缓存:

    • 一级缓存是MyBatis默认开启的缓存机制,它位于SqlSession的内部。
    • 当通过SqlSession执行查询语句时,查询的结果会被缓存在SqlSession的内部缓存中。
    • 在同一个SqlSession中连续执行相同的查询语句时,如果查询条件相同,则会直接从缓存中获取结果,而不会再次发送SQL到数据库。
    • 一级缓存的生命周期与SqlSession的生命周期相同,即在同一个SqlSession中进行操作时有效,当SqlSession关闭后,缓存也会被清空。
    • 局部,仅限于单个SqlSession里面
  2. 二级缓存:

    • 二级缓存是全局的缓存机制,它可以跨多个SqlSession共享缓存。
    • 开启二级缓存需要在MyBatis的配置文件中进行配置,并且需要在相应的映射文件中设置缓存策略。
    • 当SqlSession执行查询语句时,查询的结果会被缓存在二级缓存中。
    • 在不同的SqlSession中执行相同的查询语句时,如果查询条件相同并且命中了二级缓存,则会直接从缓存中获取结果。
    • 二级缓存的生命周期与整个应用程序的生命周期相同,在应用程序关闭之前都有效。
    • 注意,二级缓存是基于namespace级别的,即同一个namespace下的映射语句共享同一个缓存。
    • 全局

需要注意的是,缓存虽然可以提高查询性能,但也有可能导致数据不一致的问题。因此,在使用MyBatis的缓存机制时,需要根据实际情况合理配置缓存策略,并在更新、插入、删除等操作后及时清空或刷新缓存,以保证数据的一致性。

(1) 如何设置二级缓存?
        (1)建立一个线程
 (2)MyBatis的全局cache配置,在SQL映射文件中设置缓存,默认情况下是没有开启缓存的,在SQL映射文件配置支持cache后,如果需要对个别查询进行调整,可以单独设置

    <setting name="cacheEnabled" value="true" />

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />

<select id="selectAll" resultType="SysUser"        useCache="true">

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值