mybatis某些字段无法映射成功的解决

随笔记录下:

刚刚遇到一个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的内容如下:

<?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="me.gacl.mapping.orderMapper"就是me.gacl.mapping(包名)+orderMapper(orderMapper.xml文件去除后缀)
 -->
<mapper namespace="me.gacl.mapping.orderMapper">

 <!--
  根据id查询得到一个order对象,使用这个查询是查询不到我们想要的结果的,
  这主要是因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录
 -->
 <select id="getOrderById" parameterType="int"
  resultType="me.gacl.domain.Order">
  select * from orders where order_id=#{id}
 </select>

 <!--
  根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
  这是因为我们将查询的字段名都起一个和实体类属性名相同的别名,这样实体类的属性名和查询结果中的字段名就可以一一对应上
 -->
 <select id="selectOrder" parameterType="int"
  resultType="me.gacl.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="me.gacl.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>

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

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

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语句中定义别名来解决字段名和属性名的映射关系的。

解决办法二:

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

以上这篇mybatis某些字段无法映射成功的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MyBatis中的JdbcType映射使用详解

    Java项目涉及到数据库交互,以往常用的是JDBC,现在则有Hibernate.Mybatis等这些持久化支持. 项目中用到了MyBatis,和JDBC最显著的区别,就是SQL语句配置化,通过xml文件定义SQL语句,当然JDBC也可以将SQL配置化,需要定制开发,MyBatis则直接支持这种方法. 官方对于MyBatis的介绍, MyBatis is a first class persistence framework with support for custom SQL, stored

  • Mybatis 自动映射(使用需谨慎)

    什么是自动映射? 介绍自动映射之前先看一下手动映射,如下: <resultMap id="orderModelMap1" type="com.javacode2018.chat05.demo7.model.OrderModel"> <id column="id" property="id"/> <result column="userId" property="use

  • mybatis plus怎么忽略映射字段

    其实mybatis plus是比mybatis优秀的mybatis有的,他全有,它没的,或者不优秀的地方,mybatis plus全优秀,所以晚的总比早的好. 今天要说的是: 忽略字段问题,我被这个坑了好长时间,我开发项目呐有个需求是忽略数据库中字段,但是实体类还要有,我操,我目前的知识告诉我,@Transient这个是很好的选择,我操,我于是,开始搞,忘了说了,我的数据库中间件是mybatis plus,搞的我烦,先是看网上的,发现无论在字段上加还是在get方法上加,都不行,最后我配置文件又试

  • Java的MyBatis框架中关键的XML字段映射的配置参数详解

    properties 这些是外部化的,可替代的属性,这些属性也可以配置在典型的Java属性配置文件中,或者通过properties元素的子元素来传递.例如: <properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="pas

  • 解决mybatis 数据库date 与 java中Date类型映射问题

    使用mybatis 从数据库中查询出date 类型字段,在java 类型中只看到了日期,没有看到时分秒, 从数据库中是可以看到时分秒的.后来发现是mybatis 映射数据类型的原因: 如: <result column="CREATEDATE" property="createdate" jdbcType="Date" /> 映射出来的时间格式时分秒都为0 (2017-01=12 00:00:00) <result column

  • 解决Mybatis在IDEA中找不到mapper映射文件的问题

    刚开始在IDEA中做用Mybatis查数据库中的数据时,报mapper映射文件找不到,害的我检查了好几次配置的路径是不是正确,但是看了好几遍都没有发现有拼写错误.(我记得以前在eclipse中这样写是没问题的) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" &qu

  • mybatis某些字段无法映射成功的解决

    随笔记录下: 刚刚遇到一个mybatis中reultMap定义正确column与property也都正确,字段的getset方法也都有,但是返回对象时,有些字段可以对应上有一些则不可以. 找了好久才发现在sql语句中的 resultMap 写成了 resultType... 很low但是痛.改成resultMap一切正常! 补充知识:MyBatis学习总结--解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况

  • MyBatis的SUM映射问题及解决

    目录 SUM映射问题 原因 解决方式 sum 返回映射问题(sum报表统计接口返回) MyBatis sum 返回值映射 SUM映射问题 当我们根据类别进行统计,返回的数据类型为HashMap<String,Object>,获取数值类型,容易报 java.math.BigDecimal cannot be cast to java.lang.Integer 场景如下: // Mapper层 <select id="selectInfoByTest" resultTyp

  • Mybatis结果集自动映射的实例代码

    在使用Mybatis时,有的时候我们可以不用定义resultMap,而是直接在<select>语句上指定resultType.这个时候其实就用到了Mybatis的结果集自动映射.Mybatis的自动映射默认是开启的,有需要我们也可以将其关闭(还可以调整自动映射的策略). 1       Mybatis结果集自动映射 在使用Mybatis时,有的时候我们可以不用定义resultMap,而是直接在<select>语句上指定resultType.这个时候其实就用到了Mybatis的结果集

  • Mybatis中的高级映射一对一、一对多、多对多

    学习hibernate的时候,小编已经接触多各种映射,mybatis中映射有到底是如何运转的,今天这篇博文,小编主要来简单的介绍一下mybatis中的高级映射,包括一对一.一对多.多对多,希望多有需要的小伙伴有帮助,小编主要从四个方面进行介绍,订单商品数据模型.一对一查询.一对多查询.多对多查询. 一.订单商品数据模型 1.数据库执行脚本,如下所示: <span style="font-family:Comic Sans MS;font-size:18px;">CREATE

  • Mybatis一对多关联关系映射实现过程解析

    这篇文章主要介绍了Mybatis一对多关联关系映射实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一对多关联关系只需要在多的一方引入少的一方的主键作为外键即可.在实体类中就是反过来,在少的一方添加多的一方,声明一个List<另一方> 属性名 作为少的一方的属性. 用户和订单就是一对多的关系,从用户角度看就是一对多关系,从订单的角度来看就是多对一的关系. /** * 订单持久化类 */ public class Orders { p

  • mybatis框架的xml映射文件常用查询指南

    使用mybatis框架时,那必然会有对数据库的查询语句的编写,所以这篇文章希望可以帮助到你. 什么是Mybatis框架? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录. 如何使用?

  • ORACLE数据库对long类型字段进行模糊匹配的解决思路

    1.背景介绍 最近在查询数据时,突然遇到了这样一个场景,如何对一个字段类型为long的字段进行模糊匹配.一顿操作以后发现不能使用like进行模糊查询,仔细查看了一下官方文档才发现,long数据类型并不支持该操作.然后就想着将long类型转换为varchar类型然后在进行模糊匹配,通过百度尝试了多种方法,发现效果不太理想.(如果你们发现好的方法欢迎在评论区留言) 2.解决思路 笔者这里采用的思路是: 先创建一个新表,然后将关键信息通过数据类型转换为合适的类型(此处是运用to_lob函数将long类

  • mybatis拦截器及不生效的解决方法

    目录 背景: mybatis拦截器怎样做 定义一个拦截器 定义一个 MybatisInterceptorAutoConfiguration 背景: 在一些需求下,使用拦截器会大大简化工作量也更加灵活: 在项目中,要更新数据表的审计字段,比如 create_time, creator, update_time, updator, 这些字段,如果每一个表对应的mapper 都去写一次,或每一个方法都去更新一下,这个工作量非常大并且不太友好,并且不够优雅. 记录一些日志,比如执行sql时侯,要打印每一

  • Windows Server 2016中安装PHP Manager、ARR3.0或者URL Rewrite 2.0无法成功的解决办法

    Windows Server 2016中安装PHP Manager.ARR3.0或者URL Rewrite 2.0无法成功的解决办法 如图: 无法安装原因都是这几个工具无法识别10.0这个版本,可以修改注册表来先完成安装,然后再改回去 PHPManager的修改方法如下: 打开注册表工具(运行Regedt32),找到: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters 看MajorVersion 是DWOR

随机推荐