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

Mybatis入门

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

Mybatis入门

Mybatis入门

MyBatis1、简介

1.1、什么是MyBatis1.2、持久层 2、第一个MyBatis程序

2.1、项目环境搭建2.2、编写程序

1. 编写MyBatis核心配置文件2. 编写MyBatis工具类3. 编写代码4. 测试5. 常见问题 3、CRUD

3.1、 namespace3.2、 select3.3、insert3.4、 update3.5、 delete3.6 Map传值 4、配置解析

4.1、核心配置文件4.2、环境(environments)4.3、 属性(properties)4.4、类型别名(typeAliases)4.5、映射器(mapper)4.6、 生命周期和作用域 5、解决属性名和字段名不一致的问题6、 日志

6.1、 日志工厂6.2、 LOG4J

6.2.1、导入依赖6.2.2、配置log4j.properties6.2.3、 配置log4j为日志的实现6.2.4、简单使用 7、 分页

7.1、使用limit分页7.2、 RowBounds分页 8、使用注解开发

8.1、 面向接口编程8.2、使用注解开发8.3 CRUD

1. 工具类创建SqlSession时候开启自动提交事务2. 编写接口,增加注解3. 测试 8.4、关于@Param注解8.5、#{}和${}的区别 9、 Lombok10、 多对一处理

10.1、环境准备 11、一对多处理

11.1、小结 12、动态SQL

12.1、环境搭建12.2、IF12.3、choose(when, otherwise)12.4、trim(where,set)12.5、SQL片段12.6、Foreach 13、缓存

13.1、 简介13.2、 Mybatis缓存13.3、 一级缓存13.4、 二级缓存

1. 开启全局缓存2. 自定义缓存策略 13.5、缓存顺序13.3、 一级缓存13.4、 二级缓存

1. 开启全局缓存2. 自定义缓存策略 13.5、缓存顺序

MyBatis 1、简介 1.1、什么是MyBatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

官方中文手册:https://mybatis.org/mybatis-3/zh/getting-started.html

1.2、持久层

持久化

持久化就是将程序的数据持久状态和瞬时状态转化的过程 持久层

完成持久化工作的代码层 2、第一个MyBatis程序 2.1、项目环境搭建

    创建Maven工程

      导入依赖

      
      
          4.0.0
      
          com.bnzr
          Myabtis-Study
          pom
          1.0-SNAPSHOT
          
              mybatis-01
          
      
          
              8
              8
          
          
              
              
                  mysql
                  mysql-connector-java
                  8.0.27
              
      
              
              
                  org.mybatis
                  mybatis
                  3.5.9
              
      
              
              
                  junit
                  junit
                  4.13.2
                  
              
          
      
          
          
              
                  
                      src/main/java
                      
                          ***.xml
                      
                      true
                  
              
          
      
      
2.2、编写程序 1. 编写MyBatis核心配置文件

在resource文件夹内创建mybatis核心配置文件mybatis-config.xml(名字可以改)





    
        
            
            
                
                
                
                
            
        
    
    
    
        
    

2. 编写MyBatis工具类
package com.bnzr.utils;

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 java.io.IOException;
import java.io.InputStream;

//SqlSessionFactory --> SqlSession
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    
    static {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}

3. 编写代码

实体类

package com.bnzr.pojo;

public class User {
    private int id;
    private String name;
    private String pwd;

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public User() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", pwd='" + pwd + ''' +
                '}';
    }
}

Dao接口

package com.bnzr.dao;

import com.bnzr.pojo.User;

import java.util.List;

public interface UserDao {
    List getUserList();
}

接口实现

由原来的UserDaoImpl转变成为一个Mapper配置文件






    
    
        select * from mybatis.user where id = #{id};

测试

 @Test
    public void getUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User userById = mapper.getUserById(1);
        System.out.println(userById.toString());
    }
3.3、insert

编写接口

 
int addUser(User user);

编写对应的mapper中的sql语句


    insert into mybatis.user (id, name, pwd)
    values (#{id},#{name},#{pwd});

测试

@Test
public void addUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int res = mapper.addUser(new User(4, "甲四", "123456"));
    if(res>0){
        //增删改需要提交事务
        sqlSession.commit();
    }else {
        //失败回滚
        sqlSession.rollback();
    }
    sqlSession.close();
}
3.4、 update

编写接口

int updateUser(User user);

编写对应的mapper中的sql语句


    update USER
    set name = #{name},
    pwd=#{pwd}
    where id = #{id};

测试

@Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int res = mapper.updateUser(new User(4, "已四", "666666"));
        if(res>0){
            //增删改需要提交事务
            sqlSession.commit();
        }else {
            //失败回滚
            sqlSession.rollback();
        }
        sqlSession.close();
    }
3.5、 delete

编写接口

int deleteUser(int id);

编写对应的mapper中的sql语句


    delete
    from mybatis.user
    where id = #{id};

测试

@Test
public void deleteUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int res = mapper.deleteUser(4);
    if(res>0){
        //增删改需要提交事务
        sqlSession.commit();
    }else {
        //失败回滚
        sqlSession.rollback();
    }
    sqlSession.close();
}

*注意点*:

    增删改必须提交事务
3.6 Map传值

编写接口

int addUserMap(Map map);

编写对应的mapper中的sql语句


    insert into mybatis.user (id, name, pwd)
    values (#{userid}, #{username}, #{password});

测试

@Test
public void addUserMap(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map map = new HashMap();
    map.put("userid",6);
    map.put("username","心底");
    map.put("password","888666");
    int res = mapper.addUserMap(map);
    if(res>0){
        //增删改需要提交事务
        sqlSession.commit();
    }else {
        //失败回滚
        sqlSession.rollback();
    }
    sqlSession.close();
}

Map传递参数,直接在sql中去除key即可!【parameterType=”map”】

对象传递参数,直接在sql中取对象的属性即可【parameterType=”Object”】

只有一个基本数据类型参数的情况下,可以直接在sql中取到,不用写parameterType

4、配置解析 4.1、核心配置文件

mybatis-config.xmlMybatis的配置文件包含了会深深影响Mybatis行为的设置和属性信息configuration(配置)

properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境配置)

environment(环境变量)

transactionManager(事务管理器)dataSource(数据源) databaseIdProvider(数据库厂商标识)mappers(映射器) 4.2、环境(environments)

Mybatis 可以配置成适应多套环境

尽管可以配置多套环境,但是每个SqlSessionFactory实例只能选择一种环境

学会配置多套环境!

Mybatis默认的事务管理器就是JDBC,连接池POOLED

4.3、 属性(properties)

我们可以通过properties属性来实现引用配置文件

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.properties】

编写一个配置文件

db.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding-utf8&useSSL=true
username=root
password=root

在核心配置文件中引入





    
    

    
    
        
            
            
                
                
                
                
            
        
    

    
        
    

properties属性也可以进行属性设置如:


  
  

读取顺序 先进性内部属性读取,再进行外部文件读取。如果两个属性名一致会进行覆盖。

4.4、类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。

它仅用于 XML 配置,意在降低冗余的全限定类名书写。


    

也可以指定一个包名,Mybatis会在包名下面搜索需要的Java Bean,比如:

扫描实体类的包,它的默认别名就为这个类的类名,首字母小写





    
    

    
    
        
    
    
        
            
            
                
                
                
                
            
        
    

    
        
    

xml进行简化






    
    
        select *
        from mybatis.user
        where id = #{id};
    
    
    
        insert into mybatis.user (id, name, pwd)
        values (#{id}, #{name}, #{pwd});
    

    
        update USER
        set name = #{name},
            pwd=#{pwd}
        where id = #{id};
    

    
        delete
        from mybatis.user
        where id = #{id};
    

在实体类比较少的情况,使用第一种

如果实体类非常多,使用第二种

第一种可以DIY自定义,第二种不行,如果非要取别名,需要使用ibatis的注解功能@Alias

import org.apache.ibatis.type.Alias;

@Alias("test")
public class User {
    private int id;
    private String name;
    private String pwd;}
4.5、映射器(mapper)

方式一:使用相对于类路径的资源引用

    
    

方式二:使用映射器接口实现类的完全限定类名

        
    

方式三:将包内的映射器接口实现全部注册为映射器

    
    

注意点:使用方法二和方法三

接口和他的Mapper配置文件必须同名接口和他的Mapper配置文件必须在同一个包下 4.6、 生命周期和作用域

生命周期,和作用域,是至关重要的,因为错误的使用会导致非常严重的并发问题。

SqlSessionFactoryBuilder

一旦创建了SqlSessionFactory,就不再需要他了局部变量

SqlSessionFactory

说白了就是可以想象为:数据库连接池SqlSessionFactory一旦被创建就应该在应用运行的期间一直存在,没有任何理由丢弃它或重新创建另一个实例。因此SqlSessionFactory的最佳作用域是应用作用域。字简单的就是使用单例模式或者静态单例模式

SqlSession

连接到连接池的一个请求!关闭SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。用完之后需要赶紧关闭,否则资源被占用。

这里的每个Mapper,就代表一个具体的业务!

5、解决属性名和字段名不一致的问题

数据库字段名与实体类属性名不对应。

解决方法一:取别名


    select *
    from mybatis.user
    where id = #{id};

ResultMap 元素是MyBatis中最重要最强大的元素ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点都语句只需要描述它们的关系就行了。ResultMap 最优秀的地方在于,虽然你已经对他相当了解了,但是根本不需要显式的用到他们。如果总是这么简单就好了。 6、 日志 6.1、 日志工厂

如果一个数据库操作,出现了异常,我们需要排错,日志就是最好的助手

曾经:sout,debug

现在:日志工厂!

设置名描述有效值默认值
logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J | LOG4J(deprecated since 3.5.9) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING未设置

SLF4JApache Commons LoggingLog4j 2Log4j 【掌握】JDK loggingSTDOUT_LOGGING 【掌握】NO_LOGGING

在MyBatis中具体使用哪一个日志实现,在设置中设定。

 
        
 

全文件


    
    
    
    
        
    
    
    
        
    

    
        
            
            
                
                
                
                
            
        
    

    
        
    


6.2、 LOG4J

什么是Log4j?

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslo守护进程我们也可以控制每一条日志的输出格式通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程通过一个配置文件来灵活地进行配置,而不需要修改应用的代码 6.2.1、导入依赖


    log4j
    log4j
    1.2.17

6.2.2、配置log4j.properties
### 设置###
log4j.rootLogger = DEBUG,console,file
### 输出信息到控制抬 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=D://logs/error.log ###
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File = ./log/bnzr.log
log4j.appender.file.MaxFileSize = 10mb
log4j.appender.file.Threshold = DEBUG 
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
### 输出ERROR 级别以上的日志到=D://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
### 日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
6.2.3、 配置log4j为日志的实现

    

6.2.4、简单使用

在要使用Log4j的类中,导入包

import org.apache.log4j.Logger;

日志对象,参数为当前类的class

static Logger logger = Logger.getLogger(UserDaoTest.class);

日志级别

logger.info("info:进入了testLog4j");
logger.debug("debug:进入了testLog4j");
logger.error("error:进入了testLog4j");

测试

import org.apache.log4j.Logger;
import org.junit.Test;

public class UserDaoTest {
    static Logger logger = Logger.getLogger(UserDaoTest.class);

    @Test
    public void testlog(){
        logger.info("info: 测试");
        logger.debug("debug:测试");
        logger.error("error:测试");
    }
}
7、 分页 7.1、使用limit分页
--只有一个参数是表示 从0开始查询n个
select * from user limit 2;
--从序号1行开始,查询两个
select * from user limit 1,2;

使用limit实现分页

接口

List getUserByLimit(Map map);

Mapper.xml


    
    
    


    select * from `user` limit #{startIndex} ,#{pageSize}

测试

@Test
public void getUserByLimit(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    HashMap map = new HashMap();
    map.put("startIndex",0);
    map.put("pageSize",2);
    List userByLimit = mapper.getUserByLimit(map);
    for (User user : userByLimit) {
        System.out.println(user.toString());
    }
    sqlSession.close();
}
7.2、 RowBounds分页

不再使用sql实现分页

接口

List getUserByRowBounds();

mapper.xml


        select * from student;
    
	
    
    select s.id sid,s.name sname,t.name tname ,t.id tid from student s,teacher t where s.tid=t.id;



    
    
    
        
        
    

测试

@Test
public void testStudent(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
    List studentList = studentMapper.getStudent();
    for (Student student : studentList) {
        System.out.println(student);
    }
    sqlSession.close();
}
11、一对多处理

想要查询老师并且携带学生信息

pojo

package com.bnzr.pojo;

import java.util.List;

public class Teacher {
    private int id;
    private String name;
    //老师拥有多个学生
    private List studentList;

    public Teacher() {
    }

    public Teacher(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List getStudentList() {
        return studentList;
    }

    public void setStudentList(List studentList) {
        this.studentList = studentList;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", studentList=" + studentList +
                '}';
    }
}

TeacherMapper

package com.bnzr.dao;

import com.bnzr.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface TeacherMapper {
    
    Teacher getTeacherByid(@Param("tid") int id);

    
    Teacher getTeacherByidTwo(@Param("tid") int id);
}

按照结果嵌套查询


    
    
    
    
        
        
    


    select *
    from teacher
    where id = #{tid};



    
    



    select *
    from blog where 1=1
    
        and title=#{title}
    
    
        and author=#{author}
    
    ;

test

@Test
public void queryBlogIFTest(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    HashMap map = new HashMap<>();
    map.put("title","疯狂的卷");
    map.put("author","bnzr");

    List blogs = mapper.queryBlogIF(map);
    for (Blog blog : blogs) {
        System.out.println(blog);
    }
    sqlSession.close();
}
12.3、choose(when, otherwise)

有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。

当满足一个when时就不继续向下走了,当都不满足时才会走otherwise

BlogMapper.xml


    select *
    from blog
    
        
            and title=#{title}
        
        
            and author=#{author}
        
    
    ;

set 元素可以用于动态包含需要更新的列,忽略其它不更新的列。


    update blog
    
        
            author=#{author},
        
        
            title=#{title},
        
        
            views=#{views},
        
    
    where id = #{id};

12.5、SQL片段

有时候,我们可能会将一些功能的部分抽取出来,方便复用。

    使用SQL标签抽取公共的部分

    
        
            and title=#{title}
        
        
            and author=#{author}
        
    
    

    在需要使用的地方使用include标签引用即可

    
        select * from blog
        
            
                id=#{id}
            
        
    
    

    test

    @Test
    public void queryBlogForeachTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);
    
        ArrayList idsList = new ArrayList<>();
        idsList.add("01c2a405fb8b41f6b637c61b66f4bbc3");
        idsList.add("8106d640c1a244b28ea0dcc8f7dbfd72");
    
        HashMap map = new HashMap<>();
        map.put("ids",idsList);
    
        List blogs = blogMapper.queryBlogForeach(map);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }
        sqlSession.close();
    }
    

    动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式去排列组合就可以了

    13、缓存 13.1、 简介
      什么是缓存【Cache】?

      在内存中的临时数据。将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高效率,解决了高并发系统的性能问题。 为什么使用缓存?

      减少和数据库的交互次数,减少系统开销,提高系统效率。 什么样的数据能使用缓存?

      经常查询并且不经常改变的数据。

    13.2、 Mybatis缓存

    ByBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存

    默认情况下,。只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)二级缓存需要手动开启和配置,他是基于namespace级别的缓存。为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存。 13.3、 一级缓存

    一级缓存也叫本地缓存:SqlSession

    与数据库同一次会话期间查询到的数据会放在本地缓存中。以后如果需要获取相同的数据,直接从缓存中取,没必要再去查询数据库。

    测试步骤:

      开启日志!测试在一个Session中查询两次相同记录查看日志输出

    缓存失效情况:

      查询不同的东西增删改操作,可能会改变原来的数据,所以必定会刷新缓存!查询不同的Mapper.xml手动清除缓存 SqlSession.clearCache();

    小结:一级缓存默认是开启的,只在一次SqlSession中有效,也就是拿到连接到关闭连接这个区间段!一级缓存相当于一个Map。

    13.4、 二级缓存

    二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存基于namespace级别的缓存,一个名称空间,对应一个二级缓存。工作机制

    一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;如果当前会话关闭了,这个会话对应的一级缓存就没了,这时一级缓存中的数据被保存到二级缓存中。新的会话查询信息,就可以从二级缓存中获取内容。不同的mapper查出的数据会放在自己对应的缓存(map)中 1. 开启全局缓存

      在mybatis-config.xml配置文件中加入
    
        
    
    

      在要使用二级缓存的Mapper中开启二级缓存

      
          
      
      
    2. 自定义缓存策略

    这些属性可以通过 cache 元素的属性来修改。比如:

    
    

    这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。

    可用的清除策略有:

    LRU – 最近最少使用:移除最长时间不被使用的对象。FIFO – 先进先出:按对象进入缓存的顺序来移除它们。SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。

    默认的清除策略是 LRU。

    flushInterval(刷新间隔)属性可以被设置为任意的正整数,设置的值应该是一个以毫秒为单位的合理时间量。 默认情况是不设置,也就是没有刷新间隔,缓存仅仅会在调用语句时刷新。

    size(引用数目)属性可以被设置为任意正整数,要注意欲缓存对象的大小和运行环境中可用的内存资源。默认值是 1024。

    readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false。

    PS:

    ​ 问题:如果发现实体类序列化报错

    Caused by:java.io.NotSerializableException:com.bnzr.pojo.Blog
    

    ​ 解决:继承Serializable进行序列化

    public class Blog implements Serializable 
    

    ​ 问题:如果方法想要关闭缓存

    ​ 解决:对查询添加useCache="false"属性

    
    

    小结:

    只要开启了二级缓存,在同一个Mapper下就有效所有的数据都会先放在一级缓存中只有当会话提交,或者关闭的时候,才会提交到二级缓存中 13.5、缓存顺序

    先在二级缓存中查找,如果没有再向一级缓存查找,如果没有在查数据库。

    优先级:二级缓存 》一级缓存 》查数据库

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/760361.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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