zoukankan      html  css  js  c++  java
  • (六)mybatis 全局配置文件讲解

    目录


    properties (属性)

    需求:

    将数据库连接参数单独配置在 db.properties 中,只需要在 SqlMapConfig.xml 中加载 db.properties 的属性值,在 SqlMapConfig.xml 中不再需要对数据库连接进行 硬编码

    这里有个小疑问,不在 SqlMapConfig.xml 中对数据库参数进行硬编码,那么在 db.properties 中就不是硬编码了吗?

    这个问题的答案是,依然是硬编码,只不过在 db.properties 的数据量很少,方便我们后期去修改,所以硬编码,也无所谓;但是在 SqlMapConfig.xml 中,要是硬编码的话,后期去变动,就要在那么多的信息中进行寻找了。因为,一般修改,都是程序去读取文件进行修改的(比如,集群,几十台机器,在一起,手动去改,多费劲,因此,一般都指使程序去改),所以在 SqlMapConfig.xml 中进行信息的抽取、修改是很费劲的一件事,那么多信息 ;

     <!--加载数据库配置文件-->
        <!--resource 是通过类路径加载的-->
        <!--url 是通过绝对路径加载的-->
        <properties resource="xin/ijava/config/db.properties">
            <!--properties标签里面,还能配置一些属性名和属性值-->
            <property name="" value=""></property>
        </properties>

    注意:

    在 properties 元素体内定义的属性首先被加载 ;
    
    然后会读取 properties 元素中的 resource 或 url 加载的属性,它会覆盖已读取的同名属性 ;
    
    最后读取 parameterType 传递的属性,它会覆盖已读取的同名属性 ;
    

    它们存在优先级的 ;因此,注意,不要在映射关系中,取的名字,与在上面的三个地方重名了,否则是读取上面的地方的数据的 ;

    <select id="findUsersByName" parameterType="java.lang.String" resultType="xin.ijava.pojo.User">
            SELECT * FROM User where name LIKE  '%${jdbc.url}%'
        </select>
    
    [service] 2018-09-05 23:08:14,250 - test.findUsersByName -1818
    [main] DEBUG test.findUsersByName - ==>  
     Preparing: SELECT * FROM User where name LIKE '%jdbc:mysql:///mybatisDay01?charset=utf-8%' 
    

    我们可以看到,由于我们在映射关系文件中,使用了和 properties 元素中的 resource 资源加载的 db.properties 文件中的重名 jdbc.url 了,因此,读取了配置文件中的数据,而非我们传进去的参数了 ;

    这种情况,发生在拼接 sql 的时候,这是,传进来的参数的优先级是最低的

    文件取名字,要有一定的特殊性,比如 xxx.xxx 这样,就很难在映射关系中出现重名 ;


    settings 全局参数配置

    mybatis 在运行的时候,可以调整一些运行参数。

    比如:开启二级缓存、开启延迟加载 ;

    需要主要,不能加错了,因为全局参数将影响 mybatis 的运行行为 ;加错了,将导致 mybatis 出现各种问题 ;

    需要时再配置 ;

    (百度下具体的参数说明)


    typeAliases 别名设置

    在映射文件中,parameterTyperesultType 的中类型,对于我们开发的 pojo 类,类的全路径名会很长,我们可以设定别名进行简写 ;

    <!--别名设置-->
        <typeAliases>
            <!--单个别名定义-->
            <typeAlias type="xin.ijava.pojo.User" alias="user" />
            <!--批量别名定义-->
            <!--给包名,mybatis 会自动的定义别名,别名就是类的名字,首字母大小写都行-->
            <!--多个包,就写多个-->
            <package name="xin.ijava.pojo"/>
        </typeAliases>

    使用别名 user :

     <select id="findUsersByName" parameterType="java.lang.String" resultType="user">
            SELECT * FROM User where name LIKE  '%${value}%'
        </select>

    其中,mybatis 中有许多已经定义好的别名,针对 java 中提供的基本类型 ;


    typeHandlers 类型处理器

    在学 JDBC 的时候,就知道,我们需要将 java 中的类型,转成数据库可以接受的类型 ;比如 String -》 varchar

    其实我们在写映射文件的时候,就已经进行了转换,比如传进去的是 javadate类型,我们是不需要手动转成 sqldate的,类型处理器自己帮我们转换了;不像之前使用 Dbutils 的时候,还需要手动处理一些类型 ;

    mybatis 默认有好多的类型处理器,一般这些处理器,就已经满足日常开发的转换需要了 ;


    mapper (映射器)

    1. 通过 resource 一次加载一个 映射文件

      <mappers>
          <!--地址从src包开始写,用斜杠代替 . -->
          <mapper resource="xin/ijava/config/sqlmap/User.xml"/>
          <mapper resource="xin/ijava/config/mapper/UserMapper.xml"/>
      </mappers>
      
    2. 通过mapper 接口 一次加载一个 映射文件

      <!--通过 mapper 接口,一次加载一个映射文件-->
          <!--
              需要满足一些规范:将接口使用 mapper 代理方法,
              然后接口名必须和映射文件名字一样,且在一个包下面
          -->
          <!--包 用点连接-->
          <mapper class="xin.ijava.dao.UserMapper"/>
    3. 通过 mapper 接口一次加载多个 映射文件 (重点内容

      <!--批量加载-->
          <!--
              需要满足一些规范:将接口使用 mapper 代理方法,
              然后接口名必须和映射文件名字一样,且在一个包下面
              name 中,写到包名就可,这样包下面的满足条件的 映射文件就会被加载
          -->
          <package name="xin.ijava.dao"/>

    细节

    上面的标签在全局配置文件中,进行配置的时候,是有顺序的,比如 settings 是在第二个,那么只能配置在第二个,不能配置在第三个、第四个 ;

  • 相关阅读:
    码农雷林鹏:php环境搭建
    HashMap底层实现原理
    Java基础面试题
    ==和equals的区别,为什么重写equals要重写hashCode
    Java8 函数式接口,方法引用,stream
    ArrayList、Vector、LinkedList的区别
    第二章——信息的表示和处理
    第一章——计算机系统漫游
    通过zuul修改请求参数——对请求参数进行解密
    Java 扫描实现 Ioc 动态注入,过滤器根据访问url调用自定义注解标记的类及其方法
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665679.html
Copyright © 2011-2022 走看看