前言
为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)
一、MyBatis-Plus是什么?
1.MyBatis-plus简介
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
2.MyBatis-plus特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
二、MyBatis-Plus入门案例(数据库连接与MP接口调用)
1.设计并编写数据库表
代码如下(示例):
Drop database if EXISTS mybatisplus_db; CREATE SCHEMA `mybatisplus_db` DEFAULT CHARACTER SET utf8mb4; use `mybatisplus_db`; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL, `name` varchar(20), `password` varchar(50) , `age` int(10) , `tel` varchar(255) , PRIMARY KEY (`id`) ); -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1, 'tom', 'tom', 3 , '188666888'); INSERT INTO `user` VALUES (2, 'jerry', 'jerry', 4 , '166888666'); INSERT INTO `user` VALUES (3, 'jock', '123456', 41 , '400618400'); INSERT INTO `user` VALUES (4, '传智播客', 'itcast', 23 , '400617500');
效果如下:
2.创建springboot工程并勾选相关依赖
(此处只是示例,具体命名根据自己情况决定,操作步骤如图)
3.手动导入相关坐标
- 在pom.xml文件中导入mybatis-plus的起步依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency>
- 导入druid数据源坐标
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency>
4.编写数据库配置文件application.yml
(数据库名称以及用户名密码要用自己的)
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver //数据库名称示例:mybatisplus_db url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC //用户名示例:root username: root //用户密码示例:root password: root
5.编写数据层功能
(一定要注意文件之间的层级关系,搞错了可能导致无法自动装配bean等问题)
- 创建名称为domain的包,用于封装数据,根据设计的数据库表在doamin包下创建编辑名称为user的实体类
//lombok //@Data 注解的主要作用是提高代码的简洁, // 使用这个注解可以省去代码中大量的get()、 set()、 toString()等方法(这些通用方法可以一键生成); //要使用 @Data 注解要先引入lombok,它是一个工具类库,可以用简单的注解形式来简化代码,提高开发效率。 @Data public class User { private Long id; private String name; private String password; private Integer age; private String tel; }
- 创建名称为dao的包,用于编写数据层接口,并创建名称为UserDao的接口
//继承BaseMapper接口,泛型填写实体类名称 @Mapper public interface UserDao extends BaseMapper<User> { }
- 编写测试类
@SpringBootTest class DlMpApplicationTests { //将Userdao接口装配bean到IOC容器 @Autowired private UserDao userDao; //查询全部 @Test void testGetAll() { List<User> userList = userDao.selectList(null); System.out.println(userList); } }
- 测试类运行结果
三、CRUD(增删改查)接口介绍
1.Mybatis-plus CRUD接口详细介绍
2.Service CRUD 与 Mapper CRUD的区别与联系
- Service CRUD 返回的boolean的值,Mapper CRUD 返回的是int值
- Mapper简化了单表的sql操作步骤(CRUD),而Serivce则是对Mapper的功能增强,比如Service 还提供了一些批量方法(批量插入、批量更新数据),这是 Mapper 没有的
- 在运用CRUD上两者区别不大,Service以业务功能为主,更加复杂(底层)的SQL查询还是要靠Mapper去编写SQL语句
- 为了避免混淆,Service 与 Mapper 的 CRUD 方法前缀有所区别:
- Mapper 的方法前缀是:select(查询)、insert(插入)、update(更新)、delete(删除)
- Service 的方法前缀是:get(查询单行)、list(查询集合)、page(分页查询)、save(插入)、update(更新)、remove(删除)
四、标准CRUD开发
(在入门案例的测试类上进行编码)
1.增(Mapper CRUD接口 insert() )
@Test void testSave(){ User user = new User(); user.setId(12L); user.setName("黑马程序员"); user.setAge(12); user.setPassword("itheima"); user.setTel("400418400"); //实现增加操作的Mapper CRUD接口: int insert(T entity); userDao.insert(user); }
2.删(Mapper CRUD接口 deleteById() )
@Test void testDelete(){ //实现删除操作的Mapper CRUD接口: int deleteById(Serializable id); userDao.deleteById(12L); }
3.改(Mapper CRUD接口 updateById() )
@Test void testUpdate(){ User user = new User(); user.setId(1L); user.setName("Tom666"); user.setPassword("tom888"); // 实现修改操作的Mapper CRUD接口: int updateById(@Param(Constants.ENTITY) T entity);; userDao.updateById(user); }
4.查全部(Mapper CRUD接口 selectList() )
(上面的入门案例做过)
@Test void testGetAll() { //实现了Mapper CRUD 的 selectList 接口,根据 entity 条件,查询全部记录 //List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) List<User> userList = userDao.selectList(null); System.out.println(userList); }
5. 查单个(Mapper CRUD接口 selectById() )
@Test void testGetById(){ // 实现了Mapper CRUD的selectById接口,根据 ID 查询 // T selectById(Serializable id); User user = userDao.selectById(1L); System.out.println(user); }
6.分页查询(Mapper CRUD接口 selectPage() )
- 在src/main/java/com.example.dl_mp目录下创建名称为config的包并创建MpConfig类
- 编写Mpconfig类构建拦截器
@Configuration public class MpConfig { @Bean public MybatisPlusInterceptor mpInterceptor(){ //1.定义Mp拦截器 MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor(); //2.添加具体的拦截器 mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mpInterceptor; } }
- 在测试类编写分页查询代码
//分页查询 //ctrl + H 查看类的继承关系 //ctrl + 鼠标左键 查看源码 //Alt + 7 查看类中的所有方法列表 @Test void testGetPage(){ //current : 1 代表当前查第几页,size : 2 代表每页有多少条 IPage page = new Page(1, 2); // 实现Mapper CRUD中的selectPage接口,根据 entity 条件,查询全部记录(并翻页) //IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); userDao.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()); }
- 测试方法运行结果
`博客内容借鉴了bilibili黑马程序员SSM课程资料,如有侵权,请联系作者删除`
总结
欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。