首页
赞助
时间轴
追番
留言
友人帐
关于
个人导航
更多
学习笔记
壁纸
Search
1
【台式机】2020-06-07,上半年618推荐配置(都是AMD)
953 阅读
2
21年下半年笔记本挑选
918 阅读
3
域名备案成功
789 阅读
4
2020.10 手机号码正则表达式
730 阅读
5
Mybatis缓存
695 阅读
日常
代码
❤心情
博客插件
电脑推荐
KMS服务
登录
Search
标签搜索
电脑推荐
组装电脑
博客插件
跨域访问错误
Maven
Mybatis
node.js
WebSocket
SpringBoot
Linux
跨域
网页背景效果
音乐播放器
看板娘
Pio插件问题
气泡通知
轻薄本
全能本
笔记本推荐
伪静态
旧梦未眠
累计撰写
71
篇文章
累计收到
13
条评论
今日撰写
0
篇文章
首页
栏目
日常
代码
❤心情
博客插件
电脑推荐
KMS服务
页面
赞助
时间轴
追番
留言
友人帐
关于
个人导航
学习笔记
壁纸
用户登录
登录
搜索到
3
篇与
的结果
2020-05-17
Mybatis缓存
简介查询 → 连接数据库 消耗资源 一次查询结果,暂存在一个可以直接取到的地方 → 内存:缓存 再次查询相同数据的时候,不用连接数据库,而是从缓存中读取。什么是缓存[Cache]?存在在内存中的临时数据。将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的问题。为什么使用缓存?减少和数据库的交互次数,减少系统开销,提高系统效率。什么样的数据能使用缓存?经常查询并且不经常改变的数据。【可以使用缓存】Mybatis缓存MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。MyBatis系统中默认定义了两极缓存:一级缓存和二级缓存默认情况下,只有一级缓存开启。 (SqlSession级别的缓存, 也称为本地缓存)二级缓存需要手动开启和配置,他是基于namespace级别的缓存。为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存。一级缓存一级缓存也叫本地缓存与数据库同一次会话期间查询到的数据会放在本地缓存中。以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库。二级缓存二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存。基于namespace级别的缓存, 一个名称空间,对应一个二级缓存;工作机制:一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;新的会话查询信息,就可以从二级缓存中获取内容;不同的mapper查出的数据会放在自己对应的缓存(map)中。开启全局缓存步骤:开启全局缓存在mybatis-config.xml中添加<!--显示的开启全局缓存--> <setting name="cacheEnabled" value="true"/>在要使用二级缓存的Mapper.xml中开启<!--在当前Mapper.xml中使用二级缓存--> <cache/>也可以自定义参数<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。evication:LRU– 最近最少使用:移除最长时间不被使用的对象。【默认】FIFO – 先进先出:按对象进入缓存的顺序来移除它们。SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。测试问题:在Mapper.xml中直接声明"<cache/>"报错,我们需要将实体类序列化。Caused by: java.io.NoSerializbleException:com.jam.pojo.User在POJO的类中 implements Serializable执行结果Opening JDBC Connection ==> Preparing: select * from mybatis.user where id = ? ==> Parameters: 1(Integer) <== Columns: id, name, pwd <== Row: 1, jam, 123 <== Total: 1 User(id=1, name=jam, pwd=123) Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@2f0a87b3] Returned connection 789219251 to pool. Cache Hit Ratio [com.jam.dao.UserMapper]: 0.5 User(id=1, name=jam, pwd=123) true Process finished with exit code 0小结:只要开启了二级缓存,在同一个Mapper下就有效所有的数据都会先放在一级缓存中只有当会话提交或者关闭的时候,才会提交到二级缓存中。缓存原理缓存顺序:先看二级缓存中有没有再看一级缓存中有没有查询数据库
2020年05月17日
695 阅读
0 评论
0 点赞
2020-05-01
Mybatis多对一处理。
多对一:多个学生对应一个老师对于学生而言,关联 多个学生,关联一个老师【多对一】对于老师而言, 一个老师,有很多学生【一对多】数据库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, PRIMARY KEY (`id`), KEY `fktid` (`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'); Student类 (省略了构造函数、Setter/Getter)public class Student { private int id; private String name; //学生需要关联一个老师 private Teacher teacher; } Teacher类 (省略了构造函数、Setter/Getter)public class Teacher { private int id; private String name; } 测试环境搭建新建实体类Teacher,Student建立Mapper接口建立Mapper.xml文件【在Resources目录下需要一级一级建立文件夹】在核心配置中绑定注册我们的Mapper接口或者文件测试查询是否能成功StudentMapper接口(interface)//查询所有学生信息,以及对于的老师的信息 public List<Student> getStudent(); // public List<Student> getStudent2(); 按照查询嵌套处理思路:1.查询所有的学生信息2.根据查询出来的学生的tid,寻找对应的老师 子查询<select id="getStudent" resultMap="StudentTeacher"> select * from student </select> <resultMap id="StudentTeacher" type="Student"> <result property="id" column="id"/> <result property="name" column="name"/> <!--复杂的属性 对象:association 集合:collection --> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap> <select id="getTeacher" resultType="Teacher"> select * from teacher where id = #{id} </select> 按照结果嵌套处理<!--按照结果处理--> <select id="getStudent2" resultMap="StudentTeacher2"> select s.id sid,s.name sname,t.name tname from student s,teacher t where s.tid = t.id; </select> <resultMap id="StudentTeacher2" type="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" javaType="Teacher"> <result property="name" column="tname"/> </association> </resultMap> 测试代码@Test public void getStudent(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> studentList = mapper.getStudent(); for (Student student : studentList) { System.out.println(student); } sqlSession.close(); } @Test public void getStudent2(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> studentList = mapper.getStudent2(); for (Student student : studentList) { System.out.println(student); } sqlSession.close(); } 多对一掌握了?那么可以下一课了,来看看一对多吧!点击访问
2020年05月01日
440 阅读
0 评论
0 点赞
2020-04-23
Maven+Mybatis入门问题-无法编译java目录下的xml文件
初学maven+Mybatis的时候,把Mapper.xml放到了dao包下,编译的时候target目录下不会编译在java项目中的xml。解决方法在pom.xml中加入<!-- build中配置resources,来防止我们资源导出失败的问题 --> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> </build> 最后clean一下,就行。Q&A我在自学的时候,加了这个也没用,试了很多方法。比如:xml删除中文注释,build中加入resources目录之类,都没用。最后关机睡觉,第二天打开就突然可以了。配置了buil的同学如果还没用,建议关闭idea重新打开试试。
2020年04月23日
422 阅读
0 评论
0 点赞