【MyBatis】处理实体类属性和数据库表的列名不一致的情况

【MyBatis】处理实体类属性和数据库表的列名不一致的情况


当然最简单的情况还是自己去把实体类属性改的和数据库表的列名一样就好了。

我们先看看如果不一致会出现什么情况

首先我们先弄个案例看看情况:
数据中的列名:

然后我们在看看当前实体类的情况

package com.siyi.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {

    private Integer uid;
    private String userName;
    private String userAddress;
    private String userSex;
    private Date userBirthday;

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    public Date getUserBirthday() {
        return userBirthday;
    }

    public void setUserBirthday(Date userBirthday) {
        this.userBirthday = userBirthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", userName='" + userName + '\'' +
                ", userAddress='" + userAddress + '\'' +
                ", userSex='" + userSex + '\'' +
                ", userBirthday=" + userBirthday +
                '}';
    }
}

很明显这个是符合不一致的情况的。

  • 持久层接口
package com.siyi.dao;

import com.siyi.domain.User;

import java.util.List;

/**
 * 用户持久层接口
 */
public interface IUSerDao {
    /**
     * 查询所有用户
     * @return
     */
    public List<User> findAll();
}
  • 持久层接口的映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.siyi.dao.IUSerDao">
    <!-- 查询所有 -->
    <select id="findAll" resultType="com.siyi.domain.User">
        select * from user;
    </select>
</mapper>
  • 测试方法:
    @Test
    public void testFindAll() throws IOException {
        //5.执行查询所有方法
        List<User> users = iuSerDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }

测试结果:

很明显我们发现只有username属性有值,为什么username属性有值呢?
因为mysql 在 windows 系统中不区分大小写!

那么下面我们就来使用下面的方法修改。

1. 在sql语句中取别名

将持久层的映射文件中sql给他取个别名就好了

    <!-- 查询所有 -->
    <select id="findAll" resultType="com.siyi.domain.User">
        select id as userId,username as userName,birthday as userBirthday,
		sex as userSex,address as userAddress from user;
    </select>

修改之后我们在运行:

自然就成功了。

但是如果我们的查询很多,都使用别名的话写起来岂不是很麻烦。所以我们可以使用第二种方法resultMap。

2. resultMap 结果类型

resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。

在 select 标签中使用 resultMap 属性指定引用即可。同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。

那么我们可以重新设计持久层的映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.siyi.dao.IUSerDao">
    <!-- 配置查询结果的列名和实体类的属性名的对应关系 -->
    <resultMap type="com.siyi.domain.User" id="userMap">
        <!-- 主键字段的对应 -->
        <id column="id" property="uid"/>
        <!-- 非主键字段的对应 -->
        <result column="username" property="userName"/>
        <result column="sex" property="userSex"/>
        <result column="address" property="userAddress"/>
        <result column="birthday" property="userBirthday"/>
    </resultMap>
    <!-- 查询所有 -->
    <select id="findAll" resultMap="userMap">
        select * from user;
    </select>
</mapper>

id 标签:用于指定主键字段
result 标签:用于指定非主键字段
column 属性:用于指定数据库列名
property 属性:用于指定实体类属性名称

修改完成后我们再次执行

就成功了。

发布了476 篇原创文章 · 获赞 152 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_41879343/article/details/104872178