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

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

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

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

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提供的解决方式来解决字段名和属性名的映射关系的。

 

来源: 
 

转载于:https://www.cnblogs.com/jeffen/p/6215213.html

你可能感兴趣的文章
Netty中的ChannelPipeline源码分析
查看>>
必做作业2:IPAD笔记应用调研
查看>>
struct tm
查看>>
Windows 的 AD 域寄生于 Linux 机器
查看>>
把字符串添加到HashMap中
查看>>
bzoj2763: [JLOI2011]飞行路线
查看>>
Centos7.5中安装JDK1.8环境变量配置
查看>>
windows 挂载windows 共享盘为本地磁盘
查看>>
mojo 默认use utf8;
查看>>
基于SQL_ID查看对象大小
查看>>
【JAVAWEB学习笔记】02
查看>>
转 CSS hack:针对IE6,IE7,firefox显示不同效果
查看>>
(转)使用graphviz绘制流程图
查看>>
js离开或刷新页面检测(且兼容FF,IE,Chrome)
查看>>
Cordova Error: cmd: Command failed with exit code ENOENT
查看>>
wget
查看>>
Bzoj2339--Hnoi2011卡农
查看>>
POJ 2251:Dungeon Master(三维BFS)
查看>>
WPF Page页调用、触发Window的实现
查看>>
win7兼容visual studio 2005 的方法
查看>>