欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-11 14:06:55
...

在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突。

一、准备演示需要使用的表和数据

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);
INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);

二、定义实体类

package me.gacl.domain;
 2 
 3 /**
 4  * @author gacl
 5  * 定义orders表对应的实体类
 6  */
 7 public class Order {
 8     /**
 9      * 
10     CREATE TABLE orders(
11         order_id INT PRIMARY KEY AUTO_INCREMENT,
12         order_no VARCHAR(20), 
13         order_price FLOAT
14     );
15      */
16     
17     //Order实体类中属性名和orders表中的字段名是不一样的
18     private int id;                //id===>order_id
19     private String orderNo;        //orderNo===>order_no
20     private float price;        //price===>order_price
21 
22     public int getId() {
23         return id;
24     }
25 
26     public void setId(int id) {
27         this.id = id;
28     }
29 
30     public String getOrderNo() {
31         return orderNo;
32     }
33 
34     public void setOrderNo(String orderNo) {
35         this.orderNo = orderNo;
36     }
37 
38     public float getPrice() {
39         return price;
40     }
41 
42     public void setPrice(float price) {
43         this.price = price;
44     }
45 
46     @Override
47     public String toString() {
48         return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price+ "]";
49     }
50 }

三、编写测试代码

3.1、编写SQL的xml映射文件
  1、创建一个orderMapper.xml文件,orderMapper.xml的内容如下:
  

1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
 4 例如namespace="me.gacl.mapping.orderMapper"就是me.gacl.mapping(包名)+orderMapper(orderMapper.xml文件去除后缀)
 5  -->
 6 <mapper namespace="me.gacl.mapping.orderMapper">
 7     
 8     <!-- 
 9         根据id查询得到一个order对象,使用这个查询是查询不到我们想要的结果的,
10         这主要是因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录
11      -->
12     <select id="getOrderById" parameterType="int" 
13         resultType="me.gacl.domain.Order">
14         select * from orders where order_id=#{id}
15     </select>
16     
17     <!-- 
18         根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
19         这是因为我们将查询的字段名都起一个和实体类属性名相同的别名,这样实体类的属性名和查询结果中的字段名就可以一一对应上
20      -->
21     <select id="selectOrder" parameterType="int" 
22         resultType="me.gacl.domain.Order">
23         select order_id id, order_no orderNo,order_price price from orders where order_id=#{id}
24     </select>
25     
26     <!-- 
27     根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
28     这是因为我们通过<resultMap>映射实体类属性名和表的字段名一一对应关系 -->
 <select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap">
30         select * from orders where order_id=#{id}
31     </select>
32     <!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
33     <resultMap type="me.gacl.domain.Order" id="orderResultMap">
34         <!-- 用id属性来映射主键字段 -->
35         <id property="id" column="order_id"/>
36         <!-- 用result属性来映射非主键字段 -->
37         <result property="orderNo" column="order_no"/>
38         <result property="price" column="order_price"/>
39     </resultMap>

总结

上面的测试代码演示当实体类中的属性名和表中的字段名不一致时,使用MyBatis进行查询操作时无法查询出相应的结果的问题以及针对问题采用的两种办法:

  解决办法一: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。

  解决办法二: 通过来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。