随笔记录下:
刚刚遇到一个mybatis中reultMap定义正确column与property也都正确,字段的getset方法也都有,但是返回对象时,有些字段可以对应上有一些则不可以。
找了好久才发现在sql语句中的 resultMap 写成了 resultType。。。
很low但是痛。改成resultMap一切正常!
补充知识: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的内容如下:
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某些字段无法映射成功的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。