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 批量增删改查 *** 作的几种 *** 作以及创建数据库索引等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)