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原理相同。。

更多文章:
windows程序设计第五版(《WINDOWS程序设计》和《WINDOWS核心编程》的区别)
2026年10月15日 11:30
issued retroactively(FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待)
2026年10月15日 10:30
begin和start的区别(start与begin的区别)
2026年10月15日 09:20
vant官网中文(范特365 是韩国化妆品VANT36.5吗)
2026年10月15日 09:10
prison break(越狱(prison break)到底是在讲个什么)
2026年10月15日 06:50
c程序设计第五版教学视频(求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!)
2026年10月15日 06:40





