返回顶部
首页 > 资讯 > 精选 >怎么解决mybatis映射和实际类型不一致的问题
  • 284
分享到

怎么解决mybatis映射和实际类型不一致的问题

2023-06-21 21:06:37 284人浏览 八月长安
摘要

本篇内容主要讲解“怎么解决mybatis映射和实际类型不一致的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决mybatis映射和实际类型不一致的问题”吧!mybatis映射和实际类型

本篇内容主要讲解“怎么解决mybatis映射和实际类型不一致的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决mybatis映射和实际类型不一致的问题”吧!

mybatis映射和实际类型不一致

项目今天出现个问题,在dao中定义了一个查询,方法的返回值是map并定义了泛型都是String类型,可是方法返回值中还是存在其他的类型。

//DAO接口查询 返回类型Map<String,String> Map<String,String> dealerInfo(String userId,String brandId);

实际返回类型还是存在不是String类型的数据

原因分析

泛型作用于编译阶段,仅为了防止类型混乱而出现,类型转换异常

mybatis结果集封装bean时采用反射,是在运行时进行的。

小结一下

泛型是在编译阶段将我们的返回值类型匹配到一具体类型,而DAO层的接口却没有具体的返回值信息,所以在编译阶段它是可以通过的,这也就是说我们在DAO层定义的接口返回值泛型是不起作用的,具体的类型还是得依靠mapper.xml文件中定义的返回值类型为准。

解决方法

在查询sql中就将数据转换成对应类型即可

SELECT CONVERT(23,CHAR); 会将23转成字符串

mybatis映射器Mapper(结果映射以及解决列名不一致)

结果映射:(resultMap, resultType)

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的长达数千行的代码。ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。

resultType属性可以指定结果集的类型,它⽀持 基本类型和 实体类类型(JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象))

需要注意的是,它和parameterType⼀样,如果注册过类型别名的,可以直接使⽤别名。没有注册过的必须使⽤全限定类名。例如:我们的实体类此时必须是全限定类名

同时,当是实体类名称是,还有⼀个要求,实体类中的属性名称必须和查询语句中的列名 保持⼀ 致,否则⽆法实现封装。

1. resultType配置结果类型

这⾥考虑实体类属性和数据库表的列名已经不⼀致的情况

JavaBean:

public class User {  private int id;  private String username;  private String hashedPassWord;   public int getId() {    return id;  }  public void setId(int id) {    this.id = id;  }  public String getUsername() {    return username;  }  public void setUsername(String username) {    this.username = username;  }  public String getHashedPassword() {    return hashedPassword;  }  public void setHashedPassword(String hashedPassword) {    this.hashedPassword = hashedPassword;  }}

基于JavaBean的规范,上面这个类有 3 个属性:id,username 和 hashedPassword。这些属性会对应到 select 语句中的列名。

xml映射

类型别名是你的好帮手。使用它们,你就可以不用输入类的完全限定名称了。比如:

<!-- mybatis-config.xml 中 --><typeAlias type="com.someapp.model.User" alias="User"/> <!-- SQL 映射 XML 中 --><select id="selectUsers" resultType="User">  select id, username, hashedPassword  from some_table  where id = #{id}</select>

这些情况下,MyBatis 会在幕后自动创建一个 ResultMap,再基于属性名来映射列到 JavaBean 的属性上。

如果列名和属性名没有精确匹配,可以在 SELECT 语句中对列使用别名(这是一个基本的 SQL 特性)来匹配标签。比如:

<select id="selectUsers" resultType="User">  select    user_id             as "id",    user_name           as "userName",    hashed_password     as "hashedPassword"  from some_table  where id = #{id}</select>

这样,可以解决 实体类属性和数据库表的列名已经不⼀致的情况

思考:如果我们的查询很多,都使⽤别名的话写起来岂不是很麻烦,有没有别的解决办法呢?

2. resultMap结果类型

resultMap标签可以建⽴查询的列名和实体类的属性名称不⼀致时建⽴对应关系。从⽽实现封装。 在select标签中使⽤resultMap属性指定引⽤即可。同时resultMap可以实现将查询结果映射为复 杂类型的pojo,⽐如在查询结果映射对象中包括pojo和list实现⼀对⼀查询和⼀对多查询。

<!-- 建⽴User实体和数据库表的对应关系 type属性:指定实体类的全限定类名 id属性:给定⼀个唯⼀标识,是给查询select标签引⽤⽤的。 --><resultMap id="userResultMap" type="User">    <!-- id标签:⽤于指定主键字段     result标签:⽤于指定⾮主键字段     column属性:⽤于指定数据库列名     property属性:⽤于指定实体类属性名称     -->  <!--主键映射-->  <id property="id" column="user_id" /> <!--普通属性映射-->  <result property="username" column="user_name"/>  <result property="password" column="hashed_password"/></resultMap>
  • type属性:指定实体类的全限定类名

  • id="userResultMap":给定⼀个唯⼀标识,是给查询select标签引⽤⽤的。

  • <id>标签:⽤于指定主键字段

  • <result>标签:⽤于指定⾮主键字段

  • column属性:⽤于指定数据库列名

  • property属性:⽤于指定实体类属性名称

而在引用它的语句中使用 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:

<select id="selectUsers" resultMap="userResultMap">  select user_id, user_name, hashed_password  from some_table  where id = #{id}</select>

使用外部的 resultMap ,这也是解决 实体类属性 和 数据库表的列名 不匹配的另外一种方式。

到此,相信大家对“怎么解决mybatis映射和实际类型不一致的问题”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么解决mybatis映射和实际类型不一致的问题

本文链接: https://lsjlt.com/news/300645.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么解决mybatis映射和实际类型不一致的问题
    本篇内容主要讲解“怎么解决mybatis映射和实际类型不一致的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决mybatis映射和实际类型不一致的问题”吧!mybatis映射和实际类型...
    99+
    2023-06-21
  • mybatis映射和实际类型不一致的问题
    目录mybatis映射和实际类型不一致原因分析小结一下解决方法mybatis映射器Mapper(结果映射以及解决列名不一致)结果映射:(resultMap, resultType)1...
    99+
    2024-04-02
  • MyBatis的SUM映射问题怎么解决
    本文小编为大家详细介绍“MyBatis的SUM映射问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“MyBatis的SUM映射问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。SUM映射问题当我...
    99+
    2023-06-29
  • 解决json串和实体类字段不一致的问题
    这里我们对json串和实体类字段不一致的情况进行一个测试: 首先,我们建立一个实体类:这里简单定义了name,sex,age三个属性,以及get set tostring方法。 ...
    99+
    2024-04-02
  • 解决Mybatis plus实体类属性与表字段不一致的问题
    下面看下Mybatis plus实体类属性与表字段不一致的问题,内容如下所示: 主要注释到实体类上的注解: @TableName(value = …)当数据库名与实体类...
    99+
    2024-04-02
  • 解决Beanutils.copyproperties实体类对象不一致的问题
    今天给大家分析一个解决Beanutils.copyproperties实体类对象名不一致的解决方法,一般我们在两个对象拷贝的问题上,我个人用的比较多的就是Beanutils.copy...
    99+
    2024-04-02
  • 怎么使用MyBatis高级映射ResultMap解决属性问题
    本篇内容介绍了“怎么使用MyBatis高级映射ResultMap解决属性问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ResultMap...
    99+
    2023-07-05
  • Navicat统计的行数和表实际行数不一致的问题怎么理解
    本篇内容介绍了“Navicat统计的行数和表实际行数不一致的问题怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景近期为了保障线上数...
    99+
    2023-06-21
  • Mybatis之映射实体类中不区分大小写的解决
    目录Mybatis 映射实体类中不区分大小写解决办法问题解决Mybatis的一些小细节问题一. #{}和${}的区别是什么?问题二. 当实体类中的属性名和表中的字段名不一样,怎么办问...
    99+
    2024-04-02
  • 如何解决mybatis中方法返回泛型与resultType不一致的问题
    这篇文章主要介绍“如何解决mybatis中方法返回泛型与resultType不一致的问题”,在日常操作中,相信很多人在如何解决mybatis中方法返回泛型与resultType不一致的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-20
  • redis怎么解决缓存不一致的问题
    本文小编为大家详细介绍“redis怎么解决缓存不一致的问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“redis怎么解决缓存不一致的问题”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新...
    99+
    2024-04-02
  • css怎么解决高度不一致问题
    这篇文章主要为大家展示了“css怎么解决高度不一致问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css怎么解决高度不一致问题”这篇文章吧。 ...
    99+
    2024-04-02
  • maven编码gbk的不可映射字符问题怎么解决
    在Maven编码为GBK的情况下,如果遇到不可映射字符的问题,可以使用下面的解决方法:1. 修改源代码文件的编码:将源代码文件的编码...
    99+
    2023-09-23
    maven
  • 如何解决mybatis-plus实体类中出现非数据库映射字段的问题
    本篇内容主要讲解“如何解决mybatis-plus实体类中出现非数据库映射字段”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决mybatis-plus实体类中出现非数据库映射字段”吧!在使...
    99+
    2023-06-07
  • vlookup匹配的值和实际值不一致如何解决
    如果VLOOKUP函数返回的值与实际值不一致,可能是由于以下几个原因导致的:1. 数据格式不匹配:VLOOKUP函数在进行匹配时,要...
    99+
    2023-09-07
    vlookup
  • 解决mybatis中resultType取出数据顺序不一致的问题
    目录mybatis resultType取出数据顺序不一致解决方法mybatis中resultType问题mybatis resultType取出数据顺序不一致 之前做一个页面的动态...
    99+
    2024-04-02
  • mybatis的integer类型为0的失效问题怎么解决
    本篇内容介绍了“mybatis的integer类型为0的失效问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!integer类型为0...
    99+
    2023-06-26
  • Mybatis中ResultMap解决属性名和数据库字段名不一致问题
    目录前言1. 字段名不一致解决方法:第一种方式: 起别名第二种方式: 结果集映射 resultMap2. 多对一处理3. 一对多处理小结前言 我们Pojo类的属性名和数据库中的字段名...
    99+
    2024-04-02
  • Mysql和redis缓存不一致问题的解决方案
    目录一.问题描述二.解决方案1.给缓存数据设置过期时间2.缓存延时双删3.删除缓存重试机制4.读取biglog异步删除缓存三.总结一.问题描述 Redis、mysql双写缓存不一致: 在更新缓存方面,对于更新完数据库,...
    99+
    2022-08-16
    mysql缓存和redis缓存 Redis缓存一致性 redis和mysql一致性
  • Mybatis中怎么使用ResultMap解决属性名和数据库字段名不一致问题
    本篇内容介绍了“Mybatis中怎么使用ResultMap解决属性名和数据库字段名不一致问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作