网站开发地址,西安优化网站技术,长春seo服务,太原网站建设地图前言 在上一篇文章中荔枝梳理了一些特殊的SQL查询和一对多、多对一的映射关系#xff0c;而在这篇文章中荔枝将会梳理有关MyBatis动态SQL和MyBatis缓存的相关知识#xff0c;同时也稍微了解了有关MyBatis中借助MAVEN中的插件管理来实现逆向工程。希望对需要的小伙伴有帮助哈哈…前言 在上一篇文章中荔枝梳理了一些特殊的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
总结 一、动态SQL Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能它存在的意义是为了解决拼接SQL语句字符串时的问题。在执行SQL查询时只有属性值存在我们才能做相应的SQL语句的拼接因此我们需要动态来拼装SQL语句。在JDBC中我们根据不同的条件拼接SQL语句时往往需要注意一些预留处理而MyBatis的动态SQL特性就极大地简化了这一处理过程。
1.1 if标签
根据if标签中的test属性所对应的表达式决定标签中的内容是否需要拼接到SQL中。
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.crj.mybatis.mapper.DynamicSQLMapper!-- ListEmp getEmpByCondition(Emp emp);--select idgetEmpByCondition resultTypeEmpselect * from t_emp where 11if testempName ! null and empName ! and emp_name #{empName}/ifif testage ! null and age ! and age #{age}/ifif testsex ! null and sex ! and sex #{sex}/if/select
/mapper 这段实例demo中我们需要在select语句中添加一个恒成立的条件11这是为了防止SQL语句在某些属性不存在时出现的拼接错误。动态SQL的特性其实类似一种按需加载的过程弹性拼接起SQL语句。if标签中的test属性其实就是if标签中的SQL语句段拼接的条件满足这个条件才能拼接在原有的查询SQL语句中。
1.2 where标签 where标签可以辅助我们动态生成SQL语句中的where关键字当where后面有内容时where标签会帮助我们自动生成where关键字同时会去掉内容前多余的and和or关键字此时就无需我们手动添加where关键字和恒成立的条件了当where后面没有内容时此时不会生成where关键字。
!-- ListEmp getEmpByCondition(Emp emp);--select idgetEmpByCondition resultTypeEmpselect * from t_empwhereif testempName ! null and empName ! and emp_name #{empName}/ifif testage ! null and age ! and age #{age}/ifif testsex ! null and sex ! and sex #{sex}/if/where/select
1.3 trim标签
若标签中有内容时属性功能正常若标签没有内容时 trim不会有任何效果。
几个属性
prefix将trim标签中内容前面添加指定内容
suffix将trim标签中内容后面添加指定内容
prefixOverrides将trim标签中内容前面去掉指定内容
suffixOverrides将trim标签中内容后面去掉指定内容
!-- ListEmp getEmpByCondition(Emp emp);--select idgetEmpByCondition resultTypeEmpselect * from t_emptrim prefixwhere suffixOverridesand|orif testempName ! null and empName ! emp_name #{empName} and/ifif testage ! null and age ! age #{age} and/ifif testsex ! null and sex ! sex #{sex}/if/trim/select
1.4 choose、when、otherwise标签
choose和when标签组合起来相当于if...else if...else的结构如果所有的when条件都不满足则会执行otherwise中的条件。
!-- ListEmp getEmpByChoose(Emp emp);--select idgetEmpByChoose resultTypeEmpselect * from t_empwherechoosewhen testempName ! null and empName ! emp_name #{empName}/whenwhen testage ! null and age ! age #{age}/whenwhen testsex ! null and sex ! sex #{sex}/whenotherwisedid 1/otherwise/choose/where/select
1.5 foreach标签
foreach标签简单来说就是一个循环可以被用来执行批量操作foreach标签有五种属性
collection设置需要循环的数组或集合item循环出来的单个对象sqparator循环体之间的分隔符open循环的所有内容开头的内容close循环的所有内容结束的内容
!-- int deleteMoreByArray(Integer[] eids);--delete iddeleteMoreByArraydelete * from t_emp where eid inforeach collectioneids itemeid separator, open( close)#{eid}/foreach/delete
1.5 sql标签
sql标签又成为SQL片段它可以用来记录常用的sql执行语句。通过include标签来引用SQL片段。 sql idemColumnseid,emp_name,age,sex,email/sqlselect idgetEmpByChoose resultTypeEmpselect include refidemColumns/include from t_emp /select 二、MyBatis的缓存
2.1 一级缓存
MyBatis的一级缓存是SqlSession级别的通过同一个SqlSession查询的数据会被缓存下次查询相同的数据就会从缓存中直接获取而不会从数据库中重新访问。一级缓存是默认开启的。
一级缓存失效的四种情况
不同的SqlSession对应不同的一级缓存同一个SqlSession但是查询条件不同同一个SqlSessioni两次查询期间执行了任何一次增删改操作同一个SqlSession两次查询期间手动清空了缓存
手动清空缓存
sqlSession.clearCache();
2.2 二级缓存
二级缓存是SqlSessionFactory级别通过同一个SqlSessionFactory创建的SqlSessioni查询的结果会被缓存此后若再次执行相同的查询语句结果就会从缓存中获取。
二级缓存开启的条件
在核心配置文件中设置全局配置属性cacheEnabledtrue,默认为true,不需要设置在映射文件中设置标签cache /二级缓存必须在SqlSession关闭或提交之后有效 sqlSession.close() | sqlSession.commit()查询的数据所转换的实体类类型必须实现序列化的接口
实体类实现序列化接口
public class Emp implements Serializable
二级缓存失效的情况
两次查询之间执行了任意的增删改会使一级和二级缓存同时失效。
二级缓存的相关配置
在二级缓存的开启条件中我们发现cache /标签是可以配置一些属性的具体如下
eviction属性缓存回收策略
LRU(Least Recently Used)-最近最少使用的移除最长时间不被使用的对象。FIFO(First in First out)-先进先出按对象进入缓存的顺序来移除它们。SOFT-软引用移除基于垃圾回收器状态和软引用规则的对象。WEAK-弱引用更积极地移除基于垃圾收集器状态和弱引用规则的对象。
默认的是LRU。
flushlnterval属性刷新间隔单位毫秒 默认情况是不设置也就是没有刷新间隔缓存仅仅调用增删改语句时刷新
size属性引用数目正整数 代表缓存最多可以存储多少个对象太大容易导致内存溢出
readOnly属性只读true/false true只读缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。 false读写缓存会返回缓存对象的拷贝通过序列化。这会慢一些但是安全因此默认是flse。
2.3 MyBatis缓存查询顺序 首先先查询二级缓存因为二级缓存中可能会有其他程序已经查出来的数据可以拿来直接使用。如果二级缓存没有命中再查询一级缓存如果一级缓存也没有命中则查询数据库。注意在sqlSession关闭之后一级缓存中的数据会写入二级缓存 三、MyBatis的逆向工程MBG
正向工程先创建ava实体类由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的。逆向工程先创建数据库表由框架负责根据数据库表反向生成如下资源
Java实体类Mapper接口 MapperB映射文件
在使用逆向工程之前首先应该配置好项目依赖
pom.xml
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.crj/groupIdartifactIdMyBatis_MBG/artifactIdversion1.0-SNAPSHOT/versionpackagingjar/packaging!--依赖MyBatis核心包--dependenciesdependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.7/version/dependency!--junit--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version/dependency!--mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.3/version/dependency!--log4j日志--dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependency/dependencies!--控制Maven在构建过程中相关配置--build!--构建过程用到的插件--plugins!--具体插件--plugingroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-maven-plugin/artifactIdversion1.3.0/version!--插件的依赖--dependencies!--逆向工程的核心依赖--dependencygroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-core/artifactIdversion1.3.2/version/dependency!--数据库连接池c3p0--dependencygroupIdcom.mchange/groupIdartifactIdc3p0/artifactIdversion0.9.2/version/dependency!--mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.8/version/dependency/dependencies/plugin/plugins/build
/project
逆向工程配置文件
?xml version1.0 encodingUTF-8?
!DOCTYPE generatorConfigurationPUBLIC -//mybatis.org//DTD MyBatis Generator Configuration 1.0//ENhttp://mybatis.org/dtd/mybatis-generator-config_1_0.dtd
generatorConfiguration!--targetRuntime执行生成的逆向工程的版本MyBatis3Simple生成基本的CRUDMyBatis生成带条件的CRUD--!-- 是否去除自动生成的注释 true是 false:否 --context idDB2Tables targetRuntimeMyBatis3Simple!-- 数据库连接 --jdbcConnection driverClasscom.mysql.jdbc.DriverconnectionURLjdbc:mysql://localhost:3306/mybatisuserIdrootpassword123456/jdbcConnection!--javaBean的生成策略生成model模型对应的包路径以及文件存放路径(targetProject)targetProject可以指定具体的路径也可以使用“MAVEN”来自动生成这样生成的代码会在target/generatord-source目录下--javaModelGenerator targetPackagecom.crj.mybatis.pojo targetProject.\src\main\java!--是否能够使用子包--property nameenableSubPackages valuetrue /!-- 从数据库返回的值被清理前后的空格 --property nametrimStrings valuetrue //javaModelGenerator!--SQL映射文件的生成策略对应的mapper.xml文件--sqlMapGenerator targetPackagecom.crj.mybatis.mapper targetProject.\src\main\resourcesproperty nameenableSubPackages valuetrue //sqlMapGenerator!-- 对应的Mapper接口类文件的生成策略 --javaClientGenerator typeXMLMAPPER targetPackagecom.crj.mybatis.mapper targetProject.\src\main\javaproperty nameenableSubPackages valuetrue //javaClientGenerator!-- 逆向分析的表 --table tableNamet_emp domainObjectNameEmp/table tableNamet_dept domainObjectNameDept//context
/generatorConfiguration
测试类中我们这样来进行条件查询:
EmpExample example new EmpExample();
//这里可以借助example.createCriteria().and开头的方法来设置查询条件
example.createCriteria().andEmpNameEqualTo(荔枝);
mapper.selectByExample(example);总结 嘿哈MyBatis的相关知识学习也就大致到这里啦荔枝接下来会继续学习mall项目希望九月份能遇见不一样的自己吧哈哈哈哈。最近看丙哥的文章嘿嘿分享给大家一句话习惯自律享受孤独~~~ 今朝已然成为过去明日依然向往未来我是小荔枝在技术成长的路上与你相伴码文不易麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~