MyBatis-Plus中如何使用ResultMap
在涉及到关系型数据库增删查改的业务时,我比较喜欢用 MyBatis-Plus ,开发效率极高。具体的使用可以参考官网,或者自己上手摸索感受一下。
下面简单总结一下在 MyBatis-Plus 中如何使用 ResultMap 。
先看个例子:
有如下两张表:
其中, tb_hero 中的 bid 关联 tb_book 表的 id 。
下面先看 Hero 实体类的代码,如下:
注意了,我特地把 tb_hero 表中的 bid 字段映射成实体类 Hero 中的 bookId 属性。
MyBatis-Plus 打印出的 SQL 为:
没毛病, MyBatis-Plus 会根据 @TableField 指定的映射关系,生成对应的 SQL 。
MyBatis-Plus 打印出的 SQL 为:
也没毛病,可以看到生成的 SELECT 中把 bid 做了别名 bookId 。
比如现在我想连接 tb_hero 与 tb_book 这两张表,如下:
查询 MyBatis-Plus 打印出的 SQL 为:
SQL没啥问题,过滤与分页也都正常,但是此时你会发现 bookId 属性为 null ,如下:
为什么呢?
调用 BaseMapper 中内置的 selectById() 方法并没有出现这种情况啊???
回过头来再对比一下在 HeroMapper 中自己定义的查询与 MyBatis-Plus 自带的 selectById() 有啥不同,还记得上面的刚刚的测试吗,生成的SQL有啥不同?
原来, MyBatis-Plus 为 BaseMapper 中内置的方法生成SQL时,会把 SELECT 子句中 bid 做别名 bookId ,而自己写的查询 MyBatis-Plus 并不会帮你修改 SELECT 子句,也就导致 bookId 属性为 null 。
在这里就是 tb_hero 表中的 bid 字段映射成实体类 Hero 中的 bid 属性。这样当然可以解决问题,但不是本篇讲的重点。
在 @TableName 设置 autoResultMap = true
然后在自定义查询中添加 @ResultMap 注解,如下:
这样,也能解决问题。
下面简单看下源码, @ResultMap("mybatis-plus_实体类名") 怎么来的。
详情见: com.baomidou.mybatisplus.core.metadata.TableInfo#initResultMapIfNeed()
注意看上面的字符串 id 的构成,你应该可以明白。
思考: 这种方式的 ResultMap 默认是强绑在一个 @TableName 上的,如果是某个聚合查询或者查询的结果并非对应一个真实的表怎么办呢?有没有更优雅的方式?
基于上面的思考,我做了下面简单的实现:
关键代码其实没有几行,耐心看下应该不难懂。
还是用例子来说明更直观。
下面是一个聚合查询:
其中 BookAgg 的定义如下,在实体类上使用了 @AutoResultMap 注解:
简历上的项目描述(JAVA)怎么写
4.熟练的使用Hibernate、MyBatis等ORM框架,熟悉Hibernate和MyBatis的核心API,对Hibernate的关联映射、继承映射、组件映射、缓存机制、事务管理以及性能调优等有深入的理解。 5.熟练的使用HTML、CSS和JavaScript进行Web前端开发,熟悉jQuery和Bootstrap,对Ajax技术在Web项目中的应用有深入理解,有使用前端MVC框架(AngularJS)...
java工程师面试时最看重的是什么?
熟练的使用HTML、CSS和JavaScript进行Web前端开发,熟悉jQuery和Bootstrap,对Ajax技术在Web项目中的应用有深入理解,有使用前端MVC框架(AngularJS)和JavaScript模板引擎(HandleBars)进行项目开发的经验。 熟悉常用的关系型数据库产品(MySQL、Oracle),熟练的使用SQL和PL\/SQL进行数据库编程。 熟悉面向对象的设计原则,对GoF设计模...
面试的窍门是什么?面试时,企业最看重的是什么?
对Spring的IoC容器和AOP原理有深入了解,熟练的运用Spring框架管理各种Web元件及其依赖关系,熟练的使用Spring进行事务、日志、安全性等的管理,有使用SpringMVC作为表示层技术以及使用Spring提供的持久化支援进行Web专案开发的经验,熟悉Spring对其他框架的整合。 熟练的使用Hibernate、MyBatis等ORM框架,熟悉Hibernate和MyBatis的...
学习Java软件工程师未来有哪些就业方向?
Java开发的就业方向一:Java企业级应用开发目前Java在许多行业的企业信息应用方面的应用非常多,比如OA、邮箱、股票、金融、考试、物流、医疗、矿山等信息方面的系统。该方向和行业密切相关,所以,这是一个经验型的发展方向。Java开发者在这方面的需求也非常大,待遇也相当不错,有三到五年工作经验的年薪在...
面试的窍门是什么?面试时,企业最看重的是什么?
(面向切面程式设计)技术; L目前广泛使用的有memcached和Redis; M的选择方案很多,最有可能的是hibernate和MyBatis,也可以两种技术同时运用,但通常是将增删改交给hibernate来处理,而复杂的查询则由MyBatis完成,此外TopLink、jOOQ也是优秀的持久层解决方案; N底层的资料存取传统上是使用关系型资料库,可以是MySQL、Oracle...
革行野木: IntelliJ idea 发工具相关资料少加家入手难度今mybatis插件安装做示例能于已经用值提于我些资般刚始使用我想些帮助 安装步骤: 一.载插件 mybatis 插件 插件载完毕存放指定位置文件名默认应该:mybatis-plus.jar 二.打Intellij idea工具打菜单 File --> settings 选择 Plugs点击Install plug from disk选择刚刚载插件jar文件确认直接显示mybatis插件其信息表示安装功 三.插件安装打settings,Mybatis
鸡西市17372106459: mybatis plus 如何设置机器id和数据库id - ?
革行野木: mybatis自增主键配置:mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同.基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键.主要说明下在mybatis中对于自增主键的配置.1、不返回自增主键值...
鸡西市17372106459: 如何在idea中使用Mybatis - generator插件快速生成代码 - ?
革行野木: 配置Mybatis Generator不要生成Example类 Mybatis Generator默认设置会生成一大堆罗哩罗嗦的Example类,主要是用各种不同的条件来操作数据库,大部分是用不到的,用到的时候手工修改mapper和接口文件就行了.
鸡西市17372106459: mybatis plus怎么自动生成代码 - ?
革行野木: MyBatis中,可以使用Generator自动生成代码,包括DAO层、 MODEL层 、MAPPING SQL映射文件.
鸡西市17372106459: Idea怎么安装Mybatis Generator插件 - ?
革行野木: mybatis generator插件安装方法 1、首先解压文件,然后将其中的“features”文件夹和“plugins”文件夹复制到eclipse的安装目录. 2、然后打开我们的eclipse,点击file,选择new,然后找到其中的other,点击. 3、然后选择我们的插件
鸡西市17372106459: Idea怎么安装Mybatis Generator插件 - ?
革行野木: IntelliJ idea 开发工具的相关资料很少,加大了大家入手的难度,今天就以mybatis的插件安装做下示例,可能对于已经会用的人不值一提但是对于我们这些天资一般刚开始使用,我想还是...
鸡西市17372106459: “mybatis”中怎么执行“truncate”? - ?
革行野木: mybaits是对jdbc的封装,一样可以执行sql语句,而truncate也算sql语句,所以直接写sql语句配置在mapper.xml中,再用你惯用额方式调用即可.1:在Mybatis配置文件中加上以下配置: <!-- 选择log4j为Mybatis的记录日志文件--> <settings> ...
鸡西市17372106459: 如何MyBatis中使用动态SQL查询与注释 - ?
革行野木: 静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的.静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部.而后程...
鸡西市17372106459: 如何优雅的使用 mybatis - ?
革行野木: mybatis初期使用比较麻烦,需要各种配置文件、实体类、dao层映射关联、还有一大推其它配置.当然mybatis也发现了这种弊端,初期开发了generator可以根据表结果自动生产实体类、配置文件和dao层代码,可以减轻一部分开发量;后期也进行了大量的优化可以使用注解了,自动管理dao层和配置文件等,发展到最顶端就是今天要讲的这种模式了,mybatis-spring-boot-starter就是springboot+mybatis可以完全注解不用配置文件,也可以简单配置轻松上手.
鸡西市17372106459: mybatis 中模糊查询sql 怎么使用 - ?
革行野木: select * from a inner join b on a.id = b.u_id where a.name like '%王%' andb.phone like '%138%';