Spring Boot(十一):MyBatis插件之MyBatis-Plus

Spring Boot(十一):MyBatis插件之MyBatis-Plus,第1张

MyBatis的插件MyBatis-Plus,又叫苞米豆(baomidou),简称MP,官方说,它是为了猿类崛起而生,为了提高生产率而生,为了简化开发而生,不管它为了什么而生吧,反正是它出生了。

MyBatis-Plus对MyBatis只做增强不做改变,所以引入它不会对现有工程产生影响,只需要做简单的配置,就可以快速进行单表的CRUD *** 作,从而节省时间,提高效率。

MyBatis-Plus插件有很丰富的功能,比如:单表CRUD *** 作、代码生成、自动分页、逻辑删除等。

下面我们来简单介绍一下MyBatis-Plus的使用

1、pomxml

去掉MyBatis的核心依赖(orgmybatisspringbootmybatis-spring-boot-starter),增加MyBatis-Plus的依赖:

2、配置applicationyml、po、dao和Application

applicationyml中配置数据库连接:

blog数据库中article表的实体类ArticlePo:

注解说明:

@TableName:表名注解,标识实体类对应的表

@TableId注解:主键注解,当type = IdTypeAUTO时,表示这个主键是自增主键

blog数据库中article表的dao,ArticleDao:

BaseMapper接口:利用Mybatis接口编程的实现机制,默认提供了一系列的增删改查的基础方法

在Article11Application中配置 MapperScan 注解:

3、增加数据

insert:增加数据,insert返回值int代表insert了多少条记录

示例:在ArticleController中编写增加数据的接口:

说明:

1)一般业务逻辑处理在service层,这里为了方便,直接在controller中演示了

2)@Resource注解:注入ArticleDao,后续的方法中不再重复注入

4、删除数据

delete:物理删除数据,返回删除了多少条数据

示例,删除title为Mybatis-Plus test的数据:

说明:

1)物理删除后,恢复数据很困难,所以一般情况下,业务处理采用逻辑删除的方式

5、更新数据

update: 更新数据

示例,修改title为Mybatis-Plus test的数据的title为Mybatis-Plus update:

updateById: 根据主键id更新数据

示例,修改id为7的数据的title为Mybatis-Plus updateById:

注意 :

1、updateById方法:若传入实体Model,则会根据主键把其他字段全部更新一遍

问题:使用baomidou拿出某条数据的数据实体后,有其他人把数据库中这条数据的某个字段更新了,再用baomidou的updateById方法更新时,会把此字段再更新回来

解决:

方法1:使用sql语句,只更新需要更新的字段

方法2:新建实体Model,Model中只放主键和需要更新的字段

6、查询数据

selectOne: 查询单条数据

示例,查询id为7的数据:

注意 :

1、selectOne方法

1)结果没有数据时,返回null

2)结果有一条数据时,返回此数据

3)结果有两条或两条以上数据时,报错

解决办法:在最后增加 last(" limit 1 ") 语句

selectList: 查询多条数据

示例:查询title为Mybatis-Plus update的数据

7、打印sql日志

打印执行的sql,在applicationyml中配置,一般配置在开发环境

MyBatis-Plus的其他注意事项

1、如果数据库表字段中有desc、describe等mysql关键词或预留关键词,使用selectList/selectOne会报错,需要单独写sql查询语句

2、有时我们需要在Dao中单独写方法来写sql语句,这时方法的命名跟baomidou自带的命名不要一样,否则即使参数不同,也会有问题:Dao中单独写的方法,会把baomidou的方法覆盖,就调用不到baomidou的方法了

本文示例代码, 详见

>

1、批量插入 *** 作

     mapperjava层定义:

     int batchInsert(List stockList);

mapperxml层的sql语句:

insert into t_stock (status, asset_classify_id,asset_id,asset_item_id, name,num, batch_num, tag_id,rfid, epc, barcode,qr_code, erp, unit,pic_url, specification, model,material, color,length,width, height, weight,density, volume, price01,price02,warehouse_id, storage_zone_id,storage_location_id,storage_location_tag_id,remark, attr01, attr02,attr03, create_date,last_update,creater, client_id)values (#{itemstatus,jdbcType=VARCHAR},#{itemassetClassifyId,jdbcType=BIGINT},#{itemassetId,jdbcType=BIGINT}, #{itemassetItemId,jdbcType=BIGINT},#{itemname,jdbcType=VARCHAR},#{itemnum,jdbcType=VARCHAR},#{itembatchNum,jdbcType=VARCHAR}, #{itemtagId,jdbcType=VARCHAR},#{itemrfid,jdbcType=VARCHAR}, #{itemepc,jdbcType=VARCHAR},#{itembarcode,jdbcType=VARCHAR},#{itemqrCode,jdbcType=VARCHAR},#{itemerp,jdbcType=VARCHAR}, #{itemunit,jdbcType=VARCHAR},#{itempicUrl,jdbcType=VARCHAR},#{itemspecification,jdbcType=VARCHAR},#{itemmodel,jdbcType=VARCHAR},#{itemmaterial,jdbcType=VARCHAR},#{itemcolor,jdbcType=VARCHAR}, #{itemlength,jdbcType=DECIMAL},#{itemwidth,jdbcType=DECIMAL}, #{itemheight,jdbcType=DECIMAL},#{itemweight,jdbcType=DECIMAL},#{itemdensity,jdbcType=DECIMAL},#{itemvolume,jdbcType=DECIMAL}, #{itemprice01,jdbcType=DECIMAL},#{itemprice02,jdbcType=DECIMAL},#{itemwarehouseId,jdbcType=BIGINT},#{itemstorageZoneId,jdbcType=BIGINT},#{itemstorageLocationId,jdbcType=BIGINT},#{itemstorageLocationTagId,jdbcType=BIGINT},#{itemremark,jdbcType=VARCHAR}, #{itemattr01,jdbcType=VARCHAR},#{itemattr02,jdbcType=VARCHAR},#{itemattr03,jdbcType=VARCHAR},#{itemcreateDate,jdbcType=TIMESTAMP},#{itemlastUpdate,jdbcType=TIMESTAMP},#{itemcreater,jdbcType=BIGINT}, #{itemclientId,jdbcType=BIGINT})

datasource或者jdbc中的配置url不对 , 设置编码格式,表创建时候的编码格式需要在url中声明,并且传入的数据也应该是相同编码格式的(这个没注意,一直用的utf8)

比如 你创建一张表 使用的是engine innodb charset utf8;那么你的数据源url连接就应该是 jdbc:mysql://(数据库地址+端口)/(数据库名)useUnicode=true&characterEncoding=utf8(可能还会有别的参数需要指定);

究其原因 还是因为编码格式的问题,你的李四 到数据库的前,会在myabtis做一些处理,做这些处理的时候,李四就可能不在是李四了 所以使用mybatis查询不到,但是在mysql中直接查询是查询得到的

使用 @Async 异步任务,出现了一个问题:

问题的产生:由于使用异步导致,插入的 *** 作没有及时返回结果

方法:在系统运行过程中,针对不同数据库类型区分加载不同文件路径下的sqlmap配置。留给开发人员做的事依旧是快乐地编写原始数据库语句,而不再为多数据库兼容问题挠头。

分析问题:

1、解决ibatis多数据库兼容的问题,实际上就是让ibatis可以自动选择不同数据库sqlmap配置文件。

2、打开ibatis源码工程并进行代码跟踪,最终定位到comibatissqlmapenginebuilderxmlSqlMapConfigParserjava处,系统中运行的sqlmap节点均从这里统一转化加载的。

3、很明显SqlMapConfigParser源码中的addSqlMapNodelets负责解析“/sqlMapConfig/sqlMap”路径,即也就是sqlmap文件路径。

4、要实现“多数据库兼容”,这里改造下这个方法即可。

解决方法:

1、首选我们在<setting>节点新增一个“DBProductName”用于判断数据库种类。当然通过javasqlDatabaseMetaData也可以获得,但这太依赖于jdbc驱动,还是手动配置保险。

2、重构SqlMapConfigParser的addSqlMapNodelets方法。

" 1)首选获得单个sqlmap文件的位置,如 sqlmap主目录\XXXxml;

2)依据上面设置的DBProductName属性值获得数据库类型;

3)将sqlmap的文件路径重定位到运行数据库类型文件下。如 sqlmap主目录\mysql\XXXxml,代表程序当前运行于msql数据库上,并加载系统mysql数据库对应的 sqlmap文件"

4、ok,现在ibatis支持“多数据库兼容”了(完整源码见附件)。

使用方法:

1、编译SqlMapConfigParserjava生成可运行文件SqlMapConfigParserclass(见附件),并将其覆盖添加到ibatisjar中。

2、在系统sqlmap配置文件存放主目录如src\conf\mapping添加多数据库兼容支持的子目录,如src\conf\mapping\mysql,src\conf\mapping\oracle等

3、以实际项目需要编写多数据库sqlmap配置文件。注意:不同数据库类型需要确保具有相同的sqlmap配置文件名和sql节点名

4、在ibatis主配置文件(如sql-map-configxml)中,<setting>指定当前程序运行数据库类型

以上就是关于Spring Boot(十一):MyBatis插件之MyBatis-Plus全部的内容,包括:Spring Boot(十一):MyBatis插件之MyBatis-Plus、请简述MyBatis和Hibernate的区别。、mybatis 批量增删改查 *** 作的几种 *** 作以及创建数据库索引等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10200276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存