MyBatis学习总结4--解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定是完全相同的,如果直接在xml映射文件中使用sql进行映射,会造成返回值为空的情况,下面阐述解决方案:
测试所用表和数据
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 com.tfj.domain; /**
* @author Jacksile 定义orders表对应的实体类
*/
public class Order { // 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 + "]";
}
}
编写测试代码
编写sql的xml映射文件orderMapper.xml,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
例如namespace="com.tfj.mapping.orderMapper"就是com.tfj.mapping(包名)+orderMapper(orderMapper.xml文件去除后缀)
-->
<mapper namespace="com.tfj.mapping.orderMapper"> <!--
根据id查询得到一个order对象,使用这个查询是查询不到我们想要的结果的,
这主要是因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录
-->
<select id="getOrderById" parameterType="int"
resultType="com.tfj.domain.Order">
select * from orders where order_id=#{id}
</select> <!--
根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
这是因为我们将查询的字段名都起一个和实体类属性名相同的别名,这样实体类的属性名和查询结果中的字段名就可以一一对应上
-->
<select id="selectOrder" parameterType="int"
resultType="com.tfj.domain.Order">
select order_id id, order_no orderNo,order_price price from orders where order_id=#{id}
</select> <!--
根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
这是因为我们通过<resultMap>映射实体类属性名和表的字段名一一对应关系 -->
<select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap">
select * from orders where order_id=#{id}
</select>
<!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
<resultMap type="com.tfj.domain.Order" id="orderResultMap">
<!-- 用id属性来映射主键字段 -->
<id property="id" column="order_id"/>
<!-- 用result属性来映射非主键字段 -->
<result property="orderNo" column="order_no"/>
<result property="price" column="order_price"/>
</resultMap> </mapper>
在conf.xml文件中的<Mappers>内注册orderMapper.xml映射文件
<mapper resource="com/tfj/mapping/orderMapper.xml" />
进行单元测试,后续将沿用测试,不再进行调用输出的方式
package com.tfj.test; import org.apache.ibatis.session.SqlSession;
import org.junit.Test; import com.tfj.domain.Order;
import com.tfj.util.MyBatisUtil; public class Test2 {
@Test
public void testGetOrderById() {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
/**
* 映射sql的标识字符串, com.tfj.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值,
* getOrderById是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
String statement = "com.tfj.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的标识字符串, com.tfj.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值,
* selectOrder是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
String statement = "com.tfj.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的标识字符串, com.tfj.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值,
* selectOrderResultMap是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
String statement = "com.tfj.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语句中定义别名来解决字段名和属性名的映射关系的。
解决办法二: 通过<resultMap>来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。
MyBatis学习总结4--解决字段名与实体类属性名不相同的冲突的更多相关文章
- 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
[转]MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013307.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这 ...
- MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis学习总结_04_解决字段名与实体类属性名不相同的冲突
一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), ...
- MyBatis学习笔记(四)——解决字段名与实体类属性名不相同的冲突
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演 ...
- 四:MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- Mybatis框架学习总结-解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定是完全相同的. 1.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY ...
- MyBatis学习总结(4)——解决字段名与实体类属性名不相同的冲突
一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), ...
- MyBatis学习总结(四)——字段名与实体类属性名不相同的冲突的解决
表中的字段名和表对应实体类的属性名称不一定都是完全相同的,这种情况下的如何解决字段名与实体类属性名不相同的冲突.如下所示: 一.准备演示需要使用的表和数据 CREATE TABLE my_user( ...
随机推荐
- 【原创】CHROME 最小字体限制为12PX的终极解决方案
CHROME 最小字体限制为12PX的终极解决方案 本文由五月雨恋提供,转载请注明出处. 相信不少做网站的用户会有这样一个问题,Chrome 默认最小字体是12px(最新版英文也有此问题),这个是 C ...
- Net Core开源通讯组件 SmartRoute
Net Core开源通讯组件 SmartRoute(服务即集群) SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置 ...
- [SC] OpenSCManager FAILED 1722
在服务器A(windows server 2008 r2)执行如下命令访问远端服务器B(windows server 2003)的服务运行状况: sc \\servername query " ...
- IIS7.5 HTTP 错误 500.19 - Internal Server Error 问题的解决方案
昨天在 windows 7 下用 IIS 7.5 运行一个以前用 .NET Framework 3.5 写的项目,发现总是出现 500.19 错误,如下: 百度了好久,没找到解决问题确切的答案,我也知 ...
- 【转】android如何浏览并选择图片 音频 视频
转自:http://www.cnblogs.com/top5/archive/2012/03/06/2381986.html 这几天 在学习并开发android系统的图片浏览 音频 视频 的浏览 ...
- Android使用XML做动画UI
在Android应用程序,使用动画效果,能带给用户更好的感觉.做动画可以通过XML或Android代码.本教程中,介绍使用XML来做动画.在这里,介绍基本的动画,如淡入,淡出,旋转等. 效果: htt ...
- c++ freelockquque
http://www.boost.org/doc/libs/1_56_0/doc/html/boost/lockfree/queue.html Class template queue boost:: ...
- 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "stdafx.h ...
- 【BZOJ】【1086】 【SCOI2005】王室联邦
树分块 orz vfk && PoPoQQQ http://vfleaking.blog.163.com/blog/static/174807634201231684436977/ h ...
- 01-03-02-2【Nhibernate (版本3.3.1.4000) 出入江湖】CRUP操作-Save方法的一些问题
此文由于当时不知道NHibernate的Sava方法不是更新操作,不知道Save就是Add,造成如下荒唐的求证过程,但结论是对的 ,可报废此文,特此声明. NHibernate--Save方法: Cu ...