博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
阅读量:5991 次
发布时间:2019-06-20

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

hot3.png

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

复制代码
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      */16     17     //Order实体类中属性名和orders表中的字段名是不一样的18     private int id;                //id===>order_id19     private String orderNo;        //orderNo===>order_no20     private float price;        //price===>order_price21 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     @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
16 17
21
25 26
29
32
33
34
35
36
37
38
39
40 41
复制代码

  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 { 9     10     @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     }25     26     @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     }41     42     @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://my.oschina.net/zhanghaiyang/blog/594939

你可能感兴趣的文章
5.Nginx的session一致性(共享)问题配置方案1
查看>>
进化与面试
查看>>
回答网友一个wince 的编译错误问题
查看>>
Ubuntu 14.04 安装配置 JDK8
查看>>
3-触发器、存储过程
查看>>
Mojo C++ Bindings API
查看>>
Watch OS2.0开发概述
查看>>
Ant 简易教程
查看>>
逆波兰表达式
查看>>
C语言博客作业3--函数
查看>>
[转]css选择器优先级深入理解
查看>>
CentOS Linux release 7.3源码安装zabbix
查看>>
来自才储分析的报告
查看>>
C#编程(六十二)---------LINQ标准的查询操作符
查看>>
poj 1887 最长递减序列
查看>>
【OpenCV】imread读取数据为空
查看>>
Android模拟器鼠标滑动出现C问题的补充
查看>>
团队作业7——Alpha冲刺之事后诸葛亮
查看>>
[JSOI2007]文本生成器
查看>>
周公解梦
查看>>