美文网首页
Mybatis (二) 配置

Mybatis (二) 配置

作者: 币来币往 | 来源:发表于2018-03-12 22:15 被阅读0次

    在上篇Mybatis 入门 中,我们只配置了environment, mappers两个最基本的配置项,但其实这里还有其他好多配置项可以添加,以优化或者方便我们的使用。下面我们一一介绍。

    properties

    格式如下:

    <properties resource="org/mybatis/example/config.properties">
      <property name="username" value="dev_user"/>
      <property name="password" value="F2Fa3!33TYyg"/>
    </properties>
    

    这里我们直接配置了property username, password, 还通过resources 引入了config.properties中配置的所有properties.
    有了这些properties我们就可以在接下来的各个配置项中使用这些properties,如

    <dataSource type="POOLED">
      ...
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
    

    其中的${username}, ${password} 就对应properties中的定义的username, password, 上述代码在运行中将会被转换成

    <dataSource type="POOLED">
      ...
      <property name="username" value="dev_user"/>
      <property name="password" value="F2Fa3!33TYyg"/>
    </dataSource>
    

    这样做的好处是:一次定义多次使用,方便修改;放在config.properties配置文件里面方便改动.

    这里既然有两个来源,那么就有可能遇到冲突问题,如config.properties中也定义了一个username, 那我们使用的时候用到的是哪个value呢?

    这里的优先级是,resource文件里面的properties 优先级高于直接定义的property, 所以同名的properties,文件里面的会覆盖直接定义的.
    不过这个也好理解,因为你想我们改动config.properties肯定比改动Mybatis配置文件方便,所以用更灵活易改的值去覆盖老值也更合理。

    那properties还有其他的来源吗? 答案是:还真有。
    当我们在build SqlSessionFactory的时候可以传一个properties对象进来

    SqlSessionFactory factory =
      sqlSessionFactoryBuilder.build(reader, props);
    
    // ... or ...
    
    SqlSessionFactory factory =
      new SqlSessionFactoryBuilder.build(reader, environment, props);
    

    这个Properties的优先级又会高于 config.properties中定义的properties. 毕竟都是给程序用的,java代码里面的优先级最高也是可以理解的.

    总结一下就是:

    • property有三个来源: properties里面定义, 通过resource 属性引入配置文件, build sqlSessionFactory的时候作为参数传入。
    • 优先级依次是: build 传入 > resource 引入 > 'properties 定义'

    使用properity的时候通常会有这样一种情况,如果定义了,我们希使用定义的值,如果没有定义,使用一个默认值,
    如下面例子那样,如果$username没有配置,则使用scott作为其value.

    <dataSource type="POOLED">
      ...
      <property name="username" value="${username:scott}"/>
      <property name="password" value="${password:tiger}"/>
    </dataSource>
    

    Mybatis 也支持默认值设置,只是默认是关闭这项功能的, 我们需要在properties中显示的打开

    <properties resource="org/mybatis/example/config.properties">
      <!-- ... -->
      <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- Enable this feature -->
    <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> <!-- Change default value of separator -->
    </properties>
    

    其中第一个properties是打开默认值设置属性,
    第二个参数是更改默认的分隔符,默认分割符是:,如果:在你的应用中有特殊含义,则可以通过第二个参数来修改。

    Settings

    通过改变以下属性的值来改动mybatis运行时的行为,如是否换成属性值,是否设置超时返回等等,具体列表可参考官网, 这里不在赘述.

    typeAlias

    主要是给一些比较长的,难记的名字,起一个短的,容易记的别名,方便使用

    <typeAliases>
      <typeAlias alias="Author" type="domain.blog.Author"/>
      <typeAlias alias="Blog" type="domain.blog.Blog"/>
      <typeAlias alias="Comment" type="domain.blog.Comment"/>
      <typeAlias alias="Post" type="domain.blog.Post"/>
      <typeAlias alias="Section" type="domain.blog.Section"/>
      <typeAlias alias="Tag" type="domain.blog.Tag"/>
    </typeAliases>
    

    typeHandlers

    java里面的数据类型和数据库里面的数据类型是不一样的,因此我们就需要在二者之间进行一个转换,typeHandlers就是负责在java和db之间进行数据转换的。默认情况下我们不需要指定typeHandler, myBatis会根据我们给定的java 对象类型,以及db端的数据类型,来自动选择一个合适的默认typeHandler来进行类型转换,具体列表可参考官网.
    如果想要使用自己定义的handler可以在这里指定

    objectFactory

    用来创建sql返回结果的对应的bean对象

    environments

    MyBatis可以配置多个不同的envrionment 来连接不同的db。如,连接测试环境,开发环境,生产环境等等。
    但是每个sqlSessionFactory 只能对应一个environment.

    <environments default="development">
      <environment id="development">
        <transactionManager type="JDBC">
          <property name="..." value="..."/>
        </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>
    

    其中,transactionManager 对应两个类型,

    • JDBC: 使用jdbc获取的connection进行事务管理
    • MANAGED: 一般在和其他container一起使用的时候使用这个选项,将事务的控制权交给container.

    dataSource type = 'POOLED' 表示使用连接池来管理connection。

    当我们在实例化一个sqlSessionFactory的时候,需要指定具体实例化哪个environment,如果不指定,则使用default的environment

    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
    
    //缺省的情况下,使用default='development'
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
    

    mappers

    定义sql语句的map关系,以及怎样找这些配置

    <!-- Using classpath relative resources -->
    <mappers>
      <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
      <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
      <mapper resource="org/mybatis/builder/PostMapper.xml"/>
    </mappers>
    <!-- Using url fully qualified paths -->
    <mappers>
      <mapper url="file:///var/mappers/AuthorMapper.xml"/>
      <mapper url="file:///var/mappers/BlogMapper.xml"/>
      <mapper url="file:///var/mappers/PostMapper.xml"/>
    </mappers>
    <!-- Using mapper interface classes -->
    <mappers>
      <mapper class="org.mybatis.builder.AuthorMapper"/>
      <mapper class="org.mybatis.builder.BlogMapper"/>
      <mapper class="org.mybatis.builder.PostMapper"/>
    </mappers>
    <!-- Register all interfaces in a package as mappers -->
    <mappers>
      <package name="org.mybatis.builder"/>
    </mappers>
    

    相关文章

      网友评论

          本文标题:Mybatis (二) 配置

          本文链接:https://www.haomeiwen.com/subject/fppbfftx.html