博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突
阅读量:5895 次
发布时间:2019-06-19

本文共 4759 字,大约阅读时间需要 15 分钟。

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

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

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);

二、定义实体类

1 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 FLOAT14     );15      */1617     //Order实体类中属性名和orders表中的字段名是不一样的18     private int id;                //id===>order_id19     private String orderNo;        //orderNo===>order_no20     private float price;        //price===>order_price2122     public int getId() {23         return id;24     }2526     public void setId(int id) {27         this.id = id;28     }2930     public String getOrderNo() {31         return orderNo;32     }3334     public void setOrderNo(String orderNo) {35         this.orderNo = orderNo;36     }3738     public float getPrice() {39         return price;40     }4142     public void setPrice(float price) {43         this.price = price;44     }4546     @Override47     public String toString() {48         return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price+ "]";49     }50 }

三、编写测试代码

3.1、编写SQL的xml映射文件

  1、创建一个orderMapper.xml文件,orderMapper.xml的内容如下:

1 
2 3
6
7 8
12
1617
21
2526
29
32
33
34
35
36
37
38
39
4041

  2、在conf.xml文件中注册orderMapper.xml映射文件

3.2、编写单元测试代码

1 package me.gacl.test; 2 3 import me.gacl.domain.Order; 4 import me.gacl.util.MyBatisUtil; 5 import org.apache.ibatis.session.SqlSession; 6 import org.junit.Test; 7 8 public class Test2 { 910     @Test11     public void testGetOrderById(){12         SqlSession sqlSession = MyBatisUtil.getSqlSession();13         /**14          * 映射sql的标识字符串,15          * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值,16          * getOrderById是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL17          */18         String statement = "me.gacl.mapping.orderMapper.getOrderById";//映射sql的标识字符串19         //执行查询操作,将查询结果自动封装成Order对象返回20         Order order = sqlSession.selectOne(statement,1);//查询orders表中id为1的记录21         //使用SqlSession执行完SQL之后需要关闭SqlSession22         sqlSession.close();23         System.out.println(order);//打印结果:null,也就是没有查询出相应的记录24     }2526     @Test27     public void testGetOrderById2(){28         SqlSession sqlSession = MyBatisUtil.getSqlSession();29         /**30          * 映射sql的标识字符串,31          * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值,32          * selectOrder是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL33          */34         String statement = "me.gacl.mapping.orderMapper.selectOrder";//映射sql的标识字符串35         //执行查询操作,将查询结果自动封装成Order对象返回36         Order order = sqlSession.selectOne(statement,1);//查询orders表中id为1的记录37         //使用SqlSession执行完SQL之后需要关闭SqlSession38         sqlSession.close();39         System.out.println(order);//打印结果:Order [id=1, orderNo=aaaa, price=23.0]40     }4142     @Test43     public void testGetOrderById3(){44         SqlSession sqlSession = MyBatisUtil.getSqlSession();45         /**46          * 映射sql的标识字符串,47          * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值,48          * selectOrderResultMap是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL49          */50         String statement = "me.gacl.mapping.orderMapper.selectOrderResultMap";//映射sql的标识字符串51         //执行查询操作,将查询结果自动封装成Order对象返回52         Order order = sqlSession.selectOne(statement,1);//查询orders表中id为1的记录53         //使用SqlSession执行完SQL之后需要关闭SqlSession54         sqlSession.close();55         System.out.println(order);//打印结果:Order [id=1, orderNo=aaaa, price=23.0]56     }57 }

  执行单元测试的结果:

  1、testGetOrderById方法执行查询后返回一个null。

  2、testGetOrderById2方法和testGetOrderById3方法执行查询后可以正常得到想要的结果。

四、总结

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

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

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

 

来源: 
 

转载地址:http://mvxsx.baihongyu.com/

你可能感兴趣的文章
ELKF安装使用教程。elasticsearch+logstash+kibana+filebeta。
查看>>
mybatis学习之一 开发环境配置和接口编程
查看>>
SqlDataAdapter DataSet DataTable 详解
查看>>
Android Xutils 框架
查看>>
为已经存在的本地项目添加git,以及从远程仓库拉取代码并切换远程分支
查看>>
寒假实践总结
查看>>
关于ExtJS的两种Ajax请求和回调问题(转载)
查看>>
VS2010的dll工程设置输出文件的路径
查看>>
最简单删除SQL Server中所有数据的方法(不用考虑表之间的约束条件,即主表与子表的关系)...
查看>>
mysql自动更新时间的触发器
查看>>
【转】Ubuntu 14.04 引导修复(Boot Repair)(双系统修复一)
查看>>
NGINX开篇
查看>>
全栈是什么体验?想想都恐怖
查看>>
【python】-- Django 分页 、cookie、Session、CSRF
查看>>
dpkg的用法
查看>>
C# 文件下载四方法
查看>>
JAVA基础细谈
查看>>
J2EE Map
查看>>
金庸笔下人物以及网络俏皮英语对应关系表-诗词
查看>>
Unity3D–Texture图片空间和内存占用分析
查看>>