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

自看笔记【Mybatis】

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

自看笔记【Mybatis】

环境:

JDK1.8,Mysql5.7,maven3.6.1,IDEA
######回顾:
JDBC,Mysql,java基础,Maven,junit

SSM框架:

配置文件:最好的方式:看官网文档:https://mybatis.org/mybatis-3/

1.简介: 1.1 什么是Mybatis

MyBatis 是一款优秀的持久层框架。它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
######获取Mybatis:maven仓库:


    org.mybatis
    mybatis
    3.5.7

gitee:https://gitee.com/geng_zhao_kai/mybatis-3?_from=gitee_search中文文档:https://mybatis.org/mybatis-3/zh/index.html 1.2 持久化

数据持久化

持久化就是将程序的数据在持久状态和瞬时状态转化的过程。内存:断电即失数据库(jdbc),io文件持久化

为什么需要持久化?

有一些对象,不能让他丢掉。内存太贵 1.3 持久层

完成持久化工作的代码块层界限十分明显。 1.4 为什么需要Mybatis?

帮助程序员把数据存入到数据库中传统JDBC代码太复杂了,简化、框架、自动化… 2.第一个Mybatis程序

思路:搭建环境–导入Mybatis–编写代码–测试

2.1 搭建环境

数据库:

CREATE DATAbase `mybatis`;
USE `mybatis`;

CREATE TABLE `user`(
`id` INT(20) NOT NULL PRIMARY KEY,
`name` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `user`(`id`,`name`,`pwd`)VALUES
(1,'张三','123456'),
(2,'李四','123456'),
(3,'王五','123456')

新建项目:
1.普通maven项目

2.删除src目录
3.导入maven依赖

    
    
        
        
            mysql
            mysql-connector-java
            8.0.27
        
        
        
            org.mybatis
            mybatis
            3.5.7
        
        
        
            junit
            junit
            4.13.2
            test
        
    
2.1 创建一个模块

编写mybatis的核心配置文件

编写mybatis的工具类
在resources下配置mybatis-config.xml




    
        
            
            
                
                
                
                
            
        
    

从 XML 中构建 SqlSessionFactory,从 SqlSessionFactory 中获取 SqlSession

在util下配置com.qwe.util.MybatisUtils

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 {
        try {
            //使用Mybatis第一步:获取sqlSessionFactory对象
            //这里出错后面会空指针异常
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
    // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }

}
2.3 编写代码

实体类Dao接口接口实现类 探究已映射的 SQL 语句

一个语句既可以通过 XML 定义,也可以通过注解定义。事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以流行。这里给出一个基于 XML 映射语句的示例,它应该可以满足上个示例中 SqlSession 的调用。




  
    select * from Blog where id = #{id}
  

实体类 com.qwe.pojo.User

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

    public User() { }

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

    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接口 com.qwe.dao.UserDao

import com.qwe.pojo.User;
import java.util.List;

public interface UserDao {
    //获取UserList
    List getUserList();
}

接口实现类 由原来的UserDaoImpl转变为一个Mapper配置文件 UserMapper.xml




//必须指定命名空间
    
    
        select * from mybatis.user where name like "%"#{value }"%"
    
    @Test
    public void getUserLike(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List userList = mapper.getUserLike("王");
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }

1 java代码执行的时候,传递通配符% %

 List userList = mapper.getUserLike("%王%");

2 在sql拼接中使用通配符

select * from mybatis.user where name like "%"#{value }"%"
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 实例只能选择一种环境。

environments 元素定义了如何配置环境。


  
    
      
    
    
      
      
      
      
    
  

注意一些关键点:
1 默认使用的环境 ID(比如:default=“development”)。
2 每个 environment 元素定义的环境 ID(比如:id=“development”)。
3 事务管理器的配置(比如:type=“JDBC”)。
4 数据源的配置(比如:type=“POOLED”)。
默认环境和环境 ID 顾名思义。 环境可以随意命名,但务必保证默认的环境 ID 要匹配其中一个环境 ID。

事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):

JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。 (默认)MANAGED – 这个配置几乎没做什么. 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭。
如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

数据源(dataSource)
连接数据库
有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]"):

UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。但是性能要求不高。(没有池)
池:用完可以回收POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。能使并发 Web 应用快速响应请求。(默认)JNDI

Mybatis默认的事务管理器就是JDBC,连接池:POOLED
学会实用配置多套运行环境。

4.3属性(properties)

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

编写一个配置文件
db.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&characterEncoding=UTF-8&useUnicode=true&serverTimezone=GMT
username=root
password=123456

在xml中,所有标签都可以规定其顺序:properties,settings,typeAliases,typeHandlers,objectWraperFactory,reflectorFactory,plugins,environment,databaseldProvider,mappers

在核心配置文件中引入

    
        
    

可以直接引入外部文件可以直接在其中增加属性配置如果db.properties和核心配置文件中有同一字段,优先使用外部配置文件
####4.4类型别名(typeAliases)类型别名是为java类型设置一个短的名字。存在的意义仅在于用来减少类完全限定名的冗余。
mybatis-config.xml

    
    
        
    

UserMapper.xml

    
    select * from mybatis.user
  

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,扫描实体类的包,它的默认别名就为这个类的类名,首字母小写。
mybatis-config.xml

    
        
    

UserMapper.xml

    
    select id,name,pwd as password from mybatis.user where id =#{id};
    
5.2resultMap

结果集映射
UserMapper.xml

    
    
        
        
        
        
    
    
        select * from mybatis.user
    

3.测试

   @Test
   public void getUserByRowBounds(){
       SqlSession sqlSession = MybatisUtils.getSqlSession();

      //RowBounds实现
       RowBounds rowBounds = new RowBounds(1, 2);

       //通过java代码层面实现分页
       List userList = sqlSession.selectList("com.qwe.dao.UserMapper.getUserByRowBounds",null,rowBounds);
       for (User user : userList) {
           System.out.println(user);
       }
       sqlSession.close();
   }
7.3分页插件

8.使用注解开发 8.1面向接口编程


8.2 使用注解开发 8.2.1 注解在接口上实现
public interface UserMapper {
    @Select("select * from user")
    List getUsers();
}
8.2.2 需要在核心配置文件中绑定接口!
    
        
    
8.2.3 测试
    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //底层主要应用反射
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List users = mapper.getUsers();
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }

本质:反射机制实现
底层:动态代理

Mybatis详细的流程
配置文件-工具类-实现类-测试类
Resources获取加载全局配置文件—>实例化SqlSessionFactoryBuilder构造器—>解析配置文件流XMLConfigBuilder—>Configuration所有的配置信息—>SqlSessionFactory实例化—>transaction事务管理—>创建executor执行器—>创建sqlSession—>实现CRUD(有可能回滚到事务管理器)—>查看是否执行成功(不成功回滚)—>提交事务—>关闭

8.3 CRUD

我们可以在工具类创建的时候实现自动提交事务!
MybatisUtils.java

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

编写接口,增加注释

public interface UserMapper {
    @Select("select * from user")
    List getUsers();

    //方法存在多个参数,所有的参数前面必须加上@Param("id")注解
    @Select("select * from user where id =#{id}")
    User getUserByID(@Param("id") int id);

    @Insert("insert into user(id,name,pwd) values(#{id},#{name},#{password})")
    int addUser(User user);

    @Update("update user set name=#{name},pwd=#{password} where id = #{id}")
    int updateUser(User user);

    @Delete("delete from user where id = #{id}")
    int deleteUser(@Param("id") int id);
}

测试类
注意:我们必须要将接口注册绑定到我们的核心配置文件中!

public class UserMapperTest {
    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //底层主要应用反射
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//        List users = mapper.getUsers();
//        for (User user : users) {
//            System.out.println(user);
//        }

//        User userByID = mapper.getUserByID(1);
//        System.out.println(userByID);

//        mapper.addUser(new User(5,"hello","123456"));

//        mapper.updateUser(new User(5,"aaa","123456"));

        mapper.deleteUser(5);

        sqlSession.close();
    }
}

关于@Param()注解

基本类型的参数或者String类型,需要加上引用类型不需要加如果只有一个基本类型的话,可以忽略,但是建议大家都加上我们在SQL中引用的就是我们这里的@Param(“id”)中设定的属性名 9 Lombok

使用步骤:

1.在IDEA中安装Lombok插件

2.在项目中导入lombok的jar包


    org.projectlombok
    lombok
    1.18.22
    provided


3.在实体类上加lombok注解
@Getter and @Setter
@FieldNameConstants 字段属性常量
@ToString 
@EqualsAndHashCode
@AllArgsConstructor, 全部的构造参数@RequiredArgsConstructor and @NoArgsConstructor无参构造
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
@Data
@Builder
@SuperBuilder
@Singular
@Delegate
@Value
@Accessors链式操作
@Wither
@With
@SneakyThrows

@Data:无参构造,get、set、tostring、hashcode、equals
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString

4.优缺点

优点:

能通过注解的形式自动生成构造器,getter/setter、equals。hashcode、toString等方法,提高了一定的开发效率让代码变得简洁,不用过多的去关注相应的方法属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
缺点:不支持多种参数构造器的重载虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度。 10.多对一处理

多对一:

多个学生,对应一个老师对于学生这边而言,多个学生关联一个老师。多对一对于老师而言,集合,一个老师有很多学生。一对多

SQL:

CREATE TABLE `teacher`(
`id`INT(10)NOT NULL,
`name`VARCHAR(30)DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO teacher(`id`,`name`)VALUES(1,'秦老师');

CREATE TABLE `student`(
`id`INT(10)NOT NULL,
`name`VARCHAR(30)DEFAULT NULL,
`tid` INT(10)DEFAULT NULL,
KEY`fkid`(`tid`),
CONSTRAINT`fktid`FOREIGN KEY(`tid`)REFERENCES`teacher`(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `student`(`id`,`name`,`tid`)VALUES('1','小明','1');
INSERT INTO `student`(`id`,`name`,`tid`)VALUES('2','小红','1');
INSERT INTO `student`(`id`,`name`,`tid`)VALUES('3','小张','1');
INSERT INTO `student`(`id`,`name`,`tid`)VALUES('4','小李','1');
INSERT INTO `student`(`id`,`name`,`tid`)VALUES('5','小王','1');
测试环境搭建 1.导入lombok
        
            org.projectlombok
            lombok
            1.18.22
            provided
        
2.新建实体类Teacher,Student
@Data
public class Teacher {
    private int id;
    private String name;

}

@Data
public class Student {
    private int id;
    private String name;

    //学生需要关联一个老师
    private Teacher teacher;
}
3.建立Mapper接口
public interface TeacherMapper {
    @Select("select * from teacher where id = #{tid}")
    Teacher getTeacher (@Param("tid") int id);
}
public interface StudentMapper {
}
4.建立Mapper.xml文件








5.在核心配置文件中绑定注册我们的Mapper接口或者文件

    
    

6.测试查询是否能够成功
public class MyTest {
    public static void main(String[] args) {

        SqlSession sqlSession = MybatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = mapper.getTeacher(1);
        System.out.println(teacher);
        sqlSession.close();
    }
}
按照查询嵌套处理
    
        select * from student;
    
    
        
        

        
    
    
        select s.id sid,s.name sname,t.name tname
        from student s,teacher t
        where s.tid =t.id
    
    
        
        
        
            
        
    
回顾Mysql多对一查询方式:

子查询联表查询 11.一对多处理

比如:一个老师拥有多个学生!
对于老师而言,就是一对多的关系。

环境搭建(同多对一) 实体类
@Data
public class Student {
    private int id;
    private String name;
    //学生只有一个老师
    private int tid;
}
@Data
public class Teacher {
    private int id;
    private String name;
    //一个老师拥有多个学生
    private List students;
}
接口
public interface TeacherMapper {
    //获取老师
//    List getTeacher();

    //获取指定老师及他所有学生
    Teacher getTeacher(@Param("tid") int id);
    Teacher getTeacher2(@Param("tid") int id);
}
TeacherMapper.xml 按结果嵌套查询
    
        select * from mybatis.teacher where id = #{tid}
    
    
    
        
    
    
        select * from  mybatis.blog 
        
            
                title = #{title}
            
            
                and author =#{author}
            
        
    

测试

    @Test
    public void queryBlogIF(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
        HashMap map = new HashMap();
        map.put("title","123");
        List blogs = mapper.queryBlogIF(map);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }
        sqlSession.close();
    }
12.4 choose、when、otherwise

有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
传入了 “title” 就按 “title” 查找,传入了 “author” 就按 “author” 查找的情形。

BlogMapper.java

//choose
List queryBlogChoose(Map map);

BlogMapper.xml

   
        select * from mybatis.blog
        
            
                
                    title = #{title}
                
                
                    and author = #{author}
                
                
                    and views = #{views}
                
            
        
    

set:


        update mybatis.blog
        
            
                title = #{title},
            
            
                author = #{author}
            
        
        where id = #{id}
    

BlogMapper.java

//更新博客
int updateBlog(Map map);

测试

@Test
public void updateBlog(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    HashMap map = new HashMap();
    map.put("title","ABC");
    map.put("id","fa7ce5ef94bd4335b08f20698bfae0dd");

    mapper.updateBlog(map);
    sqlSession.close();
}

所谓的动态SQL,本质还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码

12.6 Foreach

动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)
java //查询第1-2-3号记录的博客 List queryBlogForeach(Map map);

    
    
        select * from mybatis.blog
        
            
                id = #{id}
            
        
    
    @Test
    public void queryBlogForEach(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
        HashMap map = new HashMap();

        ArrayList ids = new ArrayList();
        ids.add(1);
        ids.add(2);
        map.put("ids",ids);
        List blogs = mapper.queryBlogForeach(map);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }
        sqlSession.close();
    }
12.7 SQL片段

有的时候,我们可能会将一些功能的部分抽取出来,方便复用。
1.使用SQL标签抽取公共部分

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

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

    

注意事项:

最好基于单表来定义SQL片段!不要存在where标签

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

建议:

先在mysql中写出完整的SQL,再对应的去修改成为我们的动态SQL实现! 13 缓存 13.1 简介

查询,连接数据库,耗资源
将一次查询的结果,给他暂存在一个可以直接取到的地方--->内存:缓存
我们再次查询相同数据的时候,直接走缓存,就不用走数据库了。
    什么是缓存 [Cache]?
    存在内存中的临时数据。
    将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。为什么使用缓存?
    减少和数据库的交互次数,减少系统开销,提高系统效率。什么样的数据能使用缓存?
    经常查询并且不经常改变的数据。
13.2 Mybatis缓存

一级缓存也叫本地缓存:

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

默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)

二级缓存需要手动开启和配置,他是基于namespace级别的缓存。为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存 13.3、一级缓存

一级缓存也叫本地缓存:

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

测试步骤:

    开启日志
    
        
    
    测试在一个Session中查询两次相同的记录
    @Test
    public void queryUserByIdTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.queryUserById(1);
        System.out.println(user);
        User user2 = mapper.queryUserById(1);
        System.out.println(user2);
        System.out.println(user==user2);
        sqlSession.close();
    }

    查看日志文件
    SQL语句只进行了一次查询,第二次结果没有进行数据库的查询。

    插入查询语句在中间

    int updateUser(User user);
    
        update user set name =#{name},pwd =#{pwd} where id =#{id};
    
    @Test
    public void queryUserByIdTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.queryUserById(1);
        System.out.println(user);

        mapper.updateUser(new User(2,"aaa","bbb"));

        User user2 = mapper.queryUserById(1);
        System.out.println(user2);
        System.out.println(user==user2);
        sqlSession.close();
    }
    查看日志文件
    SQL执行了两次,连接了两次数据库

缓存失效的情况:

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

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

13.4、二级缓存

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

一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;新的会话查询信息,就可以从二级缓存中获取内容;不同的mapper查出的数据会放在自己对应的缓存(map)中;

步骤:

    开启全局缓存 【mybatis-config.xml】
        
        
    在要使用二级缓存的Mapper中开启【UserMapper.xml】
    

也可以自定义一些参数

    
    

3.测试:

    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        SqlSession sqlSession2 = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        UserMapper mapper2 = sqlSession.getMapper(UserMapper.class);

        User user = mapper.queryUserById(1);
        System.out.println(user);

        User user2 = mapper2.queryUserById(1);
        System.out.println(user2);
        sqlSession.close();

        System.out.println(user==user2);
        sqlSession2.close();

    }

(1)问题:我们需要将实体类序列化!否则就会报错:Error serializing object. Cause: java.io.NotSerializableException

public class User implements Serializable {

小结:

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

13.6 自定义缓存-ehcache

Ehcache是一种广泛使用的开源 java分布式缓存,主要面向通用缓存。
要在程序中使用ehcache,先要导包。


    org.mybatis.caches
    mybatis-ehcache
    1.2.2

在Mapper中指定使用ehcache实现

 

配置文件【ehcache.xml】



   
   
   
   

   
   
   


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

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

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