zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    MySQL数据库的安装与密码配置
    Java 的设计模式之一装饰者模式
    Java中Eclipse的使用
    Java的学习之路
    Java学习笔记(06)
    Java学习笔记(05)
    Java学习笔记(04)
    mysql出现2003——can't connect to mysql server on localhost(10061)
    抢票难。
    java 的接口起什么作用
  • 原文地址:https://www.cnblogs.com/MyJavaStudy/p/9272836.html
Copyright © 2011-2022 走看看