栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis学习指南 - 延迟加载&&缓存&&注解开发

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis学习指南 - 延迟加载&&缓存&&注解开发

文章目录

1. 延迟加载

1.1 基本概念1.2 延迟加载的优缺点1.3 延迟加载

1.3.1 局部懒加载1.3.2 全局懒加载 2. MyBatis缓存

2.1 基本概念

2.1.1 应用场景 2.2 一级缓存

2.2.1 基本概念2.2.2 缓存的使用2.2.3 清除缓存 2.3 二级缓存

2.3.1 基本概念2.3.2 缓存的使用2.3.3 二级缓存的问题2.3.4 脏读问题 3. MyBatis注解

3.1 常用注解3.2 增删改查

3.2.1 实体类3.2.2 mybatis配置3.2.3 Mapper接口3.3.4 测试代码 3.3 一对一查询

3.3.1 基本需求3.3.2 实体类3.3.3 Mapper接口3.3.4 mybatis配置3.3.5 测试代码 3.4 二级缓存

3.4.1 配置SqlMapConfig.xml 3.4.2 使用二级缓存 3.5 延迟加载

3.5.1 延迟加载配置

1. 延迟加载 1.1 基本概念

比如 当我们要查询用户的信息以及其关联的订单信息时, 。实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的订单信息。此时就是我们所说的延迟加载

举例说明 :

- 问题 :
	在一对多中,当我们有一个用户,它有个100个订单 在查询用户的时候,要不要把关联的订单查出来? 
	在查询订单的时候,要不要把关联的用户查出来?


- 回答 :
	在查询用户时,用户下的订单应该是,什么时候用,什么时候查询。 
	在查询订单时,订单所属的用户信息应该是随着订单一起查询出来。

延迟加载 : 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。

1.2 延迟加载的优缺点

优点:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表 速度要快。缺点:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时 间,所以可能造成用户等待时间变长,造成用户体验下降。在多表中: 一对多,多对多:通常情况下采用延迟加载 一对一(多对一):通常情况下采用立即加载注意:延迟加载是基于嵌套查询来实现的 1.3 延迟加载 1.3.1 局部懒加载

sqlMapConfig 配置 : 当调用 toStirng() 方法的时候就会加载

    
    
        
    

UserMapper.xml 配置 fetchType="lazy"

    
        
        
        
        
        

        
        
        
    

    
2.3 二级缓存 2.3.1 基本概念

二级缓存是namspace级别(跨sqlSession)的缓存,是默认不开启的二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。
也就是要求实体类实现Serializable接口,配置方法很简单,只需要在映射XML文件配置 就可以开启二级缓存了 2.3.2 缓存的使用

sqlMapConfig.xml 配置

 
     
	 

UserMapper.xml 配置





    
    

    
    @Result:实现结果集封装,代替了@Results:可以与@Result 一起使用,封装多个结果集,代替了@One:实现一对一结果集封装,代替了@Many:实现一对多结果集封装,代替了 
3.2 增删改查 
3.2.1 实体类 

User 实体类

public class User {

    private Integer id;

    private String username;

    private Date birthday;

    private String sex;

    private String address;
}
3.2.2 mybatis配置

jdbc.properties 配置

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_db
jdbc.username=root
jdbc.password=123456

sqlMapConfig.xml 配置

 
 

    
    

    
    
        
    

    
    
        
            
            
        
    
    

    
        
        

            
            
            

            
            
                
                
                
                
                
                
                
            
        
     
    
        
    

3.2.3 Mapper接口

UserMapper 接口

package cn.knightzz.mapper;

import cn.knightzz.entity.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;


public interface UserMapper {

    
    @Select("select * from `user`")
    public List findAll();

    
    @Insert("insert into `user`(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})")
    public void saveUser(User user);

    
    @Update("UPDATE `user` SET username = #{username},birthday = #{birthday},sex = #{sex},address = #{address} WHERe id = #{id}")
    public void updateUser(User user);


    
    @Delete("DELETE FROM `user` where id = #{id}")
    public void deleteUser(Integer id);
}

3.3.4 测试代码

测试代码

package cn.knightzz.test;

import cn.knightzz.entity.User;
import cn.knightzz.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;


public class MyBatisMapperTest {

    private User user = new User();
    private SqlSession sqlSession;
    private UserMapper mapper;

    @Before
    public void init() throws IOException {
        InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);
        sqlSession = build.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void findAllTest(){
        List users = mapper.findAll();
        for (User user1 : users) {
            System.out.println(user1);
        }
    }

    @Test
    public void updateUserTest(){
        user.setId(1);
        user.setUsername("卡莎");
        user.setBirthday(new Date());
        user.setAddress("湖北武汉");
        mapper.updateUser(user);
    }

    @Test
    public void deleteUserTest(){
        mapper.deleteUser(2024);
    }

    @After
    public void destroy(){
        sqlSession.close();
    }
}

3.3 一对一查询 3.3.1 基本需求

查询一个订单,与此同时查询出该订单所属的用户

SELECT * FROM orders; 
SELECt * FROM `user` WHERe id = #{订单的uid};
3.3.2 实体类

Order

public class Order {

    private Integer id;
    private Integer uid;
    private Double money;
    private Date orderTime;

    private User user;
}

User

public class User {

    private Integer id;

    private String username;

    private Date birthday;

    private String sex;

    private String address;

    private List orderList;
}
3.3.3 Mapper接口

OrderMapper

package cn.knightzz.mapper;

import cn.knightzz.entity.User;
import org.apache.ibatis.annotations.Select;


public interface OrderMapper {

    
    @Select("select * from `orders` where uid = #{uid}")
    public User findByUid(Integer uid);
}

UserMapper

package cn.knightzz.mapper;

import cn.knightzz.entity.User;
import org.apache.ibatis.annotations.*;

import javax.annotation.Resources;
import java.util.List;


public interface UserMapper {

    
    @Select("select * from `user`")
    @Results({
            @Result(id = true, column = "id", property = "id"),
            @Result(column = "brithday", property = "brithday"),
            @Result(column = "sex", property = "sex"),
            @Result(column = "address", property = "address"),
            @Result(property = "orderList", javaType = List.class,
                    column = "id", many = @Many(select = "cn.knightzz.mapper.OrderMapper.findByUid"))
            })
            public ListfindAllWithOrder();
}

3.3.4 mybatis配置

需要在 sqlMapConfig.xml 增加 OrderMapper 配置

    
    
        
        
    
3.3.5 测试代码
package cn.knightzz.test;

import cn.knightzz.entity.Order;
import cn.knightzz.entity.User;
import cn.knightzz.mapper.OrderMapper;
import cn.knightzz.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;


public class MyBatisMapperTest {

    private User user = new User();
    private SqlSession sqlSession;
    private UserMapper mapper;
    private OrderMapper orderMapper;

    @Before
    public void init() throws IOException {
        InputStream stream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);
        sqlSession = build.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
        orderMapper = sqlSession.getMapper(OrderMapper.class);
    }

    @Test
    public void findAllWithOrder(){
        List allWithOrders = mapper.findAllWithOrder();
        for (User allWithOrder : allWithOrders) {
            System.out.println(allWithOrder);
        }
    }

    @After
    public void destroy(){
        sqlSession.close();
    }
}

3.4 二级缓存 3.4.1 配置SqlMapConfig.xml
 
     
     

3.4.2 使用二级缓存
@CacheNamespace 
public interface UserMapper {...}
3.5 延迟加载 3.5.1 延迟加载配置

fetchType = FetchType.LAZY 表示懒加载fetchType = FetchType.EAGER 表示立即加载fetchType = FetchType.DEFAULT 表示使用全局配置

    @Select("select * from `user`")
    @Results({
            @Result(id = true, column = "id", property = "id"),
            @Result(column = "brithday", property = "brithday"),
            @Result(column = "sex", property = "sex"),
            @Result(column = "address", property = "address"),
            @Result(property = "orderList", javaType = List.class,
                    column = "id", many = @Many(select = "cn.knightzz.mapper.OrderMapper.findByUid", fetchType= FetchType.LAZY))
            })
            public ListfindAllWithOrder();
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/711380.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号