第三篇 常用配置和动态SQL

时间:2022-03-09 13:19:07

对于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的操作,如果想学习更多或者平时的开发用到更多可以参考官方文档。