您的位置:首页 > 其它

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

2016-04-16 00:41 513 查看

properties属性

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<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文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<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的映射类型,例如像下面那样:

<!-- 根据id查询得到一个user对象-->
<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文件里加入下面的代码:

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


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

<!-- 根据id查询得到一个user对象-->
<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>


这只是给单个类的全路径指定别名,当工程很大时,如果每个类都写一句<typeAlias type=”…” alias=”…” />来指定别名,还是很麻烦,能不能批量指定别名呢??

这就要请出来typeAliases中的package属性了。如下:

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


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

mappers(映射器)

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

<mappers>
<!-- 注册userMapper.xml文件 -->
<mapper resource="com/mybatis/mapping/userMapper.xml"/>
</mappers>


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

要像MyBatis学习记录(3)里那样用Mapper代理的方法开发DAO层接口

mapper文件的名字要和接口类的名字一样。比如接口类名字叫UserMapper.java,mapper文件的名字就应该叫UserMapper.xml

UserMapper.java 与UserMapper.xml两个文件要在一个目录(包)中

如图:



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

<mappers>
<!-- 批量加载 -->
<package name="com.mybatis.mapper" />
</mappers>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis 优化