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

本文共 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/593153

你可能感兴趣的文章
python分析postfix邮件日志的状态
查看>>
Mysql-5.6.x多实例配置
查看>>
psutil
查看>>
在git@osc上托管自己的代码
查看>>
机器学习算法:朴素贝叶斯
查看>>
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>
ClientScriptManager与ScriptManager向客户端注册脚本的区别
查看>>
js和php中几种生成验证码的方式
查看>>
android UI进阶之仿iphone的tab效果1
查看>>
这是我的第1个C#程序(向控制台输出一句话)
查看>>
html
查看>>
Xqk.Data数据框架开发指南:丰富的、灵活的查询方法(第三部分:SqlField)
查看>>
Python模块学习:threading 多线程控制和处理
查看>>
第一章 企业项目开发--maven+springmvc+spring+mybatis+velocity整合
查看>>
bLock 回调 就是这么简单!
查看>>