Spring基础课九:集成ORM框架Mybatis

a 夏天 提交于 2020-02-01 19:22:48

Mybatis

  1. 半自动的orm框架,其后期sql调优更方便

Mybatis的使用

  1. 新建Configuration.xml,配置<dataSource);

  2. SqlSessionFactoryBuilder通过配置文件创建SqlSessionFacotry,进而创建SqlSession,并且创建SqlSession过程会解析mapper.xml文件,并且为每一个sql语句创建statement缓存起来,真正执行mapper.xml中方法时,会通过方法名从缓存中获取statement,设置参数,执行;

  3. SqlSession可以设置事务级别,是否开启事务,默认是开启事务,并且SqlSession和SqlSessionFacotry均有getConfiguration()方法来返回一个Configuration对象,可以用来查看和改变其中的配置参数;

  4. 新建ModelMapper.xml文件,并在configuration.xml中添加<mapper);

  5. 通过sqlSession来操作ModelMapper.xml中的方法,更优雅的方式是定义一个Mapper接口,接口中方法和mapper.xml中定义的方法一致,并且接口的全限定名和mapper.xml的namespace完全相同,这样通过sqlSession的getMapper方法,可以生成一个动态代理的Mapper实现类,通过该类来完成mapper.xml中的方法调用,即构造SqlCommand,执行mapper.xml中定义的sql语句;

  6. 执行mapper.xml中的各个方法时,可以添加一个RowBounds的参数,来限制返回条数和指定跳过的条数;

  7. Mybatis还提供了一个SQL类,来方便拼装sql,如:

	new SQL() .INSERT_INTO("PERSON") .VALUES("ID, FIRST_NAME", "${id}, ${firstName}") .VALUES("LAST_NAME", "${lastName}") .toString(); 

Mybatis扩展功能

  1. 拦截器,声明一个Interceptor接口的实现类,并在configuration.xml中注册,这样就会在执行SQL语句前后加入拦截器的逻辑,如,利用拦截器实现分页;

  2. 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;

  3. 一级缓存,是针对同一个SqlSession的,会将同一个SqlSession查询的sql和查询的结果以key-value的形式缓存起来,缓存的key是id+sql+limit+offset,这样下次同样的查询直接从缓存中返回,并且任何insert,delete,update操作都会清空缓存,mapper.xml中sql可以指定flushCache=true来清空缓存,一级缓存默认是开启的;

  4. 二级缓存,是应用级别的,以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逆向工程

  1. 通过配置文件,来生成mybatis访问数据库必备的mapper接口,xml配置文件和实体类;

  2. 配置文件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
  1. 一种方式是通过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>
  1. 另一种方式,使用单独的程序来生成,一个优点是有数据库注释;

  2. 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”》:字段注释插件,可以生成和数据库注释一致的字段注释;

  3. 更多参考:http://mbg.cndocs.ml/index.html,https://blog.csdn.net/isea533/article/details/42102297

小Tips

  1. mybatis generator 生成实体类,数据库是timestamp,实体类是java.util.date;
  2. OGNL在mapper.xml:基本数据类型 _parameter,自定义数据类型 属性名,集合 array,list,_paramter 和 java运算符;
  3. mapper.xml中KaTeX parse error: Expected 'EOF', got '#' at position 14: {} 会直接将参数拼接,而#̲{}是替换成?,通常{}用在order by 上,#{}用在参数替换上;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!