Mybatis学习笔记(五)Mybatis中已经显示数据已修改但数据库中记录未更新问题
时间:2022-07-23
本文章向大家介绍Mybatis学习笔记(五)Mybatis中已经显示数据已修改但数据库中记录未更新问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
作者也是今天才发现这个问题,比如这个,自己一开始都是查询,但是最后一次明显计时修改信息,控制台为报错,并且显示正确,但是数据库中什么都没改
public class TestOneLevelCache {
public static void testCache1() {
SqlSession session = MyBatisUtil.getSqlSession();
String statement = "me.gacl.mapping.userMapper.getUser";
User user = session.selectOne(statement, 1);
System.out.println(user);
/*
* 一级缓存默认就会被使用
*/
user = session.selectOne(statement, 1);
System.out.println(user);
session.close();
/*
1. 必须是同一个Session,如果session对象已经close()过了就不可能用了
*/
session = MyBatisUtil.getSqlSession();
user = session.selectOne(statement, 1);
System.out.println(user);
/*
2. 查询条件是一样的
*/
user = session.selectOne(statement, 2);
System.out.println(user);
/*
3. 没有执行过session.clearCache()清理缓存
*/
//session.clearCache();
user = session.selectOne(statement, 2);
System.out.println(user);
/*
4. 没有执行过增删改的操作(这些操作都会清理缓存)
*/
session.update("me.gacl.mapping.userMapper.updateUser",
new User(2, "user", 23));
user = session.selectOne(statement, 2);
System.out.println(user);
}
public static void main(String[] args) {
testCache1();
}
}
数据没有变化
之后自己查了查,发现mybatis其实不是自动提交事务的,而是需要自己主动提交事务的, 我们之所以能看到控制台查询正确是因为是刚从缓存里面取出来的,所以是正确的,而且作者今天刚好在学的就是缓存这一块的 其次就是解决办法,有两种 第一种 我们之前使用的都是SqlSessionFactory.openSession()这个方法来打开sqlsession对象,这其中就是属于没有设置他的自动提交属性可以通过如下代码实现
public static SqlSession getSqlSession(boolean isAutoCommit) {
return getSqlSessionFactory().openSession(isAutoCommit);
}
然后设置里面的isAutoCommit=true,就行了 说是实话,这个方法之前在大神的比克学习的时候就看到了,但是自己当初就没有理解,因为但是使用的方法都是SqlSessionFactory.openSession(),如今才知道了这里的真谛。 第二种 就是直接在最后的代码后面就上这句话即可
sqlSession.commit()
这里作者修改之后,在看数据库的信息时,就可以发现数据已经改变了
- 大白话-prototype属性
- Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型
- Effective Modern C++翻译(4)-条款3:了解decltype
- 大白话-constructor
- Effective Modern C++翻译(3)-条款2:明白auto类型推导
- React Native在Android平台运行gif的解决方法
- Effective Modern C++翻译(2)-条款1:明白模板类型推导
- Android ormLite复杂条件查询
- Effective Modern C++翻译(1):序言
- C++操作mysql方法总结(2)
- Linux基础(day3)
- C++操作mysql方法总结(1)
- javascript实现最基本、最简单的继承
- C++操作mysql方法总结(3)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- django filter过滤器实现显示某个类型指定字段不同值方式
- PHP中使用mpdf 导出PDF文件的实现方法
- PyTorch实现重写/改写Dataset并载入Dataloader
- 详细分析Python垃圾回收机制
- PHP实现用session来实现记录用户登陆信息
- django序列化时使用外键的真实值操作
- 网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
- 如何基于Python爬取隐秘的角落评论
- PHP微信网页授权的配置文件操作分析
- php微信公众号开发之关键词回复
- Python 抓取数据存储到Redis中的操作
- PHP常见字符串操作函数与用法总结
- 利用python对excel中一列的时间数据更改格式操作
- Python 私有属性和私有方法应用场景分析
- django 模型字段设置默认值代码