自制基于MyBatis简易数据库交互组件(不需要写sql进行数据库的cudr操作)

Mybatis自动化生成sql组件 —by 九根刺的刺猬

自制基于mybatis简易数据库交互组件,用户引入jar包后,只要在dao层继承BaseDao类接口,就能实现类似于jpa规划似的数据库操作,无需在配置mapper.xml和写sql代码,数据通过参数传入即可。文章末尾提供jar包的下载地址,有兴趣的小伙伴可以下载试试。

一、需求背景及需求目标

1.需求背景:mybatis提供了便捷的数据库cudr操作的方式,但是传统的mybatis的使用,需要根据数据库表的映射,形成一一对应的实体类,以及创建复杂对应实体的mapper.xml 的映射文件,sql语句编写也比较麻烦,还是需要在mapper中窜写完整的sql语句脚本,影响开发效率,所以个人在此背景下自制封装了该组件,力求尽量不写mapper.xml,不写sql语句,只通过像类方法一样调用cudr操作,数据通过传参即可完成,用户只要写dao层就行。

2.需求目标:通过该组件,实现与数据库的cudr操作,不在通过mapper.xml来进行配置,尽量不写sql语句,而是像普通方法一样,简单调用存储,或者更新等方法,传入相应的参数即可,组件自动帮我生成sql与数据库进行操作;同时抛弃传统的实体类与数据库表以及与mapper.xml文件必须一一对应的关系,更加自由的编写相关dao层代码。

二、组件功能和使用

组件主要功能:

1.   提供像类方法一样的对mysql数据库cudr操作,无需编写mapper.xml配置及传统sql语句;库表名称、字段通过参数进行传入相应方法即可。  

2.    提供数据库与实体类自动映射,无需通过xml配置,且通过类似jpa规范的@column注释标签,可以实现通过标签注释来实现与库表字段进行映射,而不用要求实体属性名必须与库表字段名保持一致,或需要实体类要求在某个特定的扫描包下。

3.   提供分页查询功能,传入相应的参数,即可查出分页的内容

4.   提供log4j日志打印,每调用相关的cudr操作的方法,控制台都会打印出自动生成的相关sql语句日志,可用于日后debug等操作。


组件的使用:

前提:该组件依赖与spring框架及mybatis组件框架,所以在使用时请确保已经引入了相关依赖的jar包(spring项目和springboot项目都能直接使用),以及因为组件还使用了log4j日志打印功能,所以也需要依赖与log4j的jar包。

1.    组件已经打包成jar包的形式,普通web项目可以直接把jar把放到相应的lib目录下就能使用,maven项目可以在任意目录下创建lib包,将jar包放入后,pom.xml配置里加入下面这段话引入jar包


2.   引入组件jar包后就可以正式开始使用了.

在相应的dao层类中,只要继承BaseDao,就能使用相应的增删改查的方法了,无需mapper.xml配置。

示例如下:

对应库表数据的实体类代码示例如下:


实体类提供了@Column标签注释,可以通过该标签来实现与数据库字段的一一对应,如果属性没有该标签,则根据属性名称与数据库字段对应。(即@Column注释里的值要与库表字段名称一致;或者不用@Column,属性的名称要和库表字段名称一致)


三、BaseDao类提供的CUDR方法使用说明:

findByEx

功能:条件查询具体某个结果


参数及说明

1)BaseDaoQuery  query: 查询条件。如果为null,则不带查询条件查询(后文会有查询条件query方法的相关说明);

2)List  dataBaseName(必填): 需要查询的数据库表名称。之所以用集合的方式是,组件提供了内联查询,支持多表关联查询,所以有涉及到多表时,可以以集合的方式传入多个库表名称

3)List  result: 需要查询的结果字段集合。如果为null,则查询全部,相当于select *;需要具体查询某个字段时,可以集合方式传入

4)Class  target(必填):查询出的结果实体类。用以映射查询结果的类

 

返回值:

Class 与数据库表字段映射的实体类


示例:


 

 

findListByEx

功能:条件查询结果集合


参数及说明:

1)BaseDaoQuery  query: 查询条件(同上说明)

2)List  dataBaseName(必填): 要查询的数据库表名称(同上说明)

3)List  result: 需要查询的结果字段集合(同上说明)

4)Class  target(必填):查询出的结果实体类,用以映射查询结果的类

 

返回值:

<T> List<T> 返回传入的结果类集合

 

示例


 

findPageByEx

功能:分页条件查询数据库表结果


参数及说明

1)BaseDaoQuery  query:查询条件(同上说明)

2)List  dataBaseName(必填):要查询的数据库表名称集合(同上说明)

3)List  result:需要查询的结果字段名称集合(同上说明)

4)Page page(必填): 分页信息;组件自带的类,提供存储分页的信息,及分页的数据(具体可查看源码);作为参数时传入时续提供每页展示数量pageSize,和起始页pageNo;默认初始化page时每页数量为15,起始页为1

5)Class  target(必填):查询出的数据结果实体类(同上说明)


返回值:

Page 将返回一个page类,page属性包括分页的信息,起始页,每页条数,是否有下一页,查询到的结果数据,结果总条数。


示例:


 

 

findOne

功能:条件查询某个具体值


参数及说明

1)BaseDaoQuery  query:查询条件(同上说明)

2)List  dataBaseName(必填):要查询的数据库表名称集合(同上说明)

3)String result(必填): 要查询的数据库具体字段名称


返回值:

String 返回具体的某个字段值,如统计用户数量啊,查询参数的数据库字段名称填“count(*)”

查询结果就为,用户数量50;


示例:


 

findListOne

功能:条件查询某个具体值集合


参数及说明

1)BaseDaoQuery  query:查询条件(同上说明)

2)List  dataBaseName(必填):要查询的数据库表名称集合(同上说明)

3)String result(必填): 要查询的数据库具体字段名称

返回值:

List  返回查询的字段值的集合,如查询年龄都在18岁所有用户的名字


示例:


 

 

 

save

功能:保存(插入)实体类信息到指定库表


参数及说明:

1)String  dataBaseName(必填)要插入的指定库表名称

2)Object  target(必填)需要保存的实体类


返回值:

Int  返回插入成功的执行条数


示例




updateByEx

功能:指定条件更新库表字段


参数及说明:

1)String dataBaseName(必填)要指定修改的库表名称

2)BaseDaoQuery  query:查询条件(同上说明);如果为null,则更新库表所有字段

3)Object  target(必填): 需要更新的实体类,如果实体类中的某个属性值为null,则该值不参与更新


返回值

Int  更新成功操作数据库的条数


示例


deleteByEx

功能:指定条件删除库表信息


参数及说明:

1)   String dataBaseName(必填)要指定删除数据的库表名称

2)  BaseDaoQuery query: 条件语句(同上说明);如果该参数为null,可能删除该库表下所以数据

 

返回值:

int  删除成功的数据操作条数


示例


四、关与BaseDaoQuery 查询条件类的使用

BaseDaoQuery提供了用于条件查询的一些方法,使原先where的写法,参照一些类似jpa规范,传参即可完成where条件语句的编写。原理就是将参数转变为 sql让mybatis识别,具体可以下载源码下来查看,就是一些简单的封装,这边先介绍用法吧


实例化BaseDaoQuery,传入要具体实现功能的条查询类Criteria,调用Criteria的方法传参来实现查询的条件,因为方法返回的值都还是Criteria,所以可以接在后面继续调用,直到指定条件都传入为止。BaseDaoQuery类也提供了or方法,可以传入不止一个Criteria查询类,用以应对多种不同的查询情况。(BaseDaoQuery方法中的ordeyBy和distinct方法2期版本还在开发,尚不能使用)

示例:

BaseDaoQuery query =BaseDaoQuery.Query(newCriteria()

               .andConditionEqualTo("id", id)

               .andConditionEqualTo("available",1)

       );

Criteria下提供了一些类似jpa规范的方法,用户在使用使用时选择相应的方法,传入参数即可,方法如下:


andConditionIsNull(String condition)

说明:数据库表某个字段为空 相当于where a is null;

参数:

  参数1:数据库表为空的字段名


andConditionNotNull(String condition)

说明:数据库表某个字段不为空 相当于where a is notnull;

参数:

  参数1:数据库表不为空的字段名


andConditionEqualTo(String condition, Object value)

说明:数据库表某个字段的值等于传入的值,相当于where a=b;

参数:

  参数1:数据库表做比较的字段名

  参数2:拿来做比较的值



andConditionNotEqualTo(String condition, Object value)

说明:数据库表某个字段的值不等于传入的值,相当于where a <>b;

参数:

  参数1:数据库表做比较的字段名

  参数2:拿来做比较的值


andConditionGT(String condition, Object value)

说明:数据库表某个字段的值大于传入的值,相当于where a >b;

参数:

  参数1:数据库表做比较的字段名

  参数2:拿来做比较的值


andConditionGTE(String condition, Object value)

说明:数据库表某个字段的值大于等于传入的值,相当于where a >=b;

参数:

  参数1:数据库表做比较的字段名

  参数2:拿来做比较的值


andConditionLT(String condition, Object value)

说明:数据库表某个字段的值小于传入的值,相当于where a

参数:

  参数1:数据库表做比较的字段名

  参数2:拿来做比较的值


andConditionLTE(String condition, Object value)

说明:数据库表某个字段的值小于等于传入的值,相当于where a<= b;

参数:

  参数1:数据库表做比较的字段名

  参数2:拿来做比较的值


andConditionIn(String condition, Listvalues)

说明:数据库表某个字段的属于传入的值的集合中的某一个,相当于wherea in ( b,c,……)

参数:

  参数1:数据库表字段名

  参数2:传入用于in 的值的集合


andConditionNotIn(String condition, Listvalues)

说明:数据库表某个字段的不属于传入的值的集合中的某一个,相当于wherea not in ( b,c,……)

参数:

  参数1:数据库表字段名

  参数2:传入用于not in 的值的集合


andConditionBetween(String condition, Object value1,Object value2)

说明:数据库表某个字段在某两个值之间,相当于where a

between b and c;

参数:

  参数1:数据库表字段名

  参数2:传入范围的第一个值

  参数3:传入范围的第二个值


andConditionNotBetween(String condition, Object value1,Object value2)

说明:数据库表某个字段不在某两个值之间,相当于where a not

between b and c;

参数:

  参数1:数据库表字段名

  参数2:传入范围的第一个值

  参数3:传入范围的第二个值


andConditionRightLike(String condition, Object value)

说明:数据库表某个字段右模糊查询,相当于where a like  %c;

参数:

  参数1:数据库表字段名

  参数2:传入右模糊查询的值

andConditionLeftLike(String condition, Object value)

说明:数据库表某个字段左模糊查询,相当于where a like  c%;

参数:

  参数1:数据库表字段名

  参数2:传入左模糊查询的值


andConditionAllLike(String condition, Object value)

说明:数据库表某个字段全模糊查询,相当于where a like  %c%;

参数:

  参数1:数据库表字段名

  参数2:传入全模糊查询的值



andConditionNotLike(String condition, Object value)

说明:数据库表某个字段不匹配,相当于where a  not like %c%;

参数:

  参数1:数据库表字段名

  参数2:传入不匹配查询的值



五、结语

说是自制组件,其实就是在原mybatis接口上封装了一些方法,让原先接口读取的mapper.xml变成读取类提供的sql语句,而类的sql通过用户调用方法传参来自动生成;BaseDaoQuery类参考了Mybatis Generator自动生成映射实体类和接口方法的插件,其中有一个Example类提供了各个实体类的条件查询方法,我对其经写了一些改造,将固定某个实体类的查询方法改成通过传参的方式传入,这样只要一个BaseDaoQuery就能够通用各个实体了。而@Column标签注释是后面突然奇想加的,既然都不用映射数据库实体了,那干脆字段名也不用一致吧,就从jpa的注释那搬了一个这个标签过来,目前也只有这一个,后续是不是加入其他的再说吧。


我知道,虽然市面上已经有很多比我封装的这个组件更好的与数据库交互的替代方式,但是如果是个人编写,而不是公司项目的话,我觉得就没有必要搬那么重的东西,自己编写的也挺开心,如果有人愿意用,或者帮我提出什么bug,我就更开心了,希望得到到你的留言回复。个人微信公众号:九代的梦想吐槽。微博:z忘却的九九


1.0.0beta jar包百度网盘的下载地址,如果下载出错或者网盘失效请联系我

链接:https://pan.baidu.com/s/1wTwKyg6gMqEc5NBb6chR4Q

提取码:9xcy

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342