mybatis常用标签(mybatis怎么实现局部缓存)

:暂无数据 2026-10-13 10:50:06 :0

mybatis常用标签(mybatis怎么实现局部缓存)

本篇文章给大家谈谈mybatis常用标签,以及mybatis怎么实现局部缓存对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

本文目录

mybatis怎么实现局部缓存

1.1、Mybatis一级缓存测试

1 package me.gacl.test;
2
3 import me.gacl.domain.User;
4 import me.gacl.util.MyBatisUtil;
5 import org.apache.ibatis.session.SqlSession;
6 import org.junit.Test;
7
8 /**
9 * @author gacl
10 * 测试一级缓存
11 */
12 public class TestOneLevelCache {
13
14 /*
15 * 一级缓存: 也就Session级的缓存(默认开启)
16 */
17 @Test
18 public void testCache1() {
19 SqlSession session = MyBatisUtil.getSqlSession();
20 String statement = “me.gacl.mapping.userMapper.getUser“;
21 User user = session.selectOne(statement, 1);
22 System.out.println(user);
23
24 /*
25 * 一级缓存默认就会被使用
26 */
27 user = session.selectOne(statement, 1);
28 System.out.println(user);
29 session.close();
30 /*
31 1. 必须是同一个Session,如果session对象已经close()过了就不可能用了
32 */
33 session = MyBatisUtil.getSqlSession();
34 user = session.selectOne(statement, 1);
35 System.out.println(user);
36
37 /*
38 2. 查询条件是一样的
39 */
40 user = session.selectOne(statement, 2);
41 System.out.println(user);
42
43 /*
44 3. 没有执行过session.clearCache()清理缓存
45 */
46 //session.clearCache();
47 user = session.selectOne(statement, 2);
48 System.out.println(user);
49
50 /*
51 4. 没有执行过增删改的操作(这些操作都会清理缓存)
52 */
53 session.update(“me.gacl.mapping.userMapper.updateUser“,
54 new User(2, “user“, 23));
55 user = session.selectOne(statement, 2);
56 System.out.println(user);
57
58 }
59 }

1.2、Mybatis二级缓存测试
  1、开启二级缓存,在userMapper.xml文件中添加如下配置
《mapper namespace=“me.gacl.mapping.userMapper“》
《!-- 开启二级缓存 --》
《cache/》

  2、测试二级缓存

1 package me.gacl.test;
2
3 import me.gacl.domain.User;
4 import me.gacl.util.MyBatisUtil;
5 import org.apache.ibatis.session.SqlSession;
6 import org.apache.ibatis.session.SqlSessionFactory;
7 import org.junit.Test;
8
9 /**
10 * @author gacl
11 * 测试二级缓存
12 */
13 public class TestTwoLevelCache {
14
15 /*
16 * 测试二级缓存
17 * 使用两个不同的SqlSession对象去执行相同查询条件的查询,第二次查询时不会再发送SQL语句,而是直接从缓存中取出数据
18 */
19 @Test
20 public void testCache2() {
21 String statement = “me.gacl.mapping.userMapper.getUser“;
22 SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
23 //开启两个不同的SqlSession
24 SqlSession session1 = factory.openSession();
25 SqlSession session2 = factory.openSession();
26 //使用二级缓存时,User类必须实现一个Serializable接口===》 User implements Serializable
27 User user = session1.selectOne(statement, 1);
28 session1.commit();//不懂为啥,这个地方一定要提交事务之后二级缓存才会起作用
29 System.out.println(“user=“+user);
30
31 //由于使用的是两个不同的SqlSession对象,所以即使查询条件相同,一级缓存也不会开启使用
32 user = session2.selectOne(statement, 1);
33 //session2.commit();
34 System.out.println(“user2=“+user);
35 }
36 }

1.3、二级缓存补充说明
  1. 映射语句文件中的所有select语句将会被缓存。
  2. 映射语句文件中的所有insert,update和delete语句会刷新缓存。
  3. 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。
  4. 缓存会根据指定的时间间隔来刷新。
  5. 缓存会存储1024个对象
cache标签常用属性:
《cache
eviction=“FIFO“ 《!--回收策略为先进先出--》
flushInterval=“60000“ 《!--自动刷新时间60s--》
size=“512“ 《!--最多缓存512个引用对象--》
readOnly=“true“/》 《!--只读--》

mybatis做insert操作的时候 怎么才能返回插入的那条数据的id

设置一个实体类,有一个成员变量,id
insert标签里有一个属性useGeneratedKeys=“true“;
然后插入。
调用实体类getId();获得id
这是我常用的方法,也可以使用selectKey,但是比较麻烦

mybatis注解怎么解决字段名与属性名不同的问题

查询语句是 MyBatis 中最常用的元素之一,本文涉及mybatis的单表查询操作,关联表有关的查询会后续补充。

巧妇难为无米之炊,要想从数据库中表中取出数据并转化为javaBean,所以,我们要先准备javabean以及与其对应的数据表。

javaBean:

public class President {

private int id;
private String name;

@Override
public String toString() {
return “President [id=“ + id + “, name=“ + name + “]“;
}
//get set 方法.....
}
创建两个对应的数据库表,并插入两条数据:

create table president1(
p_id int not null auto_increment primary key,
p_name varchar(50) not null
);

insert into president1(p_name) values(’lily’),(’Tom’);

create table president2(
id int not null auto_increment primary key,
name varchar(50) not null
);
insert into president2(name) values(’lily’),(’Tom’);
创建两个数据库是为了测试两个不同的查询状况,
数据库字段名与实体类属性名相同

从sql表可以看出president2的字段名与javabean:President的属性名完全相同,这种情况下mybatis的select操作非常简单:

《!-- 从表 president2中查询--》
《select id=“getPreByIdPresident2“ parameterType=“int“ resultType=“President“》
select * from president2 where id=#{id}
《/select》

此时mybatis运用反射机制会将查询返回的结果(id,name)封装成President对象。

如果从表president1中查询,同样采用上面的sql语句

《!-- 从表 president1中查询--》
《select id=“getPreByIdPresident1“ parameterType=“int“ resultType=“President“》
《span style=“white-space:pre“》 《/span》President p1 = session.selectOne(statement+“getPreByIdPresident1“, 1);
《span style=“white-space:pre“》 《/span》System.out.println(“表president1中查询“+p1);
《/select》

此时如果用getPreByIdPresident1进行查询,返回的结果会是null,我们将上面的sql语句在mysql中执行下:

有结果返回,但是返回的字段名为(p_id,p_name)这种结果mybatis在解析时无法与President类对应。多数情况下实体类属性名与数据库表的字段名都会有差异,这种情况如果mybatis不能处理也就太low了。

数据库字段名与实体类属性名不相同
mybatis针对该种情况有两种解决方法,但是归根到底都是同一种实现。

Method1:定义一个ResultMap将数据库字段名与实体类属性名做个映射

我们欲从表president1中查询数据,此时的mapper配置如下:

《resultMap type=“President“ id=“getFromPresident2“》
《!-- 主键必须用id标签映射,其他的用非集合用result映射 集合类用collection映射 --》
《!-- column为数据库字段名,property为实体类属性名 --》
《id column=“p_id“ property=“id“ /》
《result column=“p_name“ property=“name“ /》
《/resultMap》
《select id=“getPreByIdPresident1Method1“ resultMap=“getFromPresident2“》
select * from president1 where p_id=#{id}
《/select》

首先定义了一个resultMap,将数据库表的字段名与实体类属性名做了一一对应,其中type为实体类(此处运用的类别名),id为了在select标签中引用映射结果。

在select标签中并没有用resultType属性,而使用了resultMap,即为上面定义的resultMap,mybatis会根据resultMap中的映射关系去构造President

Method1:直接在sql语句中使用别名

《!-- 从表 president1中查询 --》
《select id=“getPreByIdPresident1Method2“ resultType=“President“》
select p_id id,p_name name from president1 where p_id=#{id}
《/select》

这种方法会查到实际的数据,这种方法与字段名和属性名相同都是基于相同的原理:MyBatis 会在幕后自动创建一个 ResultMap,基于属性名来映射列到JavaBean 的属性上。即mybatis底层都是通过创建ResultMap来进行关系的映射,与method1原理相同。。

关于mybatis常用标签,mybatis怎么实现局部缓存的介绍到此结束,希望对大家有所帮助。

mybatis常用标签(mybatis怎么实现局部缓存)

本文编辑:admin

本文相关文章:


mybatis常用标签(mybatis设置sql通过什么标签)

mybatis常用标签(mybatis设置sql通过什么标签)

各位老铁们,大家好,今天由我来为大家分享mybatis常用标签,以及mybatis设置sql通过什么标签的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

2026年10月3日 04:00

更多文章:


python语言程序设计是什么(python语言是什么)

python语言程序设计是什么(python语言是什么)

各位老铁们好,相信很多人对python语言程序设计是什么都不是特别的了解,因此呢,今天就来为大家分享下关于python语言程序设计是什么以及python语言是什么的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年10月15日 12:00

windows程序设计第五版(《WINDOWS程序设计》和《WINDOWS核心编程》的区别)

windows程序设计第五版(《WINDOWS程序设计》和《WINDOWS核心编程》的区别)

本篇文章给大家谈谈windows程序设计第五版,以及《WINDOWS程序设计》和《WINDOWS核心编程》的区别对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了

2026年10月15日 11:30

issued retroactively(FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待)

issued retroactively(FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待)

各位老铁们,大家好,今天由我来为大家分享issued retroactively,以及FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站

2026年10月15日 10:30

f发音是什么?printf的返回值是什么

f发音是什么?printf的返回值是什么

大家好,关于f很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于f发音是什么的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2026年10月15日 10:10

begin和start的区别(start与begin的区别)

begin和start的区别(start与begin的区别)

其实begin和start的区别的问题并不复杂,但是又很多的朋友都不太了解start与begin的区别,因此呢,今天小编就来为大家分享begin和start的区别的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月15日 09:20

vant官网中文(范特365 是韩国化妆品VANT36.5吗)

vant官网中文(范特365 是韩国化妆品VANT36.5吗)

大家好,今天小编来为大家解答以下的问题,关于vant官网中文,范特365 是韩国化妆品VANT36.5吗这个很多人还不知道,现在让我们一起来看看吧!

2026年10月15日 09:10

特殊字符是指什么?正则表达式中一些特殊字符的用法

特殊字符是指什么?正则表达式中一些特殊字符的用法

大家好,特殊字符相信很多的网友都不是很明白,包括特殊字符是指什么也是一样,不过没有关系,接下来就来为大家分享关于特殊字符和特殊字符是指什么的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

2026年10月15日 08:10

特殊符号网名大全花样符号(特殊符号昵称有哪些)

特殊符号网名大全花样符号(特殊符号昵称有哪些)

本篇文章给大家谈谈特殊符号网名大全花样符号,以及特殊符号昵称有哪些对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年10月15日 07:30

prison break(越狱(prison break)到底是在讲个什么)

prison break(越狱(prison break)到底是在讲个什么)

各位老铁们好,相信很多人对prison break都不是特别的了解,因此呢,今天就来为大家分享下关于prison break以及越狱(prison break)到底是在讲个什么的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看

2026年10月15日 06:50

c程序设计第五版教学视频(求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!)

c程序设计第五版教学视频(求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!)

各位老铁们,大家好,今天由我来为大家分享c程序设计第五版教学视频,以及求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动

2026年10月15日 06:40

最近更新

热门文章

标签列表