Mybatis
- 半自动的orm框架,其后期sql调优更方便
Mybatis的使用
-
新建Configuration.xml,配置<dataSource);
-
SqlSessionFactoryBuilder通过配置文件创建SqlSessionFacotry,进而创建SqlSession,并且创建SqlSession过程会解析mapper.xml文件,并且为每一个sql语句创建statement缓存起来,真正执行mapper.xml中方法时,会通过方法名从缓存中获取statement,设置参数,执行;
-
SqlSession可以设置事务级别,是否开启事务,默认是开启事务,并且SqlSession和SqlSessionFacotry均有getConfiguration()方法来返回一个Configuration对象,可以用来查看和改变其中的配置参数;
-
新建ModelMapper.xml文件,并在configuration.xml中添加<mapper);
-
通过sqlSession来操作ModelMapper.xml中的方法,更优雅的方式是定义一个Mapper接口,接口中方法和mapper.xml中定义的方法一致,并且接口的全限定名和mapper.xml的namespace完全相同,这样通过sqlSession的getMapper方法,可以生成一个动态代理的Mapper实现类,通过该类来完成mapper.xml中的方法调用,即构造SqlCommand,执行mapper.xml中定义的sql语句;
-
执行mapper.xml中的各个方法时,可以添加一个RowBounds的参数,来限制返回条数和指定跳过的条数;
-
Mybatis还提供了一个SQL类,来方便拼装sql,如:
new SQL() .INSERT_INTO("PERSON") .VALUES("ID, FIRST_NAME", "${id}, ${firstName}") .VALUES("LAST_NAME", "${lastName}") .toString();
Mybatis扩展功能
-
拦截器,声明一个Interceptor接口的实现类,并在configuration.xml中注册,这样就会在执行SQL语句前后加入拦截器的逻辑,如,利用拦截器实现分页;
-
mybatis的批量新增,有三种方式:一,直接for循环调用mapper的insert方法,二,创建SqlSession时使用ExecutorType.BATCH,然后for循环调用mapper的insert,三,mapper中定义sql,insert into table_1() value <foreach …,代码中传入List集合,推荐使用第三种,参考:https://www.cnblogs.com/gxyandwmm/p/9565002.html;
-
一级缓存,是针对同一个SqlSession的,会将同一个SqlSession查询的sql和查询的结果以key-value的形式缓存起来,缓存的key是id+sql+limit+offset,这样下次同样的查询直接从缓存中返回,并且任何insert,delete,update操作都会清空缓存,mapper.xml中sql可以指定flushCache=true来清空缓存,一级缓存默认是开启的;
-
二级缓存,是应用级别的,以mapper为单位存储,即会将每个mapper.xml中的查询方法结果缓存,缓存key是mapper+方法+参数,并且缓存结果可以存放内存,也可以存放在第三方存储,当mapper.xml中任何insert,delete,update方法调用也会清空缓存,配置方式,可以在configuration.xml中添加开启所有mapper的缓存,或者在某个mapper.xml文件中使用《cache eviction=“FIFO” flushInterval=“60000” size=“512” readOnly=“true” type=“cn.et.demo05.mapper.RedisCache”》《/cache》来开启单个mapper的二级缓存,默认二级缓存是关闭的,详细,参考:https://blog.csdn.net/Yang_Hui_Liang/article/details/88291752;
Mybatis逆向工程
-
通过配置文件,来生成mybatis访问数据库必备的mapper接口,xml配置文件和实体类;
-
配置文件mybatis-generator.xml
<jdbcConnection>:数据库连接
<javaModelGenerator>:model生成位置
<sqlMapGenerator>:xml文件生成位置
<javaClientGenerator>:javamapper接口生成位置
<table> :需要生成的表
<plugin type="com.lz.cts.plugin.ModelFieldCustomizePlugin">:可以生成字段注释
细节参考:https://github.com/winterComing/explore-spring-boot
- 一种方式是通过maven插件实现,插件名:mybatis-generator-maven-plugin;首先pom引入该插件和其配置(配置文件的目录,依赖,不加入到mvn生命周期等),然后新建mybatis-generator.xml文件,指定生成model,mapper的包名,mapper.xml文件的目录以及和数据表的对应关系,最后执行插件目标即可,mvn mybatis-generator:generate; 注意:反复执行该插件目标可能造成mapper*.xml文件累加,接口和实体类会覆盖,会造成mapper接口中自定义的方法被覆盖丢失;
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>${basedir}/src/main/java/mybatis/generatorConfig.xml</configurationFile>
<!-- 生成日志 -->
<verbose>true</verbose>
<!-- 不覆盖java类 -->
<overwrite>false</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>${oracle.jdbc.driver.version}</version>
</dependency>
</dependencies>
</plugin>
-
另一种方式,使用单独的程序来生成,一个优点是有数据库注释;
-
generatorConfig.xml常见的几个插件:《plugin type=“com.lz.cts.plugin.OraclePaginationPlugin”》分页插件,如果实际使用的是PageHelper,可以省略, 《plugin type=“org.mybatis.generator.plugins.SerializablePlugin”》序列化插件,即为每个生成的model类实现
Serializable接口,并添加一个serialVersionUID,《plugin type=“com.lz.cts.plugin.ModelFieldCustomizePlugin”》:字段注释插件,可以生成和数据库注释一致的字段注释; -
更多参考:http://mbg.cndocs.ml/index.html,https://blog.csdn.net/isea533/article/details/42102297
小Tips
- mybatis generator 生成实体类,数据库是timestamp,实体类是java.util.date;
- OGNL在mapper.xml:基本数据类型 _parameter,自定义数据类型 属性名,集合 array,list,_paramter 和 java运算符;
- mapper.xml中KaTeX parse error: Expected 'EOF', got '#' at position 14: {} 会直接将参数拼接,而#̲{}是替换成?,通常{}用在order by 上,#{}用在参数替换上;
来源:CSDN
作者:qq_28128035
链接:https://blog.csdn.net/qq_28128035/article/details/104130845