Mybatis入门——映射文件(二)

目录

参数传递

SQL映射文件的顶级元素

mapper

resultMap (结果映射)

自动映射

cache 

1 .  一级缓存

 2 .  二级缓存

SQL映射是Mybatis框架最具特色的部分,功能强大且简单。

参数传递

1. 直接传递:使用 @param注解 为参数命名

Mapper接口

/**
* 根据ID查询用户信息
* @param id
* @return
*/
User searchById(@Param("id") Integer id);

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.SysUserDemoMapper">
    <sql id="baseColumn">
        u.id,u.account,u.realName,u.roleId,r.roleName,u.sex,(YEAR(NOW())-YEAR(u.birthday)) age,u.phone
    </sql>
    <select id="searchById" resultType="User">
        select
            <include refid="baseColumn"></include>
        from t_sysuser u,t_sysrole r
        where u.roleId=r.id
        and u.id=#{id}
    </select>
</mapper>

测试类

package mapper;
 
import pojo.SysUser;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.junit.Test;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
 
 
public class SysUserMapperTest {
    private Logger logger=Logger.getLogger(SysUserMapperTest.class);
 
    @Test
    public void searchById()throws Exception {
        //1. 读取MyBatis框架的核心配置文件
        String resource= "mybatis-config.xml";
        //获取对mybatis-config.xml的输入流
        InputStream is= Resources.getResourceAsStream(resource);
        //2.使用SqlSessionFactoryBuilder 读取配置文件并构建
        //   SqlSessionFactory实例
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
        //3. 执行
        SqlSession sqlSession = factory.openSession();
        //4. 创建UserMapper接口实例,调用其方法执行相关的Sql语句
        User user = sqlSession.getMapper(SysUserDemoMapper.class).searchById(1);
        System.out.println(user .toString());
        //5. 关闭SqlSession
        sqlSession.close();
    }
}

2. 对象传递

/**
* 新增用户信息
* @param user
* @return
*/
int addUser(User user);
<insert id="addUser" parameterType="User">
     INSERT INTO `t_sysuser`
     (`account`, `realName`, `sex`, `birthday`, `phone`, `roleId`)
     VALUES (#{account}, #{realName}, #{sex}, #{birthday},#{phone}, #{roleId});
</insert>

3. Map集合传递:key--value的形式。key的值要跟#{}里面的属性一样

/**
* 根据ID查询用户信息
* @param map
* @return
*/
User searchByIdMap(Map<String,Integer> map);
<select id="searchByIdMap" resultType="User" parameterType="java.util.Map">
    select
    <include refid="baseColumn"></include>
        from t_sysuser u,t_sysrole r
        where u.roleId=r.id
        and u.id=#{id}
</select>

SQL映射文件的顶级元素

  • mapper:SQL映射文件的根元素,有一个namespace属性
  • cache:配置给定命名空间的缓存
  • cache-ref:从其他命名空间引用缓存配置
  • resultMap:用来描述数据库结果集和对象的对应关系
  • sql:可以重用的SQL块,也可以被其他语句引用
  • insert:映射插入语句
  • update:映射更新语句
  • delete:映射删除语句
  • select:映射查询语句

mapper

     <mapper>是SQL映射文件的根元素,它用于指定命名空间和其他配置信息。

常见的属性:

  •  namespace:指定Mapper接口的全限定名,用于与Mapper接口进行关联。
  • mapUnderscoreToCamelCase:可选属性,用于指定是否将数据库列名的下划线格式转换为                                                      Java属性的驼峰命名格式。
  • autoMapping:可选属性,用于指定是否开启延迟加载。
  • lazyLoadingEnabled:可选属性,用于指定是否开启延迟加载
  • cache:可选属性,用于指定Mapper的二级缓存。

resultMap (结果映射)

       用于将查询结果映射到Java对象或者其他数据结构中。(一般用于多张表)

resultMap元素的属性

  • id:resultMap的唯一标识
  • type:映射的结果类型

resultMap元素的子元素

  • id:指定和数据表主键字段对应的标识属性 设置此项可提高MyBatis性能
  • result:指定结果集字段和实体类属性的映射关系
  • association:映射“多对一”或“一对一”关系
  • collection:映射“一对多”关系
<resultMap id="userSysRole" type="SysUser">
    <!--主键的映射关系 column:列名(数据库列名) property:属性名(与实体类类名一致)-->
    <id property="id" column="id"></id>
    <result property="realName" column="realName"></result>
    <association property="sysRole" javaType="SysRole">
        <id property="id" column="rid"></id>
        <result property="roleName" column="roleName"></result>
    </association>
</resultMap>
<select id="getUserListByRoleId" parameterType="java.lang.Integer" resultMap="userSysRole">
    select u.*,r.id as rid,r.roleName from t_sysuser u,t_sysrole r
        where u.roleId=#{roleId} and u.roleId = r.id
</select>
package mapper;
 
import pojo.SysUser;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.junit.Test;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
 
 
public class SysUserMapperTest {
    private Logger logger=Logger.getLogger(SysUserMapperTest.class);
 
    @Test
    public void searchById()throws Exception {
        //1. 读取MyBatis框架的核心配置文件
        String resource= "mybatis-config.xml";
        //获取对mybatis-config.xml的输入流
        InputStream is= Resources.getResourceAsStream(resource);
        //2.使用SqlSessionFactoryBuilder 读取配置文件并构建
        //   SqlSessionFactory实例
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
        //3. 执行
        SqlSession sqlSession = factory.openSession();
        //4. 创建UserMapper接口实例,调用其方法执行相关的Sql语句
        List<SysUser> userList=sqlSession.getMapper(SysUserMapper.class).getUserListByRoleId(2);
        if (userList!=null) {
            for (SysUser users:userList) {
                logger.debug("userId:"+users.getId()
                    +",and realName:"+users.getRealName()
                    +",and roleId:"+users.getSysRole().getId()
                    +",and roleName:"+users.getSysRole().getRoleName());
            }
        }
        //5. 关闭SqlSession
        sqlSession.close();
    }
}

自动映射

   用于将查询结果自动映射到实体类对象中的属性上,而无需手动配置每个属性的映射关系。

<settings>
	<setting  name="autoMappingBehavior" value="FULL" />
</settings>

配置完之后则自动将查询结果的值映射到对应的属性上。

cache 

         是指将查询结果缓存在内存中,以提高查询性能的机制。

Mybatis提供了两级存换:①一级缓存 (本地缓存)

                                         ②二级缓存 (全局缓存)

1 .  一级缓存

         一级缓存是默认开启的,它是SqlSession级别的缓存,也就是说在同一个SqlSession中。在同一个方法中,如果执行了相同的查询语句,那么第二次及以后得查询会直接从缓存中获取结果,而不是去数据库查。当SqlSession关闭或者提交了事物,缓存内容就会被清空。

    @Test
    public void getUserList()throws Exception {
        SqlSession sqlSession = getSqlSession();
        //4. 创建SysUserMapper接口实例,调用其方法执行相关的Sql语句
        List<SysUser> userList =sqlSession.getMapper(SysUserMapper.class).getUserList();
        List<SysUser> userList2 =sqlSession.getMapper(SysUserMapper.class).getUserList();
        System.out.println(userList.toString());
        System.out.print(userList2.toString());
        //5. 关闭SqlSession
        sqlSession.close();
     }


     /**
     * 封装方法
     * @return
     * @throws IOException
     */
    private static SqlSession getSqlSession() throws IOException {
        //1. 读取MyBatis框架的核心配置文件
        String resource= "mybatis-config.xml";
        //获取对mybatis-config.xml的输入流
        InputStream is= Resources.getResourceAsStream(resource);
        //2.使用SqlSessionFactoryBuilder 读取配置文件并构建
        //   SqlSessionFactory实例
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
        //3. 执行
        return factory.openSession();
    }

 注意:一旦关闭SqlSession或者提交事物,缓存内容就会被清空了!!

 2 .  二级缓存

          二级缓存是全局缓存,它可以被多个SqlSession共享。当多个SqlSession执行相同的查询,第一个SqlSession会将查询结果缓存到二级缓存中,后续的SqlSession可以直接从缓存中获取结果。如果要使用二级缓存,则需要开启二级缓存。

  • 开启二级缓存的条件也是比较简单,通过直接在 MyBatis 配置文件中通过
<!-- 通知 MyBatis 框架开启二级缓存 -->
<settings>
  <setting name="cacheEnabled" value="true"/>
</settings>
  •  在SQL映射文件中设置缓存,默认情况下是没有开启缓存的
<cache eviction="FIFO" flushInterval="60000" 
        size="512" readOnly="true" />
  • flushinterval 缓存刷新间隔,缓存多长时间刷新一次,默认不清空,设置一个毫秒值

  • readOnly: 是否只读;true 只读,MyBatis 认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。MyBatis 为了加快获取数据,直接就会将数据在缓存中的引用交给用户。不安全,速度快。读写(默认):MyBatis 觉得数据可能会被修改

  • size : 缓存存放多少个元素

  • type: 指定自定义缓存的全类名(实现Cache 接口即可)

  • blocking: 若缓存中找不到对应的key,是否会一直blocking,直到有对应的数据进入缓存。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值