关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

Mybatis 动态sql的编写|开启二级缓存(下)

发布时间:2023-06-28 10:00:53
update set 标签 以往的修改操作都是将对象的所有属性都修改或者重写一遍,这样是不合逻辑的,因此可以在修改的 sql 语句里使用 if 标签来优化。 在 mapper 接口中写方法: void update(Person person); 在 xml 中编写 sql: update t_person person_name = #{personName}, age = #{age}, birthday = #{birthday}, sex = #{sex}, mobile = #{mobile}, address = #{address} where person_id = #{personId} if 标签想必好理解,但是set 标签是做什么的呢?原因是: 假如只修改名字,那么 sql 语句将变为: update t_person set person_name = ?, where ... 可以发现?占位符后面会有多余的逗号导致 sql 语法错误 标签会自动去除多余的逗号后缀。 值得注意的是:set 标签去除,后缀,where 标签去除and前缀。 foreach 标签 相信大家都知道foreach 跟循环有关系,没错,我们可以利用此标签来完成 批量删除 操作。 从 sql 的语句来看,批量删除应该这样写: delete from t_person where person_id in (?,?,?,...) 那么 in 后的形式该怎么用 mybatis 表达出来呢,有括号,不定数量的逗号… 不急,一步步来,先写 mapper接口: void deleteMany(@Param("myIds") int[] ids); 再编写 sql 语句: delete from t_person where person_id in #{id} 利用 foreach 就可以将参数集合中的值依次放入到 in 后的括号内:(id,id,id...) foreach 标签相关解释: collection:被循环的数组或者集合,注意如果是参数必须使用@Param 起名 open : 循环以什么开始 close :循环以什么结束 separator: 循环以什么分割 item : 每次循环的元素 编写测试类(不要忘记手动提交事务): 测试结果: 可以看到数组里的元素依次放入了括号内,并成功做到了批量删除。 useGeneratedKeys 获取插入数据的主键值 一般我们习惯将表中的主键设为自增长,那么在使用 insert 插入数据时,主键是不用赋值的,而是用 null 代替。那怎么才能在插入后直接得到该数据的主键值呢?那就使用 useGeneratedKeys。 来看具体的使用: insert into t_person values (null, #{personName}, #{age}, #{sex}, #{birthday}, #{mobile}, #{address}) 将值设为 true 后,keyPropetry 的值填写属性名,keyColumn 的值填写表的字段名。 编写测试类: @Test public void insert(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); PersonMapper mapper = sqlSession.getMapper(PersonMapper.class); Person person = new Person(null,"微凉",21,"1",new Date(),"1359356123","爱琴海"); mapper.insert(person); sqlSession.commit(); MybatisUtil.closeSqlSession(sqlSession); System.out.println(person); } 测试结果: 可以看到插入数据后的主键值为 240,这便是自动获取的结果。 Mybatis 缓存 有关 IO 操作一般都会很耗时,在一个 javaweb 项目中,页面到 tomcat 与 tomcat 到数据库都属于IO操作。因此 mybatis 在 tomcat 中创建了一块叫做缓存的空间,在缓存中保存比如查询操作的数据,以后进行重复操作时,就不必到数据库中获取了,而是直接在 tomcat 内部获取。 如果对数据库进行修改,缓存中的数据跟数据库中的对应不上,那么此时缓存中的就变成了脏数据。 一级缓存 特点: 默认开启 作用在同一个 SqlSession 中 脏数据的处理: 一旦执行增删改,立刻清空缓存 但是一级缓存并没有什么意义,因为作用范围的缘故,它只能在一个 SqlSession ,也就是一个事务内,一旦提交事务,缓存就会被清空,没有实战意义。 二级缓存 二级缓存的作用范围大,符合实战的需求,该如何开启: 1.实体类需要实现可序列化接口:implements Serializable 2.在 mybatis-config.xml 文件中添加 标签: 3.在对应 mapper 的 xml 文件中添加 标签: size:定义二级缓存空间大小 (单位是 M) eviction:定义缓存到达上限时的淘汰策略,常使用LRU算法: 叫做最近最久未使用算法,即清空最近使用次数最少的缓存 flushInterval:定义清空缓存的间隔时间 (单位 ms) 作用范围: 同一个sqlSessionFactory内,而且必须提交事务。 脏数据的处理: 1.一旦执行增删改,默认清空同一个 namespace 下的二级缓存。 2.自定义清空缓存的策略: flushCache属性,值为 true 时执行清空缓存,为 false 则不清空。 在 insert、delete、update 标签里默认为 true 在 select 标签里默认为 false 脏数据并不都是一定要清空,因此在增删改查标签内可以自由的设定缓存清空的策略。 mybatis 框架的记录到此结束,一共三篇,感兴趣的小伙伴可以订阅此专栏。

/template/Home/leiyu/PC/Static