MyBatis实体类属性与表字段不一致的4种解决方案

pom的依赖配置:

 1 <dependencies>
 2     <dependency>
 3         <groupId>org.mybatis</groupId>
 4         <artifactId>mybatis</artifactId>
 5         <version>3.4.5</version>
 6     </dependency>
 7     <dependency>
 8         <groupId>junit</groupId>
 9         <artifactId>junit</artifactId>
10         <version>4.12</version>
11     </dependency>
12     <dependency>
13         <groupId>mysql</groupId>
14         <artifactId>mysql-connector-java</artifactId>
15         <version>8.0.17</version>
16     </dependency>
17 </dependencies>

MySQL数据库的建表语句:

1 CREATE TABLE `tb_user` (
2   `id` int(11) NOT NULL AUTO_INCREMENT,
3   `username` varchar(32) NOT NULL COMMENT ‘用户名‘,
4   `sex` char(1) DEFAULT NULL COMMENT ‘性别‘,
5   `birthday` date DEFAULT NULL COMMENT ‘生日‘,
6   `address` varchar(256) DEFAULT NULL COMMENT ‘地址‘,
7   PRIMARY KEY (`id`)
8 ) ;

Java实体类代码:

 1 public class User {
 2
 3     private int id;
 4     private String name;
 5     private String sex;
 6     private Date birthday;
 7     private String address;
 8
 9     @Override
10     public String toString() {
11         return "User{" +
12                 "id=" + id +
13                 ", name=‘" + name + ‘\‘‘ +
14                 ", sex=‘" + sex + ‘\‘‘ +
15                 ", birthday=" + birthday +
16                 ", address=‘" + address + ‘\‘‘ +
17                 ‘}‘;
18     }
19
20     public int getId() {
21         return id;
22     }
23
24     public void setId(int id) {
25         this.id = id;
26     }
27
28     public String getName() {
29         return name;
30     }
31
32     public void setName(String name) {
33         this.name = name;
34     }
35
36     public String getSex() {
37         return sex;
38     }
39
40     public void setSex(String sex) {
41         this.sex = sex;
42     }
43
44     public Date getBirthday() {
45         return birthday;
46     }
47
48     public void setBirthday(Date birthday) {
49         this.birthday = birthday;
50     }
51
52     public String getAddress() {
53         return address;
54     }
55
56     public void setAddress(String address) {
57         this.address = address;
58     }
59 }

MyBatis测试方法代码:

 1     @Test
 2     public void test01() {
 3
 4         InputStream inputStream = null;
 5         try {
 6             inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
 7         } catch (IOException e) {
 8             e.printStackTrace();
 9         }
10
11         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
12
13         SqlSessionFactory factory = builder.build(inputStream);
14
15         SqlSession sqlSession = factory.openSession();
16
17         List<User> list = sqlSession.selectList("test.queryList");
18
19         list.forEach(System.out::println);
20
21         sqlSession.close();
22
23     }

SqlMapConfig的配置:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <environments default="development">
 7         <environment id="development">
 8             <transactionManager type="JDBC" />
 9             <dataSource type="POOLED">
10                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
11                 <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis01?serverTimezone=UTC" />
12                 <property name="username" value="root" />
13                 <property name="password" value="root" />
14             </dataSource>
15         </environment>
16     </environments>
17
18     <mappers>
19         <mapper resource="UserMapper.xml" />
20     </mappers>
21 </configuration>    

UserMapper的配置:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <!DOCTYPE mapper
 3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="test">
 6
 7    <select id="queryList" resultType="com.saika.mybatis.pojo.User">
 8       SELECT * from user
 9    </select>
10
11 </mapper>

实体类属性name与表字段username不一致

方案一

采用SQL语句AS起别名的形式,为查询语句的显示列定义别名,让这个别名与实体类的属性名相同以完成自动映射。

SQL语句:

1 SELECT id,username AS name ,sex,birthday,address FROM user

缺点:

1.如果不一致的字段过多会导致语句过长。

2.如果查询语句有多个,每次都要起别名会导致重复代码增多,多次定义显示列增加了工作量。

方案二

修改实体类set方法的方法名对应表字段名。

MyBatis映射的原理就是通过返回的字段名找实体类的setXxx方法进行封装。

Java代码:

1     public void setUsername(String name) {
2         this.name = name;
3     }

方案三

利用<sql>标签提取SQL语句片段统一配置别名,在原查询语句上用<include>标签引入,简化操作。

SQL语句:

1    <sql id="user">
2       id,username AS name,sex,birthday,address
3    </sql>
4
5    <select id="queryList" resultType="com.saika.mybatis.pojo.User">
6       SELECT <include refid="user"></include> FROM user
7    </select>

方案四

使用<resultMap>标签配置手动映射。

id 是这个封装规则的唯一标识,用于被查询标签中的resultMap所引用。

type 用于指定将查询结果封装到哪个实体类中。

column是表的字段。

property是实体类的属性。

SQL语句:

1    <resultMap id="userResultMap" type="com.saika.mybatis.pojo.User">
2       <result column="username" property="name"/>
3    </resultMap>
4
5    <select id="queryList" resultMap="userResultMap">
6       SELECT id,username,sex,birthday,address FROM user
7    </select>

注解形式:

1 @Result(property ="name",column = "username")

原文地址:https://www.cnblogs.com/manchuria-saika/p/11978096.html

时间: 2024-10-06 22:35:37

MyBatis实体类属性与表字段不一致的4种解决方案的相关文章

YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧

实体类通常需要和数据库表进行了ORM映射,当你需要添加新的属性时,往往同时也需要在数据库中添加相应的字段并配置好映射关系,同时可能还需对数据访问组件进行重新编译和部署才能有效.而当你开始设计一个通用数据访问组件后,因为项目需求的不同和需求的不断变化演变,很难不能保证不会再添加额外的属性和字段.特别是项目部署运行后,添加一个属性和字段带来的额外维护的工作量可能要远远超过对代码进行调整的工作量.本文提供了属性字段扩展的一种思路,在满足核心字段可通过实体类强类型进行访问的同时,还可通过C# 4.0提供

Mybatis——实体类属性名和数据库字段名不同时的解决办法

在使用Mybatis来持久化数据库时,有时候会碰到数据库中表中的字段与java实体类中属性名不一致的情况,在这种情况下Mybatis是不能完成字段的自动映射的.而通常情况下,数据库及实体类是不应该被改的的.所以要在不改变数据库以及实体类的情况下解决这个问题,下面是解决该问题的三种方式: java实体类: public class User { private Long id; private String userName; private String passWord; /** * ...

Hibernate实体类与数据表字段默认值之间的优先关系

在日常的应用开发过程中,我们一般都会使用对象关系映射来通过面向对象的编程模型来解决数据库的操作,我们生产过程当中使用较多的当属Hibernate框架了,他非常灵活,为我们提供了多种方式来实现数据层的操作与管理.通过实体类与数据表的映射,实体类对应表,属性对应字段就可以将我们想要生产的对象赋值到数据库,但是我们有时也需要查询对象,但是无论什么操作,都必须通过实体类来传递数据. 有时我们数据库有一些字段是数据库自动赋值,禁止用户通过程序修改的,如记录生成时间,那么如果你实体类按照正常情况下,你为了查

Mybatis学习二(字段名与实体类属性名不相同/关联查询)

1.在写项目的时候会遇到数据库字段名与实体类属性名不同的情况,可能是为了方便也可能是其他要求,whatever,我们现在来解决这个问题 准备一个数据库表如下 1 CREATE TABLE orders( 2 order_id INT PRIMARY KEY AUTO_INCREMENT, 3 order_no VARCHAR(20), 4 order_price FLOAT 5 ); 接下类定义一个实体类 1 public class Order { 2 private int id; 3 pr

KO ------- 表中字段名和实体类属性名不一致

-----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就会为空 (一)问题复现 1.先创建数据库 mybatis_db, 再创建表 t_user,并插入若干数据 注意:user_id 为主键,且为自动增长 2.创建实体类 User.java: package com.siwuxie095.entity; // 实体类 public class User

MyBatis学习总结_04_解决字段名与实体类属性名不相同的冲突

一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23); INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33); INSER

MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, order_price) VALUES('aaaa'

MyBatis——解决字段名与实体类属性名不相同的冲突

原文:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSER

Mybatis解决字段名与实体类属性名不相同的冲突

在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, order_price) VALUES('aaaa'