软件编程
位置:首页>> 软件编程>> java编程>> Mybatis配置之<typeAliases>别名配置元素解析

Mybatis配置之<typeAliases>别名配置元素解析

作者:DreamMakers  发布时间:2023-08-02 03:09:54 

标签:Mybatis,typeAliases,别名,配置

在前面的文章<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 类型内建了相应的类型别名。

它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

至此,关于别名的全部使用方法这里便介绍完成了,是不是很简单啊~

Mybatis别名的配置(两种方法)

对于mapper的映射xml文件

sql语句中存在着resultType。

修改前:写了接受实体类的全限定名

Mybatis配置之<typeAliases>别名配置元素解析

在mybatis的配置文件中添加

位置需要添加在configtion的标签下面;


<configuration>
   <typeAliases>
       <typeAlias type="com.uu.bean.News" alias="jj"/>
   </typeAliases>

修改后:

添加后在mapper的映射文件中全限定名中改为了配置的简单的别名

Mybatis配置之<typeAliases>别名配置元素解析

第二种方式:

在代码中:


import org.apache.ibatis.type.Alias;
@Alias("jj")
public class News {

在配置文件中:


<configuration>
   <typeAliases>
       <package name="com.uu.bean"/>
   </typeAliases>

可以达到与配置中声名相同的效果。

来源:https://majing.blog.csdn.net/article/details/71503263

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com