【MyBatis】第四章

5 篇文章 0 订阅
4 篇文章 0 订阅

第四章、MyBatis的关联映射和缓存机制

在实际开发中,对数据库的操作常常会涉及到多张表,针对多表之间的操作,
MyBatis提供了关联映射,通过关联映射可以很好地处理
表与表、对象与对象之间的关联关系。
实际开发中经常需要合理地利用MyBatis缓存来加快数据库查询,
进而有效地提升数据库性能。
在关系型数据库中,表与表之间存在着三种关联映射关系,
分别为一对一关系、一对多关系和多对多关系。

一、映射关系

java对象通过类表达表之间关系

数据表之间的关系实质上描述的是数据之间的关系,除了数据表,
在Java中,还可以通过对象来描述数据之间的关系。
通过Java对象描述数据之间的关系,

其实就是使对象的属性与另一个对象的属性相互关联。
在这里插入图片描述

二、一对一关系

    在MyBatis中,通过association元素来处理一对一关联关系。
    association元素提供了一系列属性用于维护数据表之间的关系。

在这里插入图片描述
association元素是resultMap元素的子元素,它有两种配置方式,

  • 嵌套查询方式
  • 嵌套结果方式

下面对这两种配置方式分别进行介绍。

嵌套查询是指通过执行另外一条SQL映射语句来返回预期的复杂类型。
在使用MyBatis嵌套查询方式进行MyBatis关联映射查询时,
使用MyBatis的延迟加载在一定程度上可以降低运行消耗并提高查询效率。
MyBatis默认没有开启延迟加载,需要在mybatis-config.xml中的<settings>元素内进行配置。
<settings>
    <!-- 打开延迟加载的开关 -->  
    <setting name="lazyLoadingEnabled" value="true" />  
    <!-- 将积极加载改为消息加载,即按需加载 -->  
    <setting name="aggressiveLazyLoading" value="false"/>  
</settings>

嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。 

例子
personMapper.xml

<select id="findPersonById" parameterType="Integer"
            resultMap="IdCardWithPersonResult">
   			SELECT * from tb_person where id=#{id}
</select>
    <resultMap type="Person" id="IdCardWithPersonResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <!-- 一对一:association使用select属性引入另外一条SQL语句 -->
        <association property="card" column="card_id" javaType="IdCard"
                     select="mapper.IdCardMapper.findCodeById"/>
    </resultMap>
  

IDCardMapper.xml

<mapper namespace="mapper.IdCardMapper">
    <!-- 根据id查询证件信息 -->
    <select id="findCodeById" parameterType="Integer" resultType="IdCard">
   		  SELECT * from tb_idcard where id=#{id}
   	  </select>
</mapper>

测试类

@Test
    public void findPersonByIdTest() {
        // 1、通过工具类获取SqlSession对象
        SqlSession session = MyBatisUtils.getSession();
        // 2.使用MyBatis嵌套查询的方式查询id为1的人的信息
        Person person = session.selectOne("mapper."
                + "PersonMapper.findPersonById", 1);
        // 3、输出查询结果信息
        System.out.println(person);
        // 4、关闭SqlSession
        session.close();
    }

三、一对多关系

能够使用<collection>元素处理一对多关联关系
在MyBatis中,通过<collection>元素来处理一对多关联关系。
<collection>元素的属性大部分与<association>元素相同,
但其还包含一个特殊属性ofType。ofType属性与javaType属性对应,
它用于指定实体类对象中集合类属性所包含的元素的类型,
<collection>元素是<resultMap>元素的子元素

四、多对多关系

在数据库中,在两个表有多对多关系,使用中间表,来辅助建立多对多关系。

五、Mybatis缓存

1.一级缓存

MyBatis的一级缓存是SqlSession级别的缓存。
如果同一个SqlSession对象多次执行完全相同的SQL语句时,
在第一次执行完成后,MyBatis会将查询结果写入到一级缓存中,
此后,如果程序没有执行插入、更新、删除操作,
当第二次执行相同的查询语句时,MyBatis会直接读取一级缓存中的数据,
而不用再去数据库查询,从而提高了数据库的查询效率。
程序对数据库执行了插入、更新、删除操作,
MyBatis会清空一级缓存中的内容以防止程序误读。

2.二级缓存

MyBatis的二级缓存需要手动开启

相同的Mapper类,相同的SQL语句,如果SqlSession不同,则两个SqlSession查询数据库时,会查询数据库两次,这样也会降低数据库的查询效率。为了解决这个问题,就需要用到MyBatis的二级缓存。MyBatis的二级缓存是Mapper级别的缓存,与一级缓存相比,二级缓存的范围更大,多个SqlSession可以共用二级缓存,并且二级缓存可以自定义缓存资源。

多个SqlSession对象使用同一个Mapper的相同查询语句去操作数据库,
在第一个SqlSession对象执行完后,MyBatis会将查询结果写入二级缓存,
此后,如果程序没有执行插入、更新、删除操作,
当第二个SqlSession对象执行相同的查询语句时,MyBatis会直接读取二级缓存中的数据。

在这里插入图片描述

(1)映射文件中所有select语句将会被缓存。
(2)映射文件中的所有insert、update和delete语句都会刷新缓存。
(3)缓存会使用LRU算法回收。
(4)没有刷新间隔,缓存不会以任何时间顺序来刷新。
(5)缓存会存储列表集合或对象的1024个引用。
(6)缓存是可读/可写的缓存,这意味着对象检索不是共享的,
缓存可以安全的被调用者修改,而不干扰其他调用者或线程所做的潜在修改。 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现关联数据的查询 mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加一条,其实大家可以看官方的教程更好些:http://mybatis.github.io/mybatis-3/,而且如果英文不是很好的那就看中文的:http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html) 写在这个系列前面的话: 以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活。性能也比hibernate好。而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这个ORM工具。所以在此重新温习了一下 mybatis, 因此就有了这个系列的 mybatis 教程. 什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到 sessionfactory. 2. 由sessionfactory 产生 session 3. 在session 中完成对数据的增删改查和事务提交等. 4. 在用完之后关闭session 。 5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 mybatis开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包。这些软件工具均可以到各自的官方网站上下载。 首先建立一个名字为 MyBaits 的 dynamic web project 1. 现阶段,你可以直接建立java 工程,但一般都是开发web项目,这个系列教程最后也是web的,所以一开始就建立web工程。 2. 将 mybatis-3.2.0-SNAPSHOT.jar,mysql-connector-java-5.1.22-bin.jar 拷贝到 web工程的lib目录. 3. 创建mysql 测试数据库和用户表,注意,这里采用的是 utf-8 编码 创建用户表,并插入一条测试数据 程序代码 程序代码 Create TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `userAge` int(11) DEFAULT NULL, `userAddress` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Insert INTO `user` VALUES ('1', 'summer', '100', 'shanghai,pudong'

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值