mybatis (高级映射 缓存 延迟加载)

Posted 温一壶月光当茶饮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis (高级映射 缓存 延迟加载)相关的知识,希望对你有一定的参考价值。

1     一对一查询映射的pojo

创建pojo包括 订单信息和用户信息,resultType才可以完成映射。

一个订单对应一个用户   因此在订单实体类中 我们应该加入一个用户属性  实体类如下:

public class Order {
    private Integer orid;
    private Integer userid;
    private Double ordermoney;
    private User user;
}

接下来  我们该在mapper.xml中利用(resultMap 和association   标签配置User)

 <resultMap type="com.login.entity.Order" id="userAndOrder">
		<result property="orid" column="order_id" />
		<result property="userid" column="user_id"/>
		<result property="ordermoney"  column="order_money"/>
		<association property="user" javaType="com.login.entity.User">
			<result property="username" column="user_name"/>
			<result property="userpwd" column="user_pwd"/>
			<result property="userphone" column="user_phone"/>
		
		</association>
		
</resultMap>


	
<select id="findOrderAndUserById" resultMap="userAndOrder">
	
	SELECT * FROM qxglxt.order orde JOIN qxglxt.user u ON orde.user_id=u.user_id where u.user_id=2
	
</select>  

测试:

public static void main(String[] args) {
		try {
			Reader reader=Resources.getResourceAsReader("SqlMapConfig.xml");
			SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
			SqlSession sqlSession=sqlSessionFactory.openSession();
			//订单
			OrderMapper  orderMapper=sqlSession.getMapper(OrderMapper.class);
			Order ord=orderMapper.findOrderById(1);

  

2     一对多查询映射的pojo

创建pojo包括 订单信息和用户信息,resultType才可以完成映射。

一个用户应该有多个订单  因此在用户实体类中我们应该加入List<Order> list 属性  实体类如下:

public class User {
	private String username;
	private String userpwd;
	private String userphone;
	private List<Order> list;
}

  接下来  我们该在mapper.xml中利用(resultMap 和connection   标签配置list)

    <resultMap type="com.login.entity.User" id="uid">
        
        <result property="username" column="user_name"/>
        <result property="userpwd" column="user_pwd"/>
        <result property="userphone" column="user_phone"/>
        
        <collection property="list" ofType="com.login.entity.Order">
            <result property="orid" column="order_id" />
            <result property="userid" column="user_id"/>
            <result property="ordermoney"  column="order_money"/>
        </collection>
        <!-- 名字不一样必须配置 名字一样 可以不配的  -->
    </resultMap>
    
    <select id="findUserById" resultMap="uid">
        select * from user where user_id=#{id}
    </select>
    

 

一对一的xml配置详细介绍:

 private User user;

 

 

 

一对多的xml配置详细介绍:

private List<Order> list;

 

 

3  延迟加载

  ·在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。

mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载。

 

例子 :  当查询一个订单时   如果没有点击订单详情的东西  就只需要将订单表中的信息显示出来   而订单详情的东西则等到调用的时候再显示   

首先应该配置核心xml  SqlMapConfig.xml  开启延迟加载

<!-- 全局配置参数 -->
	<settings>
		<!-- 延迟加载总开关 -->
		<setting name="lazyLoadingEnabled" value="true" />	
		<!-- 设置按需加载 如果存在多个懒加载 就是说 订单中有用户 用户中有地址 那么如果设置为true  就会在加载用户的时候吧用户的地址也给加载了  如果为false 就是使用到才加载 -->
		<setting name="aggressiveLazyLoading" value="false" />
	</settings>

  

 

需求:

查询订单及用户的信息,一对一查询。刚开始只查询订单信息,当需要用户时调用 Orders类中的getUser()方法执行延迟加载 ,向数据库发出sql。

     mapper.xml

    resultMap

 

   findUserByid   方法:     user_id (关联字段)

  <select id="findOrderAndUserById" resultMap="userAndOrder">

      SELECT * FROM qxglxt.order orde JOIN qxglxt.user u ON orde.user_id=u.user_id where u.user_id=2

   </select>

mapper.java

 

 

     测试代码

 

 

 

4  缓存 

 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存二级缓存的支持

  1. mybatis的一级缓存是指SqlSession。一级缓存的作用域是一个SqlSessionMybatis默认开启一级缓存

   2.Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存

  

如果把之前的sqlSession1.close()注释掉,那么同样会执行两次select*from users where user_id=2的SQL语句,因为sqlSession1没有关闭,一级缓存中的数据并没写入二级缓存,
而sqlSession2又无法访问sqlSession1的一级缓存中的数据,所以会重新执行该查询语句。

  在执行增加,删除,修改操作后必须要使用commit提交事务  。

  3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。

 

以上是关于mybatis (高级映射 缓存 延迟加载)的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis延迟加载和查询缓存

Mybatis延迟加载缓存逆向工程

MyBatis结果映射与MyBatis缓存初探学习记录

mybatis-----的延迟加载-----缓存(一级缓存和二级缓存)

Mybatis学习动态加载一二级缓存

Mybatis学习笔记—高级映射,延迟加载