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 类型内建了相应的类型别名。
它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的特殊处理。
别名 | 映射的类型 |
---|---|
_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>
可以达到与配置中声名相同的效果。
来源:https://majing.blog.csdn.net/article/details/71503263
猜你喜欢
- 一、问题描述今天使用SDK Manager将Android SDK的版本更新到了Android 5.1的版本,eclipse创建androi
- 本文实例为大家分享了java实现简单斗地主的具体代码,供大家参考,具体内容如下第一种方法 /** * @param args */ /**
- 感谢《Android源码设计模式解析与实战》 何红辉 关爱民 著适配器模式在我们的开发中使用率极高,从代码中随处可见的Adapter就可以判
- 一、Kotlin 调用 Java1. kotlin 关键字转义java 中的方法或变量 是 kotlin 的关键字时,使用反引号 `` 对关
- (注意:本文基于JDK1.8) 前言Vector是线程安全的动态数组类,提供4个创建Vector对象的构造方法,接下来我们逐个分析
- 问题背景昨晚同事找我帮他看一个问题,他使用mybatis-plus中提供的updateById方法,想将查询结果中某个字段原本不为null的
- 1.创建一个线程Java操作线程最核心的类就是Thread类创建线程有很多方法,下面我们写一个Mythread类继承 Thread 类重写r
- 在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作。然而在Java中除了提供LockAPI外还在语
- 本文实例为大家分享了java利用数组随机抽取幸运观众的具体代码,供大家参考,具体内容如下思想:首先将所有观众姓名生成数组,然后获取数组元素的
- import java.io.BufferedReader; import java.io.IOException;  
- 1.接口中的默认方法和静态方法Java 8中允许接口中包含具有具体实现的方法,该方法称为 “默认方法” ,默认方法使用 default 关键
- 前言最近在逛博客的时候看到了有关Redis方面的面试题,其中提到了Redis在内存达到最大限制的时候会使用LRU等淘汰机制,然后找了这方面的
- pom.xml文件需要的内容<dependency> <groupId>re
- 在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样?动手做实验:interface A{ void
- 异常日志[com.alibaba.dubbo.rpc.filter.TimeoutFilter] - [DUBBO] invok
- Mybatis基础回顾与高级应用数据库:mysql5.7jdk:15引入依赖<!--引入依赖--> &
- MultiFrameImageStreamCompleterMultiFrameImageStreamCompleter 是一个可组合的 I
- 一、非配置文件注入1、注入普通字符串直接附在属性名上,在 Bean 初始化时,会赋初始值。@Value("admin")
- CAS原理在计算机科学中,比较和交换(Compare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较
- 对于因为编程错误而导致的异常,或者是不能期望程序捕获的