MyBatis学习记录(4):MyBatis配置文件的优化

properties属性

之前几篇文章里的Mybatis配置文件都如下面代码所示:



<configuration>
      <environments default="development">
         <environment id="development">
              <transactionManager type="JDBC" />
              
              <dataSource type="POOLED">
                  <property name="driver" value="com.mysql.jdbc.Driver" />
                  <property name="url" value="jdbc:mysql://localhost:3306/test" />
                  <property name="username" value="root" />
                 <property name="password" value="dongjiong" />
              dataSource>
         environment>
     environments>
configuration>

数据库相关的信息直接写在配置文件里,其实可以将数据库的配置信息单独写一个db.properties文件,然后在Mybatis配置文件里通过properties属性引用这个文件。如下所示:

db.properties文件:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=dongjiong

在mybatisConfig.xml文件里引用该文件:
mybatisConfig.xml文件:



<configuration>
      <properties resource="db.properties"/>
      <environments default="development">
         <environment id="development">
              <transactionManager type="JDBC" />
              
              <dataSource type="POOLED">
                  <property name="driver" value="${jdbc.driver}" />
                  <property name="url" value="${jdbc.url}" />
                  <property name="username" value="${jdbc.username}" />
                 <property name="password" value="${jdbc.password}" />
              dataSource>
         environment>
     environments>
configuration>

由于在properties属性里还可以定义属性,如下:

<properties resource="db.properties">
    <property name="" value="">property>
    <property name="" value="">property>
properties>

所以这就涉及到属性加载顺序的问题。

MyBatis 将按照下面的顺序来加载属性:

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

因此,通过parameterType传递的属性具有最高优先级,resource或 url 加载的属性次之,最低优先级的是 properties 元素体内定义的属性。

typeAliases(类型别名)

之前在userMapper.xml配置文件里,对于select,delete等语句我们需要指定parameterType,resultType的映射类型,例如像下面那样:


<select id="selectUserById" parameterType="String" resultType="com.mybatis.domain.User">
    SELECT * FROM t_user WHERE uid=#{id}
select>


<insert id="insertUser" parameterType="com.mybatis.domain.User">
    INSERT INTO t_user VALUES(#{uid},#{uname},#{upassword})
insert>

当映射类型是实体类时,我们要写出全路径,这样名字就很长,所以可以通过typeAliases属性指定别名,用别名替代全路径。
在mybatisConfig.xml文件里加入下面的代码:

"db.properties" />
//定义别名    
<typeAliases>
    <typeAlias type="com.mybatis.domain.User" alias="User">typeAlias>
typeAliases>

然后在userMapper.xml文件里就可以使用这个别名了:


<select id="selectUserById" parameterType="String" resultType="User">
    SELECT * FROM t_user WHERE uid=#{id}
select>


<insert id="insertUser" parameterType="User">
    INSERT INTO t_user VALUES(#{uid},#{uname},#{upassword})
insert>



这只是给单个类的全路径指定别名,当工程很大时,如果每个类都写一句来指定别名,还是很麻烦,能不能批量指定别名呢??
这就要请出来typeAliases中的package属性了。如下:

<typeAliases>       
    <package name ="com.mybatis.domain" />
typeAliases>

package可以给一个包下的所有实体类指定别名,每个类的默认别名就是类名,例如com.mybatis.domain.User的别名就是User。首字母大小写都可以。

mappers(映射器)

在mybatisConfig.xml文件里加载userMapper.xml文件,之前我们写成下面的形式:

<mappers>
    
    <mapper resource="com/mybatis/mapping/userMapper.xml"/>
mappers>

同样的,如果实体类很多的话,能不能批量加载呢??答案是可以!不过要遵循一些规范:

  1. 要像MyBatis学习记录(3)里那样用Mapper代理的方法开发DAO层接口
  2. mapper文件的名字要和接口类的名字一样。比如接口类名字叫UserMapper.java,mapper文件的名字就应该叫UserMapper.xml
  3. UserMapper.java 与UserMapper.xml两个文件要在一个目录(包)中

如图:
这里写图片描述

遵循以上规范后,我们就可以用mapper属性下的package属性批量加载mapper文件了。

<mappers>
    
    <package name="com.mybatis.mapper" />
mappers>

你可能感兴趣的:(MyBatis学习记录(4):MyBatis配置文件的优化)