实践应用:Spring Boot项目集成Mybatis-Plus
支付成功订单却没了MyBatis连接池的坑我踩了如何让 MyBatis 批量插入从5分钟缩短到3秒我的三个关键优化写在前面MyBatis的增强方案确实有不少甚至有种感觉是现在如果只用 “裸MyBatis”不来点增强插件都不好意思了。这不在上一篇文章《Spring Boot项目利用MyBatis Generator进行数据层代码自动生成》 中尝试了一下 MyBatis Generator。这次来点更加先进的 Mybatis-PlusSQL语句都不用写了分页也是自动完成嗯真香数据库准备DROPTABLEIFEXISTSdept;CREATETABLEdept(dept_nobigint(20)NOTNULLAUTO_INCREMENT,dept_namevarchar(60)DEFAULTNULL,dept_sourcevarchar(60)DEFAULTNULL,PRIMARYKEY(dept_no))ENGINEInnoDBAUTO_INCREMENT6DEFAULTCHARSETutf8COMMENT部门表;--------------------------------Recordsof dept------------------------------INSERTINTOdeptVALUES(1,开发部,db01);INSERTINTOdeptVALUES(2,人事部,db01);INSERTINTOdeptVALUES(3,财务部,db01);INSERTINTOdeptVALUES(4,市场部,db01);INSERTINTOdeptVALUES(5,运维部,db01);MyBatis-Plus加持工程搭建 不赘述了依赖引入dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency!--mybatis-plus--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.1/version/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.17/version/dependency/dependencies主要是 Mybatis Plus、Lombok不知道Lombok干嘛的可以看这里、Druid连接池 等依赖。MyBatis Plus配置项目配置server:port:10100# 配置启动端口号 spring:#springboot的配置 datasource:#定义数据源 #127.0.0.1为本机测试的ip3306是mysql的端口号。serverTimezone是定义时区照抄就好mysql高版本需要定义这些东西 #useSSL也是某些高版本mysql需要问有没有用SSL连接 url:jdbc:mysql://127.0.0.1:3306/db01?serverTimezoneGMT%2B8useSSLFALSEusername:root #数据库用户名root为管理员 password:123456#该数据库用户的密码 # 使用druid数据源 type:com.alibaba.druid.pool.DruidDataSource# mybatis-plus相关配置 mybatis-plus:# xml扫描多个目录用逗号或者分号分隔告诉Mapper所对应的XML文件位置 mapper-locations:classpath:mapper/*.xml # 以下配置均有默认值,可以不设置 global-config: db-config: #主键类型 AUTO:数据库ID自增 INPUT:用户输入ID,ID_WORKER:全局唯一ID (数字类型唯一ID), UUID:全局唯一ID UUID; id-type: auto #字段策略 IGNORED:忽略判断 NOT_NULL:非 NULL 判断) NOT_EMPTY:非空判断 field-strategy: NOT_EMPTY #数据库类型 db-type: MYSQL configuration: # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射 map-underscore-to-camel-case: true # 如果查询结果中包含空值的列则 MyBatis 在映射的时候不会映射这个字段 call-setters-on-nulls: true # 这个配置会将执行的sql打印出来在开发或测试的时候可以用 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl新增 MyBatis Plus配置类ConfigurationMapperScan(com.dhx.mapper)publicclassMybatisPlusConfig{/** * mybatis-plus SQL执行效率插件【生产环境可以关闭】 */BeanpublicPerformanceInterceptorperformanceInterceptor(){returnnewPerformanceInterceptor();}/** * 分页插件 */BeanpublicPaginationInterceptorpaginationInterceptor(){returnnewPaginationInterceptor();}}看到没几乎零配置啊下面就可以写业务逻辑了业务编写实体类DataTableName(dept)//TableName中的值对应着表名publicclassDeptimplementsSerializable{privatestaticfinallongserialVersionUID1L;/** * 主键 * TableId中可以决定主键的类型,不写会采取默认值,默认值可以在yml中配置 * AUTO: 数据库ID自增 * INPUT: 用户输入ID * ID_WORKER: 全局唯一IDLong类型的主键 * ID_WORKER_STR: 字符串全局唯一ID * UUID: 全局唯一IDUUID类型的主键 * NONE: 该类型为未设置主键类型 */TableId(typeIdType.AUTO)privateLongdeptNo;privateStringdeptName;privateStringdeptSource;}Mapper类MapperpublicinterfaceDeptMapperextendsBaseMapperDept{}这里啥接口方法也不用写就可以实现增删改查了Service类Service接口publicinterfaceDeptServiceextendsIServiceDept{}Service实现ServiceAllArgsConstructorpublicclassDeptServiceImplextendsServiceImplDeptMapper,DeptimplementsDeptService{}controller类RestControllerRequestMapping(/userInfo)publicclassDeptInfoController{AutowiredprivateDeptServicedeptService;/** * 新增用户信息 */RequestMapping(/saveInfo)publicObjectsaveInfo(RequestBodyDeptdept){returndeptService.save(dept);}/** * 批量新增用户信息 */RequestMapping(/saveInfoList)publicObjectsaveInfoList(RequestBodyListDeptlist){//批量保存returndeptService.saveBatch(list);}/** * 根据ID删除用户信息 */RequestMapping(/deleteInfo)publicObjectdeleteInfo(RequestBodyDeptdept){returndeptService.removeById(dept);}/** * 更新用户信息 */RequestMapping(/updateInfo)publicObjectupdateInfo(RequestBodyDeptdept){//根据实体中的ID去更新,其他字段如果值为null则不会更新该字段,参考yml配置文件returndeptService.updateById(dept);}/** * 新增或者更新用户信息 * Author Sans * CreateTime 2019/6/8 16:50 */RequestMapping(/saveOrUpdateInfo)publicObjectsaveOrUpdate(RequestBodyDeptdept){//传入的实体类userInfoEntity中ID为null就会新增(ID自增)//实体类ID值存在,如果数据库存在ID就会更新,如果不存在就会新增returndeptService.saveOrUpdate(dept);}/** * 根据ID获取部门信息 * param dept * return Dept 部门实体 */RequestMapping(/getInfo)publicDeptgetInfo(RequestBodyDeptdept){returndeptService.getById(dept.getDeptNo());}/** * 查询全部信息 * return ListDept 部门实体集合 */RequestMapping(/getList)publicListDeptgetList(){returndeptService.list();}/** * 分页查询全部数据 * Return IPageDept 分页数据 */RequestMapping(/getInfoListPage)publicIPageDeptgetInfoListPage(RequestBodyPagepage){//需要在Config配置类中配置分页插件page.setCurrent(page.getCurrent());//当前页page.setSize(page.getSize());//每页条数returndeptService.page(page);}}通过以上几个简单的步骤我们就实现了 Dept表的增删改查传统 MyBatis的 XML文件一个都不需要写实际实验启动项目接下来通过Postman来发送增删改查的请求插入记录通过Postman随便插入几条记录 POST http://localhost:10100/userInfo/saveInfo{deptName:开发部,deptSource:db01}删除记录修改记录时同样需要带部门ID比如删除ID5那条运维部的记录修改记录修改记录时需要带部门ID比如我们修改开发部那条记录的名字为新开发部门查询记录普通查询下文讲分页查询比如查询全部信息 GET http://localhost:10100/userInfo/getList最关心的分页问题首先装配分页插件/** * 分页插件 */BeanpublicPaginationInterceptorpaginationInterceptor(){returnnewPaginationInterceptor();}Controller类/** * 分页查询全部数据 * Return IPageDept 分页数据 */RequestMapping(/getInfoListPage)publicIPageDeptgetInfoListPage(RequestBodyPagepage){//需要在Config配置类中配置分页插件page.setCurrent(page.getCurrent());//当前页page.setSize(page.getSize());//每页条数returndeptService.page(page);}首先装配分页插件实际实验一下我们分页查询 的多条记录可以看到结果数据中除了给到当前页数据还把总记录条数总页数等一并返回了很是优雅呢