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

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

在前面的文章<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

标签:Mybatis,typeAliases,别名,配置
0
投稿

猜你喜欢

  • springboot+springsecurity如何实现动态url细粒度权限认证

    2023-10-01 04:06:39
  • java中switch选择语句代码详解

    2023-09-28 19:34:29
  • Spring自动注入失败的解决方法

    2022-08-13 03:41:31
  • .NET Core使用C#扫描并读取图片中的文字

    2022-03-09 11:06:54
  • java集合Collection实现类解析ArrayList LinkedList及Vector

    2022-05-01 05:44:12
  • JAVA 静态代理模式详解及实例应用

    2021-10-20 05:39:00
  • ScrollView与ListView合用(正确计算Listview的高度)的问题解决

    2021-12-30 07:14:58
  • Java中的SuppressWarnings注解使用

    2023-08-18 17:31:19
  • SpringBoot实战之SSL配置详解

    2022-08-03 19:38:17
  • Android中NestedScrolling滑动机制详解

    2022-09-16 22:32:13
  • C#资源释放方法实例分析

    2022-03-22 04:46:20
  • Java 详解循环屏障CyclicBarrier如何实现多线程分段等待执行完成

    2022-02-16 04:50:49
  • SpringBoot使用Atomikos技术整合多数据源的实现

    2021-11-08 23:46:23
  • mybatis的插件机制示例详解

    2023-02-24 23:46:17
  • 区分Java中的ArrayList和LinkedList

    2021-05-26 11:09:55
  • Java实现简单的递归操作方法实例

    2021-11-01 14:37:32
  • IntelliJ IDEA快速创建getter和setter方法

    2023-06-04 00:44:46
  • 浅析Android 的 MediaPlayer类

    2021-06-01 01:50:08
  • SpringMVC如何接收参数各种场景

    2022-01-23 22:56:24
  • java WSDL接口webService实现方式

    2022-06-15 21:03:29
  • asp之家 软件编程 m.aspxhome.com