为什么要给实体类配置别名?
- 目的是为了在引用实体类时可以使用实体类的别名来代替实体类,达到简写的目的
配置的方法(都是在mybatis的配置xml文件中进行配置)
- 第一种方法,给单独的某个实体类配置别名,如同下面的形式
<!--为实体类com.demo.dao.User配置一个别名User-->
<typeAliases>
<typeAlias type="com.demo.dao.User" alias="User"/>
</typeAliases>
- 第二种方法,批量为某个包下的所有实体类设置别名,配置形式如下
<!-- 为com.demo.dao包下的所有实体类配置别名,
MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名,
比如com.demo.dao.User这个实体类的别名就会被设置成User
-->
<typeAliases>
<package name="com.demo.dao"/>
</typeAliases>
代码例子说明
- 没有配置前的mapper文件夹的xml文件:如UserDao对应的UserMapper.xml文件如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.demo.dao.UserDao">
<select id="findUserById" resultType="com.demo.entity.User">
select * from user where id = #{id}
</select>
<insert id="addUser" parameterType="com.demo.entity.User" useGeneratedKeys="true" keyProperty="id">
insert into user(name,password,age) values(#{name},#{password},#{age})
</insert>
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
<update id="updateUser" parameterType="com.demo.entity.User">
update user set name = #{name}, password = #{password}, age = #{age} where id = #{id}
</update>
</mapper>
从这个配置文件中,我们可以看到<select>、<insert>和<update>三个标签元素的resultType都是User对象,需要设置这个User对象的类全限定名,即packname.classname。
我们发现一个问题,那就是这个类名,我们需要写多次,如果要改这个类名的话,我们需要在多个地方进行修改。很明显,这样配置的话很容易造成修改上的遗漏,同时也书写上也比较麻烦。因此,MyBatis为我们提供了一个简单方便的配置方法,那就是使用<typeAliases>标签元素,给实体类设置一个别名。
<?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="mysql.properties">
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/demo?characterEncoding=utf-8"/>
</properties>
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
<typeAliases>
<typeAlias alias="User" type="com.demo.entity.User"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<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>
<mappers>
<mapper resource="com\demo\resource\mapper\UserMapper.xml" />
</mappers>
</configuration>
如上所示,我们在原来的mybatis配置文件中增加了<typeAliases>标签,并将com.demo.dao.User这个实体类重命名为User,然后我们在mapper配置文件中就可以如下使用了。
备注:这里需要注意的是,typeAliases配置需要放置在settings之后,否则会出异常!!!
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.demo.dao.UserDao">
<select id="findUserById" resultType="User">
select * from user where id = #{id}
</select>
<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into user(name,password,age) values(#{name},#{password},#{age})
</insert>
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
<update id="updateUser" parameterType="User">
update user set name = #{name}, password = #{password}, age = #{age} where id = #{id}
</update>
</mapper>
这样即使实体类名修改了,所需要修改的地方也只有一处,便于集中管理.
在具体项目中,实体类是非常多的,所有更多时候我们需要批量为某个包下的所有实体类设置别名,所以只要在上面配置单个实体类的别名的地方,改成批量配置别名的方式即可,如下图
<typeAliases>
<!-- 为实体类com.demo.entity.User配置一个别名User -->
<!-- <typeAlias type="com.demo.entity.User" alias="User"/> -->
<!-- 为com.demo.entity包下的所有实体类配置别名,MyBatis默认的设置别名的方式就是去除类所在的包后的简单的类名
比如com.demo.entity.User这个实体类的别名就会被设置成User
-->
<package name="com.demo.entity"/>
</typeAliases>
参考了此处的文章:
https://blog.csdn.net/majinggogogo/article/details/71503263