MybatisPlus实战教程1。什么是MybatisPlus1。1什么是mybatisplus 官网:www。mybatisplus。comguide MyBatisPlus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。 1。2官方愿景 1。3特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求支持Lambda形式调用:通过Lambda表达式,方便地编写各类查询条件,无需再担心字段写错支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器Sequence),可自由配置,完美解决主键问题支持ActiveRecord模式:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作支持自定义全局通用操作:支持全局通用方法注入(Writeonce,useanywhere)内置代码生成器:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,更有超多自定义配置等您来使用内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询分页插件支持多种数据库:支持MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer等多种数据库内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询内置全局拦截插件:提供全表delete、update操作智能分析阻断,也可自定义拦截规则,预防误操作1。4支持数据库mysql、mariadb、oracle、db2、h2、hsql、sqlite、postgresql、sqlserver1。5框架结构 从图中我们可以看出,使用mybatisplus可以自动起别名,完成java对象与数据库中记录的映射,以及自动创建CRUD,无需再去创建mapper配置文件了。2。快速入门2。1创建springboot项目 1。引入依赖dependencygroupIdcom。baomidougroupIdmybatisplusbootstarterartifactIdversion3。2。0versiondependency复制代码注意:不需要在引入mybatis的相关依赖,只引入这一个即可,当然数据库相关的驱动还的显式引入 因为要连接数据库,所以我们需要引入mysql、druid等依赖,下面是项目中所有的依赖dependencygroupIdorg。springframework。bootgroupIdspringbootstarterwebartifactIddependencydependencygroupIdorg。springframework。bootgroupIdspringbootdevtoolsartifactIdscoperuntimescopeoptionaltrueoptionaldependencydependencygroupIdmysqlgroupIdmysqlconnectorjavaartifactIdscoperuntimescopedependencydependencygroupIdorg。projectlombokgroupIdlombokartifactIdoptionaltrueoptionaldependencydependencygroupIdorg。springframework。bootgroupIdspringbootstartertestartifactIdscopetestscopedependency!mybatisplusdependencygroupIdcom。baomidougroupIdmybatisplusbootstarterartifactIdversion3。2。0versiondependency!duid连接池dependencygroupIdcom。alibabagroupIddruidartifactIdversion1。1。19versiondependency复制代码 为了防止创建maven过慢,我们可以使用阿里巴巴的镜像repositoriesrepositoryidaliyunreposidurlhttp:maven。aliyun。comnexuscontentgroupspublicurlsnapshotsenabledfalseenabledsnapshotsrepositoryrepositoriespluginRepositoriespluginRepositoryidaliyunpluginidurlhttp:maven。aliyun。comnexuscontentgroupspublicurlsnapshotsenabledfalseenabledsnapshotspluginRepositorypluginRepositories复制代码2。在入口类加入注解SpringBootApplicationMapperScan(com。baizhi。dao)扫描dao接口所在的包publicclassSpringbootMybatisplusApplication{publicstaticvoidmain(String〔〕args){SpringApplication。run(SpringbootMybatisplusApplication。class,args);}}复制代码3。编写配置文件spring。datasource。typecom。alibaba。druid。pool。DruidDataSourcespring。datasource。driverclassnamecom。mysql。jdbc。Driverspring。datasource。urljdbc:mysql:localhost:3306mybatisplus?characterEncodingUTF8spring。datasource。usernamerootspring。datasource。passwordrootlogging。level。rootinfologging。level。com。baizhi。daodebug复制代码2。2创建数据库以及表结构DROPTABLEIFEXISTSCREATETABLEuser(idint(11)NOTNULLAUTOINCREMENT,namevarchar(255)DEFAULTNULL,ageint(11)DEFAULTNULL,birtimestampNULLDEFAULTNULL,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf8;SETFOREIGNKEYCHECKS1;复制代码2。3开发实体类 实体类是什么,mybatisplus就会去数据库中找相同名字的表Datalombok的注解用来生成getset等相关方法AllArgsConstructor有参构造NoArgsConstructor无参构造ToStringtoString方法Accessors(chaintrue)不写默认为false,当该值为true时,对应字段的setter方法调用后,会返回当前对象。publicclassUser{privateSprivateSprivateIprivateD}复制代码2。4开发mapper通用实现importcom。baomidou。mybatisplus。core。mapper。BaseM提供了各种CRUD方法使用mybatisplus的接口增强功能publicinterfaceUserDAOextendsBaseMapperUser{方法不够的话在DAO接口中写方法,然后写相应的mapper配置文件对其做实现如果官网提供的方法不够用的话,可以在这里自己写方法并写相应的mapper配置文件即可}复制代码2。5测试AutowiredprivateUserDAOuserDAO;TestvoidcontextLoads(){ListUserusersuserDAO。selectList(null);System。out。println(users);}3。常用注解说明TableNameTableIdTableField3。1TableName注解描述:用来将实体对象与数据库表名完成映射修饰范围:用在类上常见属性:value:String类型,指定映射的表名resultMap:String类型,用来指定XML配置中resultMap的id值3。2TableId注解描述:主键注解当前对象的哪个属性对应数据库的主键修饰范围:用在属性上常见属性:value:String类型,指定实体类中与表中对应的主键列名type:枚举类型,指定主键生成类型type属性写枚举类IdType。AUTO 3。3TableField描述:字段注解(非主键)修饰范围:用在属性上常用属性:value:String类型,用来指定对应的数据库表中的字段名el:String类型,映射为原生{。。。}逻辑,相当于写在xml里的{。。。}部分3。0不存在exist如果对象中某一个属性不是数据库表中的字段,我们可以加上这个属性,以免将它作为数据库的列而产生错误boolean是否为数据库表字段true代表是数据库字段,false代表不是Datalombok的注解用来生成getset等相关方法AllArgsConstructor有参构造NoArgsConstructor无参构造ToStringtoString方法Accessors(chaintrue)不写默认为false,当该值为true时,对应字段的setter方法调用后,会返回当前对象。TableName(tuser)指定数据库中与该对象对应的表的名称publicclassUser{TableId(valueid,typeIdType。AUTO)指定该属性与表中的主键字段对应,value不写表中字段为属性名privateSTableField指定该属性与表中哪个字段对应,value属性写字段名,不写表示字段名与属性名一致privateSTableField指定该属性与表中哪个字段对应,value属性写字段名,不写表示字段名与属性名一致privateITableField指定该属性与表中哪个字段对应privateDTableField(existfalse)指定该属性不与表中字段对应privateS}复制代码4。常用方法4。1查询方法 selectList方法中的参数是用来帮我们做条件查询的,如果为参数为null代表查询所有数据查询所有TestpublicvoidtestFindAll(){ListusersuserDAO。selectList(null);users。forEach(userSystem。out。println(useruser));}复制代码根据主键查询一个TestpublicvoidtestFindOne(){UseruseruserDAO。selectById(1);System。out。println(useruser);}复制代码条件查询条件查询泛型里面写实体对象TestpublicvoidtestFind(){QueryWrapperqueryWrappernewQueryWrapper();第一个字段应该写数据库中表的字段名queryWrapper。eq(age,23);设置等值查询,查询age等于23的queryWrapper。lt(age,23);设置小于查询queryWrapper。ge(age,23);小于等于查询gt大于ge大于等于ListusersuserDAO。selectList(queryWrapper);users。forEach(userSystem。out。println(user));}复制代码li模糊查询TestpublicvoidtestFindAll(){QueryWrapperqueryWrappernewQueryWrapper();like?内容中包含对应的值就可以了likeLeft?以结尾的查询likeRight?以开头的查询queryWrapper。like(username,小);queryWrapper。likeRight(username,小);ListusersuserDAO。selectList(queryWrapper);users。forEach(userSystem。out。println(useruser));}复制代码lilike相当于?likeLeft相当于?likeRight相当于?ul4。2添加方法添加方法TestpublicvoidtestSave(){UserentitynewUser();entity。setAge(23)。setName(小明明)。setBir(newDate());userDAO。insert(entity);}复制代码4。3修改方法基于id修改TestpublicvoidtestUpdateById(){UseruseruserDAO。selectById(1);user。setAge(24);userDAO。updateById(user);}复制代码基于条件修改TestpublicvoidtestUpdate(){UserusernewUser();user。setName(小陈陈);QueryWrapperupdateWrappernewQueryWrapper();updateWrapper。eq(true,age,23);修改age为23的记录userDAO。update(user,updateWrapper);修改age为23的记录的name修改为百知教育}复制代码4。4删除方法基于id删除TestpublicvoidtestDeleteById(){userDAO。deleteById(3);}复制代码基于条件删除TestpublicvoidtestDelete(){QueryWrapperwrappernewQueryWrapper();wrapper。lambda()。gt(age,23);删除年龄大于wrapper。lambda()。eq(true,User::getAge,23);userDAO。delete(wrapper);}复制代码5。MybatisPlus分页查询 分页查询的原理就是在查询之后加上分页的拦截,所以我们要实现在工厂中注册拦截器类,所以我们实现需要创建一个MybatisPlusConfig类。0。预先配置注意:使用分页查询必须设置mybatisplus提供的分页插件(配置),才能实现分页效果EnableTransactionManagement支持事务管理Configuration代表这是一个配置类MapperScan(com。baizhi。dao)扫描dao接口所在的包publicclassMybatisPlusConfig{分页的拦截器对象BeanpublicPaginationInterceptorpaginationInterceptor(){PaginationInterceptorpaginationInterceptornewPaginationInterceptor();returnpaginationI}}复制代码注意事项:目前分页查询仅仅支持单表查询,不能在表连接时使用分页插件1。分页查询非条件分页查询分页查询TestpublicvoidtestFindPage(){参数1:当前页从第几页开始参数2:当前页显示几条记录不传参的话当前页从第1页开始,当前页显示10条记录IPagepagenewPage(1,2);IPageuserIPageuserDAO。selectPage(page,null);获取总记录数System。out。println(总记录数:userIPage。getTotal());获取指定条件的记录userIPage。getRecords()。forEach(userSystem。out。println(useruser));}复制代码li带条件分页查询TestpublicvoidtestFindAll(){QueryWrapperqueryWrappernewQueryWrapper();queryWrapper。eq(age,23);IPagepagenewPage(1,2);pageuserDAO。selectPage(page,queryWrapper);page。getRecords()。forEach(userSystem。out。println(useruser));}复制代码liul6。MybatisPlus多数据源配置引言 为了确保数据库产品的稳定性,很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器;第二台数据库服务器,主要进行读的操作。 注意:这里我并没有讲解关于主从同步的配置,只是讲了关于多数据源切换的配置,读写分离配置 6。1引入dynamicdatasourcespringbootstarter依赖dependencygroupIdcom。baomidougroupIddynamicdatasourcespringbootstarterartifactIdversion3。0。0versiondependency复制代码6。2配置数据源 使用多数据源的话就不需要原来application。properties中的dataSource配置了,使用下面的配置即可spring。datasource。primarymaster指定默认数据源spring。datasource。dynamic。datasource。master。driverclassnamecom。mysql。jdbc。Driverspring。datasource。dynamic。datasource。master。urljdbc:mysql:localhost:3306mybatisplus?characterEncodingUTF8spring。datasource。dynamic。datasource。master。usernamerootspring。datasource。dynamic。datasource。master。passwordrootspring。datasource。dynamic。datasource。slave1。driverclassnamecom。mysql。jdbc。Driverspring。datasource。dynamic。datasource。slave1。urljdbc:mysql:localhost:3306mybatisplus1?characterEncodingUTF8spring。datasource。dynamic。datasource。slave1。usernamerootspring。datasource。dynamic。datasource。slave1。passwordroot6。3创建多个数据库模拟不同mysql服务 一个mybatisplus数据库,一个是mybatisplus1数据库6。4DS注解作用:用来切换数据源的注解修饰范围:方法上和类上,同时存在则方法注解优先于类上注解。Value属性:切换数据源名称(不是数据库名称,是application。propertis配置文件中的,比如:master、slave1等)不使用这个注解的话默认就是master6。5开发业务层业务接口publicinterfaceUserService{ListfindAll();voidsave(Useruser);}复制代码业务实现类ServiceTransactionalpublicclassUserServiceImplimplementsUserService{AutowiredprivateUserDAOuserDAO;OverrideDS(slave1)publicListfindAll(){returnuserDAO。selectList(null);}Overridepublicvoidsave(Useruser){userDAO。insert(user);}}复制代码6。6测试结果packagecom。importcom。baizhi。entity。Uimportcom。baizhi。service。UserSimportorg。junit。jupiter。api。Timportorg。springframework。beans。factory。annotation。Aimportorg。springframework。boot。test。context。SpringBootTimportjava。util。DSpringBootTestpublicclassTestUserService{AutowiredprivateUserServiceuserSTestpublicvoidtestFindAll(){userService。findAll()。forEach(userSystem。out。println(useruser));}TestpublicvoidtestSave(){UserusernewUser();user。setName(aaa)。setAge(23)。setBir(newDate());userService。save(user);}} 作者:嘿鱼骨头 链接:https:juejin。cnpost7109612457923985444