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 同样提供了一级缓存和二级缓存的支持
- mybatis的一级缓存是指SqlSession。一级缓存的作用域是一个SqlSession。Mybatis默认开启一级缓存。
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 (高级映射 缓存 延迟加载)的主要内容,如果未能解决你的问题,请参考以下文章