Mybatis实体类和表映射问题(推荐)

在项目开发中我们经常会遇到表中的字段名和表对应实体类属性名称不一定都是完全相同的。下面小编给大家介绍下这种情况下如何解决字段名与实体类属性名不相同的冲突问题。下面小编给大家带来了Mybatis实体类和表映射的解决方法,小伙伴们一起学习吧

本文是小编给大家带来的mybatis中实体类和表映射问题的知识,学习本教程能够快速帮助我们解决字段名与实体类属性名不相同的冲突问题,需要的朋友一起看看吧!

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

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

二、定义实体类

package me.gacl.domain; /** * @author gacl * 定义orders表对应的实体类 */ public class Order { /** * CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); */ //Order实体类属性名和orders表中的字段名是不一样的 private int id; //id===>order_id private String orderNo; //orderNo===>order_no private float price; //price===>order_price public int getId() { return id; } public void setId(int id) { this.id = id; } public String getorderNo() { return orderNo; } public void setorderNo(String orderNo) { this.orderNo = orderNo; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String toString() { return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price+ "]"; } }

三、编写测试代码

3.1、编写sql的xml映射文件

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

select * from orders where order_id=#{id} select order_id id, order_no orderNo,order_price price from orders where order_id=#{id} select * from orders where order_id=#{id}

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

3.2、编写单元测试代码

package me.gacl.test; import me.gacl.domain.Order; import me.gacl.util.MyBatisUtil; import org.apache.ibatis.session.sqlSession; import org.junit.Test; public class Test2 { @Test public void testGetorderById(){ sqlSession sqlSession = MyBatisUtil.getsqlSession(); /** * 映射sql的标识字符串, * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值, * getorderById是select标签的id属性值,通过select标签的id属性值就可以找到要执行的sql */ String statement = "me.gacl.mapping.orderMapper.getorderById";//映射sql的标识字符串 //执行查询操作,将查询结果自动封装成Order对象返回 Order order = sqlSession.selectOne(statement,1);//查询orders表中id为1的记录 //使用sqlSession执行完sql之后需要关闭sqlSession sqlSession.close(); System.out.println(order);//打印结果:null,也就是没有查询出相应的记录 } @Test public void testGetorderById2(){ sqlSession sqlSession = MyBatisUtil.getsqlSession(); /** * 映射sql的标识字符串, * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值, * selectOrder是select标签的id属性值,通过select标签的id属性值就可以找到要执行的sql */ String statement = "me.gacl.mapping.orderMapper.selectOrder";//映射sql的标识字符串 //执行查询操作,将查询结果自动封装成Order对象返回 Order order = sqlSession.selectOne(statement,1);//查询orders表中id为1的记录 //使用sqlSession执行完sql之后需要关闭sqlSession sqlSession.close(); System.out.println(order);//打印结果:Order [id=1, orderNo=aaaa, price=23.0] } @Test public void testGetorderById3(){ sqlSession sqlSession = MyBatisUtil.getsqlSession(); /** * 映射sql的标识字符串, * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值, * selectOrderResultMap是select标签的id属性值,通过select标签的id属性值就可以找到要执行的sql */ String statement = "me.gacl.mapping.orderMapper.selectOrderResultMap";//映射sql的标识字符串 //执行查询操作,将查询结果自动封装成Order对象返回 Order order = sqlSession.selectOne(statement,1);//查询orders表中id为1的记录 //使用sqlSession执行完sql之后需要关闭sqlSession sqlSession.close(); System.out.println(order);//打印结果:Order [id=1, orderNo=aaaa, price=23.0] } }

执行单元测试的结果:

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

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

四、总结

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

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

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

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...