1.先理解一下Mybatis_Plus:
Mybatis_plus(MP):是一个Mybatis的加强工具,在Mybatis的根底上只做加强不扭转,为简化开发,提高效率。(是一个插件)
官网:https://baomidou.com/
作者:Mybatis-Plus是由baomidou组织开发并且开源的,目前组织大概有30万人左右
1.2个性:
- 无侵入:只做加强不做扭转,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会主动注入根本 CURD,性能根本无损耗,间接面向对象操作
- 弱小的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过大量配置即可实现单表大部分 CRUD 操作,更有弱小的条件结构器,满足各类应用需要
- 反对 Lambda 模式调用:通过 Lambda 表达式,不便的编写各类查问条件,无需再放心字段写错
- 反对主键主动生成:反对多达 4 种主键策略(内含分布式惟一 ID 生成器 - Sequence),可自在配置,完满解决主键问题
- 反对 ActiveRecord 模式:反对 ActiveRecord 模式调用,实体类只需继承 Model 类即可进行弱小的 CRUD 操作
- 内置代码生成器:采纳代码或者 Maven 插件可疾速生成 Mapper 、 Model 、 Service 、 Controller 层代码,反对模板引擎,更有超多自定义配置等您来应用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关怀具体操作,配置好插件之后,写分页等同于一般 List 查问
- 分页插件反对多种数据库:反对 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能剖析插件:可输入 SQL 语句以及其执行工夫,倡议开发测试时启用该性能,能疾速揪出慢查问
- 内置全局拦挡插件:提供全表 delete 、 update 操作智能剖析阻断,也可自定义拦挡规定,预防误操作
等,具体请看mybatis-Plus官网
反对数据库
MySQL,Oracle等,目前只用到这两个数据库
架构2疾速开始
2.1:创立工程
关上idea
第一步
创立完了点NEXT
第二步
第三步
第四步
留神:创立springboot工程须要联网,不联网创立不胜利,
创立完了后是这个界面2.2.规范数据层crud性能
该工程须要应用mysql,在pom.xml文件导入一下依赖包
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency></dependencies>
导入依赖后:
配置文件application.yml
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mp username: root password: root
再进行写实体类和mapper类
实体:
//getset办法能够应用@Data注解 private int id;//该注解映射数据库的字段@TableField(value = "user_name") private String userName; private String password; private String name; private Integer age; private String email;//比方在实体类中有一个属性为remark,然而在数据库中没有这个字段,然而在执行插入操作时给实体类的remark属性赋值了,那么能够通过在实体类的remark属性上增加。false示意存在,true示意存在@TableField(exist = false)private Integer remark
mapper:
@Mapperpublic interface UserMapper extends BaseMapper<User> {}//这里继承了BaseMapper外面的办法
再进行测试:
@Autowiredprivate UserMapper usermapper;//查问全副@Testvoid text01(){List<User> userList =usermapper.selectList(null);//这里为空是因为没有条件。System.out.println(userList);}//依据id查问@Testvoid text02(){User userById =usermapper.selectById(1);}//减少数据@Testvoid text03(){User user =new User();user.setId(1);user.setUserName("zhangsan");user.setpassword("zhangsan");user.setName("张三");user.setAge(18);user.setEmail("zhangsan@qq.com");System.out.println(usermapper.insert(user));}//批改@Testvoid text04(){User user = new User();user.setId(1);user.setUserName("lisi");user.setpassword("lisi");user.setName("李四");user.setAge(20);user.setEmail("lisi@qq.com");System.our.println(usermapper.updateById);}//删除@Testvoid text05(){System.out.println(usermapper.deleteById(1))}//分页查问@Testvoid text06(){Ipage page =new Page(1,2);usermapper.selectPage(page,null);System.out.println("以后是第几页"+page.getCurrent());System.out.println("当前页显示多少条数据"+page.getSize());System.out.println("一共多少页"+page.getPages());System.out.println("一共多少条数据"+page.getTotal);System.out.println("数据"+page.getRecords);}//新建一个类myconfig//测试之前须要增加拦截器,不增加拦截器则是查问全副的sql语句,分页查问是原有的根底时上加了一个性能@Configuration//须要增加一个注解,不然加载不到public class myconfig{@Beanpublic MybatisPlusInterceptor mp(){//定义拦截器 MybatisPlusInterceptor mp =new MybatisPlusInterceptor();//分页的拦截器是PageinationInnerInterceptor, mp.addInnerInterceptor (new PageinationInnerInterceptor());//将分页拦截器封装到大的拦截器外面return mp; }}如果你想看执行的sql语句须要在配置文件配置日志敲个log就能显示进去了mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2.3:DQL查问
2.3.1条件查问
Mybatis-Plus条件查问有三种写法:
倡议应用第三种
//第一种:QueryWrapper格局条件查问。是以字符串模式容易出错。@Testvoid text(){QueryWrapper qw=new QueryWrapper();//lt是小于。字段,条件qw.lt("age",18);System.out.println(userMapper.selectList(qw));}//第二种:lambda格局条件查问@Testvoid text(){//须要增加泛型QueryWrapper<User> qw =new QueryWrapper<User>();qw.lambda().lt(User::getAge,18);System.out.println(userMapper.selectList(qw));}//第三种:@Test void text(){LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<User>();//这是查问小于18岁的,qw.lt(User::getAge,18);//这是查问并且的关系qw.lt(User::getAge,18).gt(User::getAge,1);qw.between(1,18);//或者关系qw.lt(User::getAge,18).or().gt(User::getAge,1);System.out.println(userMapper.selectList(qw))}//条件查问null断定如果第一个条件为空时该怎么办呢?//新建一个实体类继承Userpublic class UserQuery extends User{private Integger age2;}//测试@testvoid text(){UserQuery uq =new UserQuery(){uq.setAge(10);uq.setAge2(30);LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<User>();//意思:当uq.getAge2为空时不执行“逗号”前面条件qw.lt(null != uq.getAge2(),User::getAge,uq.getAge2());qw.gt(null != uq.getAge(),User::getAge,uq.getAge());System.out.println(userMapper.selectList(qw)) }}//查问投影:指指定的字段//比方只想看到id和姓名和年龄@Testvoid text(){LambdaQueryWrapper<User> qw =new LambdaQueryWrapper<User>();qw.select(User::getid,User::getusername,User::getage);System.out,println(userMapper.selectList(qw))}//显示该字段的反复值的总数@Testvoid text(){QueryWrapper<User> qw = new QueryWrapper<User>; qw.select("count(*) as count,age"); qw.groupBy("age"); System.out.println(userMapper.selectMaps(qw));}
id生成策略
实体:
//AUTO:应用数据库主动生成的id//NONE:不设置id//INPUT:须要手动写id//ASSIGN_ID:雪花算法@TableId(type =IdType.AUTO) private int id; private String userName; private String password; private String name; private Integer age; private String email;