mybatis的mapper.xml中resultMap标签的使用详解

 更新时间:2020年06月16日 11:22:44   作者:csdnzoutao  
这篇文章主要介绍了mybatis的mapper.xml中resultMap标签的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.前言

  最近博主在做一个ssm框架的共享汽车管理系统,其中,数据库字段设计的有下划线方式,a_username,然后在写mapper.xml里面的sql语句的时候,一直出现查询语句查询的值为null的情况。或者是resultMap标签和驼峰规则不太明白的同学,可以看这里。

于是顺便梳理一下。

2.关于resultMap

2.1.什么是resultMap

  在mybatis中有一个resultMap标签,它是为了映射select查询出来结果的集合,其主要作用是将实体类中的字段与数据库表中的字段进行关联映射。

注意

当实体类中的字段与数据库表中的字段相同时,可以将resultMap标签中的关联关系忽略不写。
当实体类中的字段与数据库表中的字段不相同时,就需要在resultMap标签中将实体类字段与数据库字段一 一进行关联映射,或者开启驼峰规则,让它自动转换。

3.举例说明

3.1.数据库与实体类之间名称相同

数据库这么写:

 

然后对应写的实体类:

在mapper中的查询方式:

可以看到,是最常规的sql查询写法,这样就能正常的查询到数据库的数据。

当然这个时候开不开启驼峰规则都可以,比如在mybatis的配置文件中声明开启,也是一样的效果。

这是为什么呢?
顺便说几个关于实体类、数据库、json格式的知识。

数据库字段、索引对大小写是不敏感的,驼峰标识无意义;也就是你开不开启实际上都一样。

json 的规范格式是带有下划线的;比如:

{“id”:”1234” 
“user_name”:”Lilan”;}

数据库字段和 bean 之间字段转换,主流 orm 工具都有映射转换支持,比如上图mybatis中开启的驼峰规则;

json 和 bean 之间字段转换,可以使用注解 @JsonProperty,比如写实体类的时候:@JsonProperty("user_name")
private String userName;

3.2.数据库与实体类之间不相同

比如常见的写法: 数据库使用下划线,与之映射的实体类中采用驼峰原则。
两种处理方式:

第一种:开启驼峰规则

数据库如下:

 

实体类如下:

解决:

在mybatis的配置文件里加入如上的配置,就基本不用property进行字段和实体和属性的映射
在进行sql查询和初始化实体时mybatis会为我们自动转化,写sql语句的时候也不必为有下划线的字段设置与实体类相同的别名。
如未加配置之前的sql查询语句为(使用别名):
select id, user_name as userName, user_sex as userSex, user_age as userAge from user
加入配置之后的sql语句为(直接使用数据库字段名):
select id, user_name, user_sex, user_age from user

Sql如下:

这样就能直接查询出数据库里面的数据。

第二种:使用resultMap标签来映射

比如数据库:

实体类如下:

然后在mapper.xml中书写resultMap标签,使得数据库字段和实体类
名称映射。(将实体类字段与数据库字段在标签中进行一一映射)

源码如下:

 <!-- type指向javabean类,id可自定义 -->
  <resultMap id="BaseResultMap" type="com.zout.entity.Admin" >
    <id column="aid" property="aid" jdbcType="INTEGER" />
    <!-- property对应实体类的属性名称,column为数据库字段名 -->
    <result column="a_pid" property="aPid" jdbcType="INTEGER" />
    <result column="a_username" property="aUsername" jdbcType="VARCHAR" />
    <result column="a_password" property="aPassword" jdbcType="VARCHAR" />
    <result column="a_real_name" property="aRealName" jdbcType="VARCHAR" />
    <result column="a_phone" property="aPhone" jdbcType="VARCHAR" />
    <result column="a_role" property="aRole" jdbcType="VARCHAR" />
    <result column="a_icon" property="aIcon" jdbcType="VARCHAR" />
    <result column="a_login_time" property="aLoginTime" jdbcType="TIMESTAMP" />
    <result column="a_create_time" property="aCreateTime" jdbcType="TIMESTAMP" />
    <result column="a_update_time" property="aUpdateTime" jdbcType="TIMESTAMP" />
    <result column="a_comment" property="aComment" jdbcType="VARCHAR" />
  </resultMap>

提醒:

要记得去mybatis的配置文件中查看是否已经去掉驼峰规则的声明。使用resultMap,就要禁用驼峰规则。如果不想改实体类的话,建议采用resultMap。

如图:

然后sql如下:

这样就能获取到对应的数据。sql语句书写的时候也可以直接采用数据库字段名。

4.总结

第一点:

1.mybatis配置文件设置了这项后,查询出来的字段如果带下划线,那么就会去掉下划线,
然后采用java驼峰规则。

比如数据库字段Parent_id,那么查询出来后,会转为parentid,然后去实体类Category匹配对应的字段。 这个时候实体类里就不能写有下划线,不然就匹配不上。会出现查询结果都是null值。

第二点:

1.当进行单表简单查询时且返回值类型是基本类型时,一般mapper的返回类型尽量使用resultType=”xxxx”;

2.当进行多表关联查询时,或者说xml中定义了相关的resultMap标签,那么就一般尽量使用resultMap=”xxxx”;

3.在mapper.xml当中,resultType和resultMap是不能同时使用。

第三点:

关于数据库字段和实体类名称不相同的时候,要么采用resultMap标签, 要么启用驼峰规则,但是两者不能同时使用。

到此这篇关于mybatis的mapper.xml中resultMap标签的使用详解的文章就介绍到这了,更多相关mybatis resultMap标签使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • log4j2 项目日志组件的实例代码

    log4j2 项目日志组件的实例代码

    下面小编就为大家分享一篇log4j2 项目日志组件的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Java使用访问者模式解决公司层级结构图问题详解

    Java使用访问者模式解决公司层级结构图问题详解

    这篇文章主要介绍了Java使用访问者模式解决公司层级结构图问题,结合实例形式分析了访问者模式的概念、原理及Java使用访问者模式解决公司曾经结构图问题的相关操作技巧与注意事项,需要的朋友可以参考下
    2018-04-04
  • mybatis自定义参数类型转换器数据库字段加密脱敏

    mybatis自定义参数类型转换器数据库字段加密脱敏

    这篇文章主要为大家介绍了mybatis自定义参数类型转换器数据库字段加密脱敏,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Python如何使用@property @x.setter及@x.deleter

    Python如何使用@property @x.setter及@x.deleter

    这篇文章主要介绍了Python如何使用@property @x.setter及@x.deleter,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Spring实战之属性覆盖占位符配置器用法示例

    Spring实战之属性覆盖占位符配置器用法示例

    这篇文章主要介绍了Spring实战之属性覆盖占位符配置器用法,结合实例形式分析了Spring属性覆盖占位符配置器相关原理、配置与使用技巧,需要的朋友可以参考下
    2019-12-12
  • Java中基于Nacos实现Sentinel规则持久化详解

    Java中基于Nacos实现Sentinel规则持久化详解

    这篇文章主要介绍了Java中基于Nacos实现Sentinel规则持久化详解,Sentinel Dashboard中添加的规则数据存储在内存,微服务停掉规则数据就消失,在⽣产环境下不合适,我们可以将Sentinel规则数据持久化到Nacos配置中⼼,让微服务从Nacos获取规则数据,需要的朋友可以参考下
    2023-09-09
  • Java定时任务的三种实现方法

    Java定时任务的三种实现方法

    在应用里经常都有用到在后台跑定时任务的需求。举个例子,比如需要在服务后台跑一个定时任务来进行垃圾回收
    2014-04-04
  • 解决微服务下Mybatis xml无效绑定问题及分析Invalid bound statement

    解决微服务下Mybatis xml无效绑定问题及分析Invalid bound statement

    这篇文章主要介绍了解决微服务下Mybatis xml无效绑定问题及分析Invalid bound statement,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • springboot-mysql-HikariCP集成过程

    springboot-mysql-HikariCP集成过程

    HiKariCP opens new window是数据库连接池的一个后起之秀,号称性能最好,可以完美地 PK 掉其他连接池,这篇文章主要介绍了springboot-mysql-HikariCP集成过程,需要的朋友可以参考下
    2023-07-07
  • Mybatis中使用in()查询的方式详解

    Mybatis中使用in()查询的方式详解

    当参数有值,添加条件查询,附带一个字符串的in查询,下面这篇文章主要给大家介绍了关于Mybatis中使用in()查询的方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08

最新评论