Mybatis配置之别名配置元素解析
在前面的文章<mybatis配置之<properties>属性配置元素详述>,我们讲述了<properties>标签元素的配置和使用方法。
在这篇文章中,我们来说说<typealiases>标签元素,这个元素主要是用于对类型进行别名控制,具体什么意思呢?我们下面用一个示例说明,看了之后我相信你就会明白了。
这里我们贴出之前的userdao对应的mapper文件
如下所示:
<?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.majing.learning.mybatis.dao.userdao"> <select id="finduserbyid" resulttype="com.majing.learning.mybatis.entity.user"> select * from user where id = #{id} </select> <insert id="adduser" parametertype="com.majing.learning.mybatis.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.majing.learning.mybatis.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/mybatis?characterencoding=utf-8"/> </properties> <settings> <setting name="logimpl" value="log4j" /> </settings> <typealiases> <typealias alias="user" type="com.majing.learning.mybatis.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\majing\learning\mybatis\dao\userdaomapper.xml" /> </mappers> </configuration>
如上所示,我们在原来的mybatis配置文件中增加了<typealiases>标签,并将com.majing.learning.mybatis.entity.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.majing.learning.mybatis.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>
这样即使实体类名修改了,所需要修改的地方也只有一处,便于集中管理。
也许你会有疑问,如果实体类比较多怎么办?还不是要配置很多实体类和别名,no,no,no!下面跟大家说说另一种配置方法。
<?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/mybatis?characterencoding=utf-8"/> </properties> <settings> <setting name="logimpl" value="log4j" /> </settings> <typealiases> <package name="com.majing.learning.mybatis.entity"/> </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\majing\learning\mybatis\dao\userdaomapper.xml" /> </mappers> </configuration>
在这里,我们不再使用<typealiases>标签下<typealiase>,而是使用<package>标签,表示扫描该包名下的所有类(除了接口和匿名内部类),如果类名上有注解,则使用注解指定的名称作为别名,如果没有则使用类名首字母小写作为别名,如com.majing.learning.mybatis.entity.user这个类如果没有设置@alias注解,则此时会被关联到user这个别名上。
因此,按照上面的配置,我们还需要将实体类做一下调整,如下两种方式所示:
(1)给实体类添加@alias注解
package com.majing.learning.mybatis.entity; import org.apache.ibatis.type.alias; @alias(value="user") public class user { private int id; private string name; private string password; private int age; public int getid() { return id; } public void setid(int id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public string getpassword() { return password; } public void setpassword(string password) { this.password = password; } @override public string tostring() { return "user [id=" + id + ", name=" + name + ", password=" + password + ", age=" + age + "]"; } public int getage() { return age; } public void setage(int age) { this.age = age; } }
(2)实体类不加注解的情况下
修改mapper文件中引用的类型别名,改为小写,如下所示:
<?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.majing.learning.mybatis.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>
最后想说,mybatis为我们已经实现了很多别名,已经为许多常见的 java 类型内建了相应的类型别名。
它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | string |
byte | byte |
long | long |
short | short |
int | integer |
integer | integer |
double | double |
float | float |
boolean | boolean |
date | date |
decimal | bigdecimal |
bigdecimal | bigdecimal |
object | object |
map | map |
hashmap | hashmap |
list | list |
arraylist | arraylist |
collection | collection |
iterator | iterator |
至此,关于别名的全部使用方法这里便介绍完成了,是不是很简单啊~
mybatis别名的配置(两种方法)
对于mapper的映射xml文件
sql语句中存在着resulttype。
修改前:写了接受实体类的全限定名
在mybatis的配置文件中添加
位置需要添加在configtion的标签下面;
<configuration> <typealiases> <typealias type="com.uu.bean.news" alias="jj"/> </typealiases>
修改后:
添加后在mapper的映射文件中全限定名中改为了配置的简单的别名。
第二种方式:
在代码中:
import org.apache.ibatis.type.alias; @alias("jj") public class news {
在配置文件中:
<configuration> <typealiases> <package name="com.uu.bean"/> </typealiases>
可以达到与配置中声名相同的效果。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: 木瓜怎么吃最丰胸,这六种方法最有效