zoukankan      html  css  js  c++  java
  • 第三篇 常用配置和动态SQL

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



                                 

  • 相关阅读:
    Reface.AppStarter 基本示例
    Reface.AppStarter 类型扫描 —— 获得项目中所有的实体类型
    多线程和异步有什么关联和区别?如何实现异步?
    事件总线功能库,Reface.EventBus 详细使用教程
    代理模式是什么?如何在 C# 中实现代理模式
    监听者模式在系统中的应用 —— 事件总线
    如何将 .NetFramework WebApi 按业务拆分成多个模块
    Reface.NPI 方法名称解析规则详解
    EF 太重,MyBatis 太轻,ORM 框架到底怎么选 ?
    Reface.AppStarter 框架初探
  • 原文地址:https://www.cnblogs.com/zhexuejun/p/11216993.html
Copyright © 2011-2022 走看看