Mybatis (二) 配置
在上篇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>