一、学习目标
在之前的学习博客里对数据进行增删改查的操作,都是基于数据库表的列名Java对象的属性名一致的情况下,但是,这个世界并不是这么美好。
当数据库表的列名与Java对象的属性名不一致,或者数据类型需要特殊处理;此外,如果数据库中的某个列是枚举类型,并且需要将这个列的值映射到Java的枚举类型;,如果查询结果需要映射到一个包含多个属性、嵌套对象或集合的复杂Java对象中。这些情况就需要使用结果映射来定义它们之间的对应关系。
二、ResultMap
在mybatis官方文档中提到,resultmap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets
数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。由此可见,resultmap在mybatis学习中的重要性。
在官方文档中提到,ResultMap 的设计思想是:对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
以之前的博客为例,数据库中的users表,与实体类user对应,其中列名与name,age等属性的命名也是一致的,然而如果出现列名与java实体类的属性名不一致的情况呢?
在之前的博客的情况下,我们进行一些改动
数据库的设计
实体类:
public class User {
private int id;
private String name;
private int uage;
public User() {
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.uage = age;
}
public int getUid() {
return id;
}
public void setUid(int uid) {
this.id = uid;
}
public String getUname() {
return name;
}
public void setUname(String uname) {
this.name = uname;
}
public int getUage() {
return uage;
}
public void setUage(int uage) {
this.uage = uage;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + uage +
'}';
}
}
1.为列名指定别名 , 别名和java实体类的属性名一致
例子中,age为列名,uage为别名和实体类的属性名
<select id="selectUser" resultType="User">
select id , name , age as uage from users where id = #{id}
</select>
2.使用结果集映射->ResultMap
<resultMap id="UserMap" type="User">
<id column="age" property="uage"/>
</resultMap>
<select id="selectUser" resultMap="UserMap">
select * from users
</select>
其中,column是数据库表的列名 , property是对应实体类的属性名
但是,在mybatis官方文档也提到,MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子。 我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们并不都是那样。 如果能有一种数据库映射模式,完美适配所有的应用程序,那就太好了,但可惜也没有。 而 ResultMap 就是 MyBatis 对这个问题的答案。
3.测试
@Test
public void selectUser() {
// 通过MybatisUtils工具类获取SqlSession对象,SqlSession是MyBatis的核心接口,用于执行SQL语句
SqlSession session = MybatisUtils.getSession();
// 通过SqlSession的getMapper方法获取UserMapper接口的代理对象,该对象用于执行与User表相关的数据库操作
UserMapper mapper = session.getMapper(UserMapper.class);
// 调用UserMapper接口的selectUser方法,该方法应该返回User对象的列表
List<User> users = mapper.selectUser();
// 遍历返回的User对象列表
for (User user : users) {
// 打印每个User对象的信息到控制台
System.out.println(user);
}
// 关闭SqlSession,释放数据库连接资源
session.close();
}
(预先写入了的数据)
标签:name,day4,数据库,ResultMap,id,User,uage,Mybatis,public From: https://blog.csdn.net/2301_79789506/article/details/140701276