在上一篇文章中荔枝梳理了一些特殊的SQL查询和一对多、多对一的映射关系,而在这篇文章中荔枝将会梳理有关MyBatis动态SQL和MyBatis缓存的相关知识,同时也稍微了解了有关MyBatis中借助MAVEN中的插件管理来实现逆向工程。希望对需要的小伙伴有帮助哈哈哈~~~
目录
一、动态SQL
1.1 if标签
1.2 where标签
1.3 trim标签
1.4 choose、when、otherwise标签
1.5 foreach标签
1.5 sql标签
二、MyBatis的缓存
2.1 一级缓存
2.2 二级缓存
2.3 MyBatis缓存查询顺序
三、MyBatis的逆向工程(MBG)
总结
Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的问题。在执行SQL查询时,只有属性值存在我们才能做相应的SQL语句的拼接,因此我们需要动态来拼装SQL语句。在JDBC中我们根据不同的条件拼接SQL语句时往往需要注意一些预留处理,而MyBatis的动态SQL特性就极大地简化了这一处理过程。
根据if标签中的test属性所对应的表达式决定标签中的内容是否需要拼接到SQL中。
这段实例demo中,我们需要在select语句中添加一个恒成立的条件1=1,这是为了防止SQL语句在某些属性不存在时出现的拼接错误。动态SQL的特性其实类似一种按需加载的过程,弹性拼接起SQL语句。if标签中的test属性其实就是if标签中的SQL语句段拼接的条件,满足这个条件才能拼接在原有的查询SQL语句中。
where标签可以辅助我们动态生成SQL语句中的where关键字,当where后面有内容时,where标签会帮助我们自动生成where关键字,同时会去掉内容前多余的and和or关键字,此时就无需我们手动添加where关键字和恒成立的条件了;当where后面没有内容时,此时不会生成where关键字。
若标签中有内容时,属性功能正常;若标签没有内容时, trim不会有任何效果。
几个属性:
prefix:将trim标签中内容前面添加指定内容
suffix:将trim标签中内容后面添加指定内容
prefixOverrides:将trim标签中内容前面去掉指定内容
suffixOverrides:将trim标签中内容后面去掉指定内容
choose和when标签组合起来相当于if...else if...else的结构,如果所有的when条件都不满足,则会执行otherwise中的条件。
foreach标签简单来说就是一个循环,可以被用来执行批量操作,foreach标签有五种属性:
delete * from t_emp where eid in
#{eid}
sql标签又成为SQL片段,它可以用来记录常用的sql执行语句。通过include标签来引用SQL片段。
eid,emp_name,age,sex,email
MyBatis的一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据就会从缓存中直接获取而不会从数据库中重新访问。一级缓存是默认开启的。
一级缓存失效的四种情况:
手动清空缓存:
sqlSession.clearCache();
二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSessioni查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取。
二级缓存开启的条件:
实体类实现序列化接口
public class Emp implements Serializable
二级缓存失效的情况:
两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效。
二级缓存的相关配置
在二级缓存的开启条件中,我们发现
eviction属性:缓存回收策略
默认的是LRU。
flushlnterval属性:刷新间隔,单位毫秒
默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用增删改语句时刷新
size属性:引用数目,正整数
代表缓存最多可以存储多少个对象,太大容易导致内存溢出
readOnly属性:只读,true/false
true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。
false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是flse。
首先先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。如果二级缓存没有命中,再查询一级缓存;如果一级缓存也没有命中,则查询数据库。注意在sqlSession关闭之后,一级缓存中的数据会写入二级缓存
正向工程:先创建ava实体类,由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的。
逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:
在使用逆向工程之前首先应该配置好项目依赖
pom.xml
4.0.0
com.crj
MyBatis_MBG
1.0-SNAPSHOT
jar
org.mybatis
mybatis
3.5.7
junit
junit
4.12
mysql
mysql-connector-java
5.1.3
log4j
log4j
1.2.17
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.0
org.mybatis.generator
mybatis-generator-core
1.3.2
com.mchange
c3p0
0.9.2
mysql
mysql-connector-java
5.1.8
逆向工程配置文件:
测试类中我们这样来进行条件查询:
EmpExample example = new EmpExample();
//这里可以借助example.createCriteria().and开头的方法来设置查询条件
example.createCriteria().andEmpNameEqualTo("荔枝");
mapper.selectByExample(example);
嘿哈!MyBatis的相关知识学习也就大致到这里啦,荔枝接下来会继续学习mall项目,希望九月份能遇见不一样的自己吧哈哈哈哈。最近看丙哥的文章嘿嘿,分享给大家一句话:习惯自律,享受孤独~~~
今朝已然成为过去,明日依然向往未来!我是小荔枝,在技术成长的路上与你相伴,码文不易,麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~