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

本文共 4828 字,大约阅读时间需要 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      */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提供的解决方式来解决字段名和属性名的映射关系的。

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

你可能感兴趣的文章
Linux中的帮助功能
查看>>
针对Android的Pegasus恶意软件版本和针对iOS的有什么不同?
查看>>
全局探色器
查看>>
Hive Export和Import介绍及操作示例
查看>>
http://mongoexplorer.com/ 一个不错的 mongodb 客户端工具。。。
查看>>
Xcode 4.3 使用xcodebuild命令编译项目环境设置
查看>>
上传jar包到nexus私服
查看>>
Why Namespace? - 每天5分钟玩转 OpenStack(102)
查看>>
Project:如何分析项目中的资源分配情况
查看>>
HDU 4803 Poor Warehouse Keeper (贪心+避开精度)
查看>>
小错误汇总
查看>>
Spring源码系列 — Envoriment组件
查看>>
java正则表达式去除html标签,Java中正则表达式去除html标签
查看>>
使用Cobbler批量部署Linux操作系统
查看>>
zabbix企业应用之服务端与客户端的安装
查看>>
实例讲解遗传算法——基于遗传算法的自动组卷系统【理论篇】
查看>>
无法在web服务器上启动调试。调试失败,因为没有启用集成windows身份验证
查看>>
Bat相关的项目应用
查看>>
Django为数据库的ORM写测试例(TestCase)
查看>>
web.xml中的contextConfigLocation在spring中的作用
查看>>