Data Access 之 MyBatis(三) - SQL Mapping XML(Part C)(下)

简介: Data Access 之 MyBatis(三) - SQL Mapping XML(Part C)

新建SQL映射文件lock.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="com.citi.dao.LockDao">
    <select id="getLockById" resultMap="mylock">
        SELECT l.id,l.lockName,k.id kid, k.keyname,k.lockid
            FROM t_lock l
            LEFT JOIN t_key k ON l.id = k.lockid
            WHERE l.id=#{id}
    </select>
    <resultMap id="mylock" type="com.citi.entity.Lock">
        <id property="id" column="id"></id>
        <result property="lockName" column="lockName"></result>
        <collection property="keyList" ofType="com.citi.entity.Key">
            <!--column是起的别名,如果没起别名,就和数据库列字段一致-->
            <id property="id" column="kid"></id>
            <result property="keyName" column="keyName"></result>
        </collection>
    </resultMap>
</mapper>
复制代码
  • collection:复杂类型的集合
  • ofType:指定集合里面元素的类型

将lock.xml注册到MyBatis全局配置文件中

<mappers>
    <mapper resource="mappers/employee.xml"/>
    <mapper resource="mappers/cat.xml"/>
    <mapper resource="mappers/key.xml"/>
    <mapper resource="mappers/lock.xml"/>
</mappers>
复制代码

新建测试类

public class LockDaoTest {
    SqlSessionFactory sqlSessionFactory = null;
    SqlSession openSession = null;
    @Before
    public void setUp() throws Exception {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        openSession = sqlSessionFactory.openSession();
    }
    @Test
    public void getLockById() {
        LockDao lockDao = openSession.getMapper(LockDao.class);
        Lock lock = lockDao.getLockById(3);
        System.out.println(lock);
        List<Key> keyList = lock.getKeyList();
        for (Key key : keyList) {
            System.out.println("Key:" + key);
        }
    }
}
复制代码

执行测试

dd0ed556ef5f416381463267e89b4bc7_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

联合查询较为繁琐,使用分步查询也可以完成;先查出Key,在根据Key的信息到t_lock表中查出锁的信息

分步查询 Key -> Lock

在KeyDao和LockDao中分别增加一个查询方法

Lock getLockByIdSimplely(Integer id);
复制代码
Key getKeyByIdSimplely(Integer id);
复制代码

在lock.xml映射文件中增加SQL语句

<select id="getLockByIdSimplely" resultType="com.citi.entity.Cat">
    select * from t_lock where id = #{id}
</select>
复制代码

在key.xml中完成分步查询

<select id="getKeyByIdSimplely" resultMap="mykeysimplely">
    select * from t_key where id = #{id}
</select>
<resultMap id="mykeysimplely" type="com.citi.entity.Key">
    <id property="id" column="id"></id>
    <result property="keyName" column="keyname"></result>
    <association property="lock"
                 select="com.citi.dao.LockDao.getLockByIdSimplely"
                 column="lockid">
    </association>
</resultMap>
复制代码
  • property:指定封装哪个属性
  • select:指定一个查询SQL的唯一标识,MyBatis自动调用指定的SQL将查询的结果结果封装到指定的属性
  • colume:指定将哪一列数据传递过去

在KeyDaoTest中增加getKeyByIdSimplely方法的测试代码

@Test
public void getKeyByIdSimplely() {
    KeyDao keyDao = openSession.getMapper(KeyDao.class);
    Key key = keyDao.getKeyByIdSimplely(1);
    System.out.println(key);
}
复制代码

执行测试

004e6b40be7947d0877df4e5b96c232b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

根据控制台打印的信息可以看出分步查询其实就是分别执行了两条SQL,先获取Key,在获取Lock;每次查询Key都要数据库执行两条SQL严重影响性能,而且并不是每次查询Key的时候也需要锁的信息,因此对查询锁信息可以使用按需加载,需要的时候再执行查锁。

在MyBatis全局配置文件中配置开启延迟加载和属性按需加载

<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="true"/>
</settings>
复制代码

将打印key的代码注释(不注释会调用Key的toString方法导致懒加载失效),再次执行测试

858334fe062b411b8bbec9efcd0babcb_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

控制台只会打印出一条SQL语句,也就是后台只执行了一条SQL语句

修改测试代码,获取Lock

@Test
public void getKeyByIdSimplely() {
    KeyDao keyDao = openSession.getMapper(KeyDao.class);
    Key key = keyDao.getKeyByIdSimplely(1);
    // System.out.println(key);
    String lockName = key.getLock().getLockName();
    System.out.println(lockName);
}
复制代码

再次测试

5421111bf6dc4b2892f25dc06e4ff13c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

覆盖全局的延迟加载配置,在association标签中增加fetchType="eager",注释掉获取锁的代码,再次执行测试

e51efa0850b04f429c4d25f033c26129_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

分步查询 Lock -> Key

分别在LockDao、KeyDao中新增方法

Lock getLockByIdStep(Integer id);
复制代码
List<Key> getKeysByLockId(Integer id);
复制代码

在key.xml中新增查询key的SQL语句

<select id="getKeysByLockId" resultType="com.citi.entity.Key">
    select * from t_key where lockid = #{id}
</select>
复制代码

在lock.xml中新增getLockByIdStep方法的映射

<select id="getLockByIdStep" resultMap="mylockstep">
    select * from t_lock where id = #{id}
</select>
<resultMap id="mylockstep" type="com.citi.entity.Lock">
    <id property="id" column="id"></id>
    <result property="lockName" column="lockName"></result>
    <collection property="keyList"
                select="com.citi.dao.KeyDao.getKeysByLockId"
                column="id">
    </collection>
</resultMap>
复制代码

增加测试方法

@Test
public void getLockByIdStep() {
    LockDao lockDao = openSession.getMapper(LockDao.class);
    Lock lock = lockDao.getLockByIdStep(3);
    System.out.println(lock);
    List<Key> keyList = lock.getKeyList();
    for (Key key : keyList) {
        System.out.println("Key:" + key);
    }
}
复制代码

执行测试

903990ba71ea4da4a7a7b4906df8f706_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

reslutMap标签中的 column属性是用来传递select属性指定的查询方法的参数,如果该查询方法有多个参数则可以使用{key1=value1,key2=value2}的方式来传递数据。

实际应用中更推荐使用连接查询的方式而非分步查询,相比较会减少对数据库的压力


相关文章
|
3月前
|
XML SQL 数据格式
XML动态sql查询当前时间之前的信息报错
XML动态sql查询当前时间之前的信息报错
53 2
|
6天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
29天前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
30 10
|
2月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
1月前
|
SQL 存储 机器学习/深度学习
将 AWS Data Lake 和 S3 与 SQL Server 结合使用
将 AWS Data Lake 和 S3 与 SQL Server 结合使用
46 0
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
44 1
|
4月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
87 3
|
4月前
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
86 7
|
5月前
|
SQL XML 数据库
后端数据库开发高级之通过在xml文件中映射实现动态SQL
后端数据库开发高级之通过在xml文件中映射实现动态SQL
50 3
|
5月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
70 3

热门文章

最新文章

下一篇
无影云桌面