Mybatis (二) 配置

2018-03-12  本文已影响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代码里面的优先级最高也是可以理解的.

总结一下就是:

使用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 对应两个类型,

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>
上一篇 下一篇

猜你喜欢

热点阅读