对于mybatis的配置和动态sql使用,其实在官方文档中都有详细说明,这篇文章我们将一些常用的比较重要提出来供自己学习和分享。
一、常用配置
在之前的入门中,已经粗浅说关于数据源,映射器的配置,但是mybatis的配置远不止这些,比较重要的就<properties/> 、<setting/>、<typeAliases/> 、<typeHandlers/>四个。
(1) <properties/>标签
<properties/>标签最常用在于数据源的属性中,之前的数据源配置已经用到,更多情况,为了安全和好维护,我们不会像之前那样将数据源信息直接写死在xml中。
而是利用单独利用properties文件配置属性,再动态的替换,而且在真实的工作中,应用系统是由配置人员去配置的,生产数据库一般对于开发者而言是保密的,所以甚至在一些
项目,配置都是通过编解码的方式加密的,我们还需要对<properties/>属性的进行解密,构建SqlSessionFactory,首先,在上篇博客的demo修改,在resource目录下建立文件 datasource.properties,内容如下
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=www1928..com
修改mybatisConfig.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org/DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration> <!-- 引入properties文件 --> <properties resource="datasource.properties"/> <settings> <!-- 配置 log4j 日志框架,主要方便查看sql--> <setting name="logImpl" value="LOG4J"/> </settings> <!-- 配置环境参数,可以配置开发环境和生产环境,默认是配置开发环境 --> <environments default="development"> <!-- 实际上是配置SqlSessionFactory,一个数据库只能对应一个SqlSessionFactory,即environment--> <environment id="development"> <!-- 配置事务管理为JDBC --> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源 --> <dataSource type="POOLED" > <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 配置映射器文件 --> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration>
完成后,依然执行service的mian方法,能得到结果集
(2)<setting/>标签设置
setting是mybatis中最为重要的一个属性配置,涉及内容也多,它会改变mybatis的运行时的行为,<setting>配置可以将mybatis强大的功能灵活性展现出来
<settings> <!-- 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存--> <setting name="cacheEnabled" value="true"/> <!-- 配置关联对象都会延迟加载--> <setting name="lazyLoadingEnabled" value="true"/> <!-- 配置关联属性是否全部映射--> <setting name="aggressiveLazyLoading" value="false"/> <!-- 配置是否允许单一语句返回多结果集(需要驱动支持)--> <setting name="multipleResultSetsEnabled" value="true"/> <!-- 配置是否使用列标签代替列名--> <setting name="useColumnLabel" value="true"/> <!-- 配置允许 JDBC 支持自动生成主键--> <setting name="useGeneratedKeys" value="false"/> <!-- 配置 指定 MyBatis 应如何自动映射列到字段或属性--> <setting name="autoMappingBehavior" value="PARTIAL"/> <!-- 配置指定发现自动映射目标未知列(或者未知属性类型)的行为--> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <!-- 配置默认的执行器--> <setting name="defaultExecutorType" value="SIMPLE"/> <!-- 配置设置超时时间--> <setting name="defaultStatementTimeout" value="25"/> <!-- 配置为驱动的结果集获取数量(fetchSize)设置一个提示值--> <setting name="defaultFetchSize" value="100"/> <!-- 配置 log4j 日志框架,主要方便查看sql--> <setting name="safeResultHandlerEnabled" value="false"/> <!-- 配置允许在嵌套语句中使用分页(RowBounds)--> <setting name="mapUnderscoreToCamelCase" value="false"/> <!-- 配置MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询--> <setting name="localCacheScope" value="SESSION"/> <!-- 配置当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型--> <setting name="jdbcTypeForNull" value="OTHER"/> <!-- 配置指定哪个对象的方法触发一次延迟加载--> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <!-- 配置 log4j 日志框架,主要方便查看sql--> <setting name="logImpl" value="LOG4J"/> </settings>
(3)<typeAliases/>标签
<typeAliases/>标签时类型别名,其实就是是为 Java 类型设置一个短的名字。 它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余,可以是代码变得更加清晰,维护性更高
<typeAliases> <typeAlias alias="Author" type="domain.blog.Author"/> <typeAlias alias="Blog" type="domain.blog.Blog"/> </typeAliases>
当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases> <package name="domain.blog"/> </typeAliases>
(4)<typeHandlers/>标签
java中的数据类型个数据库数据类型还有有一定的差异,但是要终究要完成数据映射,所以对于无法对应的数据类型,mybatis提供相应的数据类型转换<typeHandlers/>处理器,常见数据类型处理 , 有 blob字段和byte[] , NUMERIC和int, CLOB/LONGVARCHAR和String,配置如下:
<typeHandlers> <typeHandler handler="IntegerTypeHandler"/> <typeHandler handler="BlobTypeHandler"/> <typeHandler handler="ClobTypeHandler"/> </typeHandlers>
类型处理器可以参照官方文档配置,当然,处理官方的类型处理器,开发还可以自定义类型处理器,官方文档中有例子。
二、动态SQL
在没有mybatis的时候,由于sql是由开发者手动编写,但是由于有很多业务复杂,所以大多时候都离不开sql的拼接,对于拼接的sql也是一件很难心的事,所以mybatis提供了动态sql的实现方法。
(1)sql和include标签
sql和include标签可以解决SQL编写中,重复字段多的问题,有效的减少代码量,使用如下:
<sql id="base_colunm"> NAME, AGE </sql> <select id="getUserInfoByName" resultType="map"> SELECT <include refid="base_colunm" /> FROM USER WHERE NAME = #{NAME} </select>
当然,这两个标签还可以用在表名替换等。
(2) if和where
if和where配置可以有效的解决where条件拼接问题,where标签还可以解决and等连接符出现第一次条件的问腿,使用如下:
<select id="getUserInfoByAge" resultType="map"> SELECT <include refid="base_colunm" /> FROM USER <where> <if test="AGE != null"> AND AGE = #{AGE} </if> <if test="NAME != null"> AND NAME = #{NAME} </if> </where> </select>
(3)choose (when, otherwise)
如果上面的方式解决了多个条件拼接的问题,那么choose (when, otherwise)解决了条件多选一的问题,配置where标签,使用:
<select id="getUserInfo" resultType="map"> SELECT <include refid="base_colunm" /> FROM USER <where> <choose> <when test="AGE != null"> AND AGE = #{AGE} </when> <otherwise> AND NAME = #{NAME} </otherwise> </choose> </where> </select>
(4)<foreach/>标签
<foreach/>可以帮助我们遍历list或者map,特别像含IN 、NOT IN、EXIST这样条件,除此之外,还可以拼接SQL字段等
<delete id="deleteUserByName" > DELETE FROM USER WHERE NAME IN <foreach collection="nameList" index="index" item="val" open="(" close=")" separator=","> #{val} </foreach> </delete>
collection:表示要遍历的集合或者数组
index:索引,list的是元素索引,map的话是key值
item:集合中的元素
open/close:封闭的符号
separator:分割符号
(5)set标签
在update语句的字段拼接我们可以使用上面的标签配合完成,但是mybatis也提供了set标签可以更方便更简洁,如下:
<update id="updateUser"> update Author <set> <if test="username != null">username=#{username},</if> <if test="password != null">password=#{password},</if> <if test="email != null">email=#{email},</if> <if test="bio != null">bio=#{bio}</if> </set> where id=#{id} </update>
以上就是经常用到关于mybatis的操作,如果想学习更多或者平时的开发用到更多可以参考官方文档。