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

FluentMybatis快速入门的示例分析

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

FluentMybatis快速入门的示例分析

这篇文章主要介绍FluentMybatis快速入门的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一。 不再需要在Dao中组装查询或更新操作,在xml或mapper中再组装参数。

对底层数据表关联关系的处理,我们总是绕不开什么一对一,一对多,多对多这里比较烦人的关系。 业界优秀的ORM框架也都给出了自己的答案,简单来说就以下几种方式:

hibernate和JPA对开发基本屏蔽了底层数据的处理,只需要在model层设置数据级联关系即可。但这种设置也往往是噩梦的开始。
mybatis 提供了简单的@One @Many注解,然后编写xml映射关系来提供级联处理。
还有一种就是干脆不依赖框架,直接应用自己掌控。
因为FluentMybatis是基于mybatis上做封装和扩展的,所以这里主要聊聊mybatis处理的方式,以及给出FluentMybatis的解放方案。

那么就可以建以下3张表:

数据字典

CREATE TABLE t_member(id bigint(21) unsigned auto_increment primary key COMMENT ‘主键id',user_name varchar(45) DEFAULT NULL COMMENT ‘名字',is_girl tinyint(1) DEFAULT 0 COMMENT ‘0:男孩; 1:女孩',age int DEFAULT NULL COMMENT ‘年龄',school varchar(20) DEFAULT NULL COMMENT ‘学校',gmt_created datetime DEFAULT NULL COMMENT ‘创建时间',gmt_modified datetime DEFAULT NULL COMMENT ‘更新时间',is_deleted tinyint(1) DEFAULT 0 COMMENT ‘是否逻辑删除') ENGINE = InnoDBCHARACTER SET = utf8 COMMENT = ‘成员表:女孩或男孩信息';CREATE TABLE t_member_love(id bigint(21) unsigned auto_increment primary key COMMENT ‘主键id',girl_id bigint(21) NOT NULL COMMENT ‘member表外键',boy_id bigint(21) NOT NULL COMMENT ‘member表外键',status varchar(45) DEFAULT NULL COMMENT ‘状态',gmt_created datetime DEFAULT NULL COMMENT ‘创建时间',gmt_modified datetime DEFAULT NULL COMMENT ‘更新时间',is_deleted tinyint(2) DEFAULT 0 COMMENT ‘是否逻辑删除') ENGINE = InnoDBCHARACTER SET = utf8 COMMENT = ‘成员恋爱关系';CREATE TABLE t_member_favorite(id bigint(21) unsigned auto_increment primary key COMMENT ‘主键id',member_id bigint(21) NOT NULL COMMENT ‘member表外键',favorite varchar(45) DEFAULT NULL COMMENT ‘爱好: 电影, 爬山, 徒步…',gmt_created datetime DEFAULT NULL COMMENT ‘创建时间',gmt_modified datetime DEFAULT NULL COMMENT ‘更新时间',is_deleted tinyint(2) DEFAULT 0 COMMENT ‘是否逻辑删除') ENGINE = InnoDBCHARACTER SET = utf8 COMMENT = ‘成员爱好';

添加项目Maven依赖
具体pom.xml文件

代码生成

public class AppEntityGenerator {static final String url = “jdbc:mysql://localhost:3306/fluent_mybatis_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8”;static final String basePackage = “cn.org.fluent.mybatis.many2many.demo”;public static void main(String[] args) {    FileGenerator.build(Noting.class);}@Tables(        url = url, username = "root", password = "password",        basePack = basePackage,        class="lazy" data-srcDir = "example/many2many_demo/class="lazy" data-src/main/java",        gmtCreated = "gmt_create", gmtModified = "gmt_modified", logicDeleted = "is_deleted",        tables = @Table(value = {"t_member", "t_member_love", "t_member_favorite"}, tablePrefix = "t_"))static class Noting {}}

这样就生成了3个Entity类: MemberEntity, MemberFavoriteEntity, MemberLoveEntity。

关系分析

现在我们来理一理这里面的关系

一对多: 一个成员可以有多个爱好
多对多: 一个成员可以有多个男女朋友(前任+现任)
一对一: 一个成员只能有一个现任男女朋友
mybatis处理手法
mybatis提供了@One 和 @Many的注解来处理简单(只有主键和外键依赖)的一对一,和一对多的关系 具体到上面的关系,mybatis只能关联查询成员的爱好,对带条件的(不是只通过外键)现任男女朋友的一对一也没有办法处理。

我这里就不具体展开mybatis的配置语法了,感兴趣读者可以看下下面文章:

Mybatis一对多、多对一处理

Mybatis传递多个参数进行SQL查询的用法

MyBatis注解 & 多对一、一对多

MyBatis系列4:一对一,一对多,多对多查询及延迟加载(N+1问题)分析

鉴于mybatis只能处理简单的关联关系,fluent mybatis就没有直接封装mybatis的处理方式,那fluent mybatis是如何处理上述的关联关系的。 我们先从mybatis也可以处理的一对多的爱好列表入手

一对多的爱好列表处理
fluent mybatis要根据MemberEntity自动返回对应的爱好列表,需要下面几个设置:

MemberEntity继承RichEntity基类
在MemberEntity类里面增加方法 findMyFavorite()
给findMyFavorite方法加上注解 @RefMethod
在注解中增加关联关系: “memberId=id”,意思是 MemberFavoriteEntity.memberId等于MemberEntity.id
具体代码片段如下, 所有这些操作都可以通过代码生成,这里手工添加仅仅是为了讲解

public class MemberEntity extends RichEntity implements IEntity {// …@RefMethod(“memberId=id”)public List findMyFavorite() {return super.loadCache(“findMyFavorite”, MemberEntity.class);}}

好了,我们已经建立好通过Member实例查询爱好列表的功能了,重新编译项目 在generated-sources目录下面,会多出一个文件: Refs

public abstract class Refs extends EntityRefQuery {public List findMyFavoriteOfMemberEntity(MemberEntity entity) {return memberFavoriteMapper.listEntity(new MemberFavoriteQuery().where.memberId().eq(entity.getId()).end());}}

在这个类里面自动生成了一个方法: findMyFavoriteOfMemberEntity, 入参是MemberEntity, 出参是List, 实现里面根据member的id查询了成员的所有爱好。

增加Spring Bean
我们新建一个类: AllRelationQuery (名称根据你的喜好和业务随便取), 继承Refs, 并把AllRelationQuery加入Spring管理即可。

@Servicepublic class AllRelationQuery extends Refs {}

老套路,写个测试验证下

@RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)public class FindMemberFavoriteTest {@Autowiredprivate MemberMapper memberMapper;@Beforepublic void setup() {    // 省略数据准备部分}@Testpublic void findMyFavorite() {    MemberEntity member = memberMapper.findById(1L);    List<MemberFavoriteEntity> favorites = member.findMyFavorite();    System.out.println("爱好项: " + favorites.size());}}

查看控制台log输出

DEBUG - ==> Preparing: SELECT id, …, user_name FROM t_member WHERE id = ?
DEBUG -> Parameters: 1(Long)
DEBUG - < Total: 1
DEBUG - ==> Preparing: SELECT id, …, member_id FROM t_member_favorite WHERE member_id = ?
DEBUG -> Parameters: 1(Long)
DEBUG - < Total: 2
爱好项: 2

如日志所示,Fluent Mybatis按照预期返回了爱好列表。

给一对多关系添点油加点醋
做过业务系统的同学都知道,数据库中业务数据一般会有一个逻辑删除标识,按照上述逻辑查询出来的数据,我们会把已经废弃(逻辑删除掉)的爱好也一并查询出来了,那我们如何只查询出未逻辑删除(is_deleted=0)的爱好列表呢。

如果采用mybatis的方案,那我们只能耸耸肩,摊开双手说: “爱莫能助,你自己写SQL实现吧”, 但fluent mybatis对这类场景的支持的很好,我们只要给@RefMethod注解值加点条件就可以了, MemberFavoriteEntity.memberId=MemberEntity.id并且Favorite的逻辑删除标识和Member表一样,具体定义如下:

public class MemberEntity extends RichEntity implements IEntity {@RefMethod(“memberId=id && isDeleted=isDeleted”)public List findMyFavorite() {return super.loadCache(“findMyFavorite”, MemberEntity.class);}}

重新编译项目,观察Refs代码

public abstract class Refs extends EntityRefQuery {public List findMyFavoriteOfMemberEntity(MemberEntity entity) {return memberFavoriteMapper.listEntity(new MemberFavoriteQuery().where.isDeleted().eq(entity.getIsDeleted()).and.memberId().eq(entity.getId()).end());}}

查询条件上带上了逻辑删除条件

跑测试,看log

DEBUG - ==> Preparing: SELECT id, …, user_name FROM t_member WHERE id = ?DEBUG - > Parameters: 1(Long)DEBUG - < Total: 1DEBUG - ==> Preparing: SELECT id, …, member_id FROM t_member_favoriteWHERE is_deleted = ?AND member_id = ?DEBUG - > Parameters: false(Boolean), 1(Long)DEBUG - < Total: 2爱好项: 2

FluentMybatis轻松处理了多条件关联的一对多关系, 这个在业务中不仅仅限定于逻辑删除, 还可以推广到部署环境标识(deploy_env), 租户关系等条件上,还有只有你业务中才用到的状态相关的关系上。

Fluent Mybatis对多对多关系处理
fluent mybatis可以轻松处理一对一,一对多的简单和多条件的关联关系,但对多对多也没有提供自动化代码生成的处理手段。 因为多对多,本质上涉及到3张表, A表, B表,AB关联表。 但fluent mybatis还是提供了半自动手段,对这类场景进行了支持,比如我们需要MemberEntity中返回所有前任恋人列表。

在MemberEntity中定义方法: exFriends()

public class MemberEntity extends RichEntity implements IEntity {@RefMethodpublic List findExFriends() {return super.loadCache(“findExFriends”, MemberEntity.class);}}

和上面的自动化的一对多关系有个区别,@RefMethod上没有设置查询条件,我们重新编译项目。 我们观察Refs类,除了刚才的findMyFavoriteOfMemberEntity方法实现外,还多出一个抽象方法: findExFriendsOfMemberEntity

public abstract class Refs extends EntityRefQuery {public abstract List findExFriendsOfMemberEntity(MemberEntity entity);}

在动手实现代码前,我们先分析一下混乱的男女朋友关系
在member表上,我们使用了一个性别字段 is_girl来区别是男的还是女的, 在恋爱关系表上,分别有2个外键girl_id, boy_id来标识一对恋人关系。 这样,如果member是女的,要查询所有前任男朋友,那么sql语句就如下:

select * from t_memberwhere is_deleted=0and id in (select boy_id from t_memeber_lovewhere status = ‘前任'and girl_id = ? – 女孩idand is_deleted = 0)


如果member是男的,要查询所有前任女朋友,那么sql语句条件就要倒过来:

select * from t_memberwhere is_deleted=0and id in (select girl_id from t_memeber_lovewhere status = ‘前任'and boy_id= ? – 男孩idand is_deleted = 0)

实现查询前男(女)朋友列表功能
一般来说,为了实现上面的分支查询,在mybatis的xml文件中需要配置 这样的标签代码分支, 或者在java代码中实现 if(…){}else{}的代码逻辑分支。 那我们来看看fluent mybatis时如何实现上述查询的呢?我们就可以在刚才定义的Refs子类上实现findExFriendsOfMemberEntity自己的逻辑。

@Servicepublic class AllRelationQuery extends Refs {@Overridepublic List findExFriendsOfMemberEntity(MemberEntity entity) {MemberQuery query = new MemberQuery().where.isDeleted().isFalse().and.id().in(MemberLoveQuery.class, q -> q.select(entity.getIsGirl() ? boyId.column : girlId.column).where.status().eq(“前任”).and.isDeleted().isFalse().and.girlId().eq(entity.getId(), o -> entity.getIsGirl()).and.boyId().eq(entity.getId(), o -> !entity.getIsGirl()).end()).end();return memberMapper.listEntity(query);}}

写测试看log

@RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)public class FindExFriendsTest {@Autowiredprivate MemberMapper memberMapper;@Testpublic void findExBoyFriends() {    MemberEntity member = memberMapper.findById(1L);    System.out.println("是否女孩:" + member.getIsGirl());    List<MemberEntity> boyFriends = member.findExFriends();    System.out.println(boyFriends);}}

控制台日志

DEBUG - ==> Preparing: SELECT id, …, user_name FROM t_member WHERE id = ?DEBUG - > Parameters: 1(Long)DEBUG - < Total: 1是否女孩:trueDEBUG - ==> Preparing: SELECT id, …, user_name FROM t_memberWHERE is_deleted = ?AND id IN (SELECT boy_idFROM t_member_loveWHERE status = ?AND is_deleted = ?AND girl_id = ?)DEBUG - > Parameters: false(Boolean), 前任(String), false(Boolean), 1(Long)DEBUG - < Total: 1[MemberEntity(id=2, gmtModified=Sun Nov 08 12:31:57 CST 2020, isDeleted=false, age=null, gmtCreated=null, isGirl=false, school=null, userName=mike)]

如日志所示,在查询前男友列表是,条件会根据Member的是否是女孩进行分支切换,这也是fluent mybatis动态条件强大的地方。

以上是“FluentMybatis快速入门的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

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

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

FluentMybatis快速入门的示例分析

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

下载Word文档

猜你喜欢

FluentMybatis快速入门的示例分析

这篇文章主要介绍FluentMybatis快速入门的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql
2023-06-20

Linux系统快速入门的示例分析

Linux系统快速入门的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我
2023-06-05

PHP编程快速入门的示例分析

这篇文章将为大家详细讲解有关PHP编程快速入门的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。面向对象编程(OOP)是我们编程的一项基本技能,PHP4对OOP提供了良好的支持。如何使用OOP的思想
2023-06-17

Python快速入门实例代码分析

这篇文章主要介绍了Python快速入门实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python快速入门实例代码分析文章都会有所收获,下面我们一起来看看吧。Python 安装已经安装软件的小伙伴要检
2023-07-05

Canvaskit快速入门实例代码分析

这篇“Canvaskit快速入门实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Canvaskit快速入门实例代码
2023-07-05

MyBatis框架零基础快速入门案例分析

这篇文章主要讲解了“MyBatis框架零基础快速入门案例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MyBatis框架零基础快速入门案例分析”吧!一、创建数据库和表数据库名ssm,数据
2023-06-29

快速汉化RHEL6的示例分析

这篇文章将为大家详细讲解有关快速汉化RHEL6的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。做汉化操作前,请确保yum源正常。汉化:确保yum源正常[root@localhost
2023-06-05

Druid入门(1)—— 快速入门实时分析利器-Druid_0.17

一、安装准备本次安装的版本是截止2020.1.30最新的版本0.17.0软件要求需要Java 8(8u92 +)以上的版本,否则会有问题Linux,Mac OS X或其他类似Unix的操作系统(不支持Windows)硬件要求Druid包括一组参考配置和用于单机
Druid入门(1)—— 快速入门实时分析利器-Druid_0.17
2019-09-20

PHP数组用法详解:快速入门与实例分析

PHP 数组是一种非常强大且灵活的数据结构,可以存储多个值并按照索引或键进行访问。在 PHP 中,数组的使用非常普遍,因此掌握数组的用法是非常重要的。本文将从快速入门开始,介绍 PHP 数组的基本概念以及常见操作,并通过实例分析来帮助读者深
PHP数组用法详解:快速入门与实例分析
2024-03-14

快速入门 Python 数据分析实用指

Python 现如今已成为数据分析和数据科学使用上的标准语言和标准平台之一。那么作为一个新手小白,该如何快速入门 Python 数据分析呢?下面根据数据分析的一般工作流程,梳理了相关知识技能以及学习指南。数据分析一般工作流程如下:数据采集数
2023-01-31

C语言入门基础的示例分析

这篇文章给大家分享的是有关C语言入门基础的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。先上思维导图。如图所示,现在还是初识C语言的第一部分,本次只介绍了C语言本身特点,数据类型,常量变量,字符串转义字符
2023-06-20

Docker基础入门以及示例分析

这篇文章将为大家详细讲解有关Docker基础入门以及示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一. docker基础介绍  可能很多朋友对docker还停留在听说过,并没有认真关
2023-06-19

编程热搜

  • 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动态编译

目录