MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

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

复制代码

1CREATE TABLE orders( 2 order_id INT PRIMARY KEY AUTO_INCREMENT, 3 order_no VARCHAR(20), 4 order_price FLOAT 5); 6INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23); 7INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33); 8INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);

复制代码

二、定义实体类

复制代码

1 1 package me.gacl.domain; 2 2 3 3 /** 4 4 * @author gacl 5 5 * 定义orders表对应的实体类 6 6 */ 7 7 public class Order { 8 8 /** 9 9 * 1010 CREATE TABLE orders( 1111 order_id INT PRIMARY KEY AUTO_INCREMENT, 1212 order_no VARCHAR(20), 1313 order_price FLOAT 1414 ); 1515 */ 1616 1717 //Order实体类中属性名和orders表中的字段名是不一样的 1818 private int id; //id===>order_id 1919 private String orderNo; //orderNo===>order_no 2020 private float price; //price===>order_price 2121 2222 public int getId() { 2323 return id; 2424 } 2525 2626 public void setId(int id) { 2727 this.id = id; 2828 } 2929 3030 public String getOrderNo() { 3131 return orderNo; 3232 } 3333 3434 public void setOrderNo(String orderNo) { 3535 this.orderNo = orderNo; 3636 } 3737 3838 public float getPrice() { 3939 return price; 4040 } 4141 4242 public void setPrice(float price) { 4343 this.price = price; 4444 } 4545 4646 @Override 4747 public String toString() { 4848 return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price+ "]"; 4949 } 5050 }

复制代码

三、编写测试代码

3.1、编写SQL的xml映射文件

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

复制代码

1 1 <?xml version="1.0" encoding="UTF-8" ?> 2 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3 3 <!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的 4 4 例如namespace="me.gacl.mapping.orderMapper"就是me.gacl.mapping(包名)+orderMapper(orderMapper.xml文件去除后缀) 5 5 --> 6 6 <mapper namespace="me.gacl.mapping.orderMapper"> 7 7 8 8 <!-- 9 9 根据id查询得到一个order对象,使用这个查询是查询不到我们想要的结果的, 1010 这主要是因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录 1111 --> 1212 <select id="getOrderById" parameterType="int" 1313 resultType="me.gacl.domain.Order"> 1414 select * from orders where order_id=#{id} 1515 </select> 1616 1717 <!-- 1818 根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的, 1919 这是因为我们将查询的字段名都起一个和实体类属性名相同的别名,这样实体类的属性名和查询结果中的字段名就可以一一对应上 2020 --> 2121 <select id="selectOrder" parameterType="int" 2222 resultType="me.gacl.domain.Order"> 2323 select order_id id, order_no orderNo,order_price price from orders where order_id=#{id} 2424 </select> 2525 2626 <!-- 2727 根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的, 2828 这是因为我们通过<resultMap>映射实体类属性名和表的字段名一一对应关系 --> 2929 <select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap"> 3030 select * from orders where order_id=#{id} 3131 </select> 3232 <!--通过<resultMap>映射实体类属性名和表的字段名对应关系 --> 3333 <resultMap type="me.gacl.domain.Order" id="orderResultMap"> 3434 <!-- 用id属性来映射主键字段 --> 3535 <id property="id" column="order_id"/> 3636 <!-- 用result属性来映射非主键字段 --> 3737 <result property="orderNo" column="order_no"/> 3838 <result property="price" column="order_price"/> 3939 </resultMap> 4040 4141 </mapper>

复制代码

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

1<mappers> 2 <!-- 注册orderMapper.xml文件, 3 orderMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/orderMapper.xml--> 4 <mapper resource="me/gacl/mapping/orderMapper.xml"/> 5</mappers>

3.2、编写单元测试代码

复制代码

1 1 package me.gacl.test; 2 2 3 3 import me.gacl.domain.Order; 4 4 import me.gacl.util.MyBatisUtil; 5 5 import org.apache.ibatis.session.SqlSession; 6 6 import org.junit.Test; 7 7 8 8 public class Test2 { 9 9 1010 @Test 1111 public void testGetOrderById(){ 1212 SqlSession sqlSession = MyBatisUtil.getSqlSession(); 1313 /** 1414 * 映射sql的标识字符串, 1515 * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值, 1616 * getOrderById是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL 1717 */ 1818 String statement = "me.gacl.mapping.orderMapper.getOrderById";//映射sql的标识字符串 1919 //执行查询操作,将查询结果自动封装成Order对象返回 2020 Order order = sqlSession.selectOne(statement,1);//查询orders表中id为1的记录 2121 //使用SqlSession执行完SQL之后需要关闭SqlSession 2222 sqlSession.close(); 2323 System.out.println(order);//打印结果:null,也就是没有查询出相应的记录 2424 } 2525 2626 @Test 2727 public void testGetOrderById2(){ 2828 SqlSession sqlSession = MyBatisUtil.getSqlSession(); 2929 /** 3030 * 映射sql的标识字符串, 3131 * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值, 3232 * selectOrder是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL 3333 */ 3434 String statement = "me.gacl.mapping.orderMapper.selectOrder";//映射sql的标识字符串 3535 //执行查询操作,将查询结果自动封装成Order对象返回 3636 Order order = sqlSession.selectOne(statement,1);//查询orders表中id为1的记录 3737 //使用SqlSession执行完SQL之后需要关闭SqlSession 3838 sqlSession.close(); 3939 System.out.println(order);//打印结果:Order [id=1, orderNo=aaaa, price=23.0] 4040 } 4141 4242 @Test 4343 public void testGetOrderById3(){ 4444 SqlSession sqlSession = MyBatisUtil.getSqlSession(); 4545 /** 4646 * 映射sql的标识字符串, 4747 * me.gacl.mapping.orderMapper是orderMapper.xml文件中mapper标签的namespace属性的值, 4848 * selectOrderResultMap是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL 4949 */ 5050 String statement = "me.gacl.mapping.orderMapper.selectOrderResultMap";//映射sql的标识字符串 5151 //执行查询操作,将查询结果自动封装成Order对象返回 5252 Order order = sqlSession.selectOne(statement,1);//查询orders表中id为1的记录 5353 //使用SqlSession执行完SQL之后需要关闭SqlSession 5454 sqlSession.close(); 5555 System.out.println(order);//打印结果:Order [id=1, orderNo=aaaa, price=23.0] 5656 } 5757 }

复制代码

  执行单元测试的结果:

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

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

四、总结

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

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

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

sql注入

反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o

MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突 - HelloWorld