我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mybatis映射和实际类型不一致的问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mybatis映射和实际类型不一致的问题

mybatis映射和实际类型不一致

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


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

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

原因分析

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

2、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 ,这也是解决 实体类属性 和 数据库表的列名 不匹配的另外一种方式。

3. 小结一下

都可以解决实体类属性 和 数据库表的列名 不匹配 情况

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mybatis映射和实际类型不一致的问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

Navicat统计的行数和表实际行数不一致的问题怎么理解

本篇内容介绍了“Navicat统计的行数和表实际行数不一致的问题怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景近期为了保障线上数
2023-06-21

如何解决mybatis中方法返回泛型与resultType不一致的问题

这篇文章主要介绍“如何解决mybatis中方法返回泛型与resultType不一致的问题”,在日常操作中,相信很多人在如何解决mybatis中方法返回泛型与resultType不一致的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的
2023-06-20

如何解决mybatis-plus实体类中出现非数据库映射字段的问题

本篇内容主要讲解“如何解决mybatis-plus实体类中出现非数据库映射字段”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决mybatis-plus实体类中出现非数据库映射字段”吧!在使
2023-06-07

MyBatis的SQL执行结果和客户端执行结果不一致问题排查

本文主要介绍了MyBatis的SQL执行结果和客户端执行结果不一致问题排查,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-15

objc方法声明和实现由于参数类型不一致所引发的崩溃

这篇文章主要为大家介绍了objc方法声明和实现由于参数类型不一致所引发的崩溃详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-14

objc方法怎么声明和实现由于参数类型不一致所引发的崩溃

本篇内容主要讲解“objc方法怎么声明和实现由于参数类型不一致所引发的崩溃”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“objc方法怎么声明和实现由于参数类型不一致所引发的崩溃”吧!正文你有注意
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录