Spring Boot 教程 - MyBatis-Plus
1. Mybatis-Plus简介
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
为什么说Mybatis-Plus是Mybatis的增强?
mybatis作为一款轻量级的持久层框架实现了比较简单的操作数据库的能力,但是它是一个半ORM(对象关系映射)的持久层框架,因为它需要我们在XML文件中写SQL语句,不能完全专注于业务逻辑,即是它后来做了一些改进,有了逆向工程,有了example类,但依旧改变不了他是一个半ORM框架的事实。MyBatis-Plus作为mybatis的增强版,极大改善了mybatis的尴尬处境(其实并不尴尬,我还是非常喜欢用mybatis的)。
接下来进入正题了,Mybatis-plus框架他在Mybatis原有的基础之上增加了一系列的简单易用的javaAPI,非常的好用和牛逼,国人开发,必须要使劲的吹一下。Mybatis-Plus官方有这么一句话:为简化开发而生。这句话我觉得非常的好,的确,简化了我们的开发,官方还有这么三句话:
润物无声
只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
效率至上
只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间。
丰富功能
热加载、代码生成、分页、性能分析等功能一应俱全。
上面的这三句话其实就是Mybatis-plus的特点,他的确没有改变mybatis的功能,只在它的基础之上进行了一些增强,不需要example类,提供了Wrapper类,还提供了很多简单的api操作数据库。话不多说直接撸代码。对于他的底层实现,我不说大家都知道,动态代理咯,具体实现大家可以自行查阅相关资料,在这个系列中只带领大家学习和基本使用,各位大佬们如果觉得博主写的还算不错,给个关注呗,奥利给!
2. Mybatis-Plus的使用
2.1 引入依赖
pom.xml:
<!--springboot父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!--mybatis-plus组件-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--spring-web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql数据库连接驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!--lombok组件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
</dependencies>
2.2 配置文件
application.yml:
butterflytri:
databaseurl-port: 127.0.0.1:3306 # 数据库端口
database-name: student_db # 数据库名
server:
port: 8080 # 应用端口
servlet:
context-path: /butterflytri # 应用映射
spring:
application:
name: mybatis-plus # 应用名称
datasource:
url: jdbc:mysql://${butterflytri.databaseurl-port}/${butterflytri.database-name}?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
mybatis-plus: # mybatis-plus配置
mapper-locations: classpath:com/butterflytri/mapper/*Mapper.xml # mapper映射包扫描
type-aliases-package: com.butterflytri.entity # entity别名
mybatis-plus只需要这么一个配置文件就可以了,不需要其他的,官方也说了,只增强mybatis不修改它,所以我只会演示plus部分,即增强优化的部分。
2.3 正式代码部分
首先我们看下启动类:
MybatisPlusApplication.java:
package com.butterflytri;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author: WJF
* @date: 2020/6/23
* @description: MybatisPlusApplication
*/
@SpringBootApplication
/**
* xmlMapper包扫描,与yml中效果相同。
*/
@MapperScan("com/butterflytri/mapper")
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class);
}
}
启动类中就写了一个Mapper的包扫描,说过的Mybatis-Plus只增强Mybatis,不改变它,所以写Xml也是完全欧克的。
然后我们看实体类和数据库字段的映射关系,先上代码:
package com.butterflytri.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
/**
* @author: WJF
* @date: 2020/5/16
* @description: Student
*/
@ToString
@Getter
@Setter
/**
* '@TableName':此注解将表名和实体类映射起来,不写则默认以实体类名为表名进行数据库操作。
* '@TableId':此注解将声明的实体属性作为数据库表的主键字段,还有很多主键实现策咯,查看注解属性{@link TableId#type()}。
* '@TableField':此注解将表字段(非主键)和实体类属性映射起来,不写则默认以实体类属性名为表字段名进行数据库操作。
*/
@TableName("t_student")
public class Student implements Serializable {
@TableId("ID")
private Long id;
@TableField("STUDENT_NAME")
private String studentName;
@TableField("STUDENT_NO")
private String studentNo;
@TableField("SEX")
private String sex;
@TableField("AGE")
private Integer age;
@TableField("CLASS")
private String clazz;
}
实体类和表名的映射就是如此的简单,如果实体类类名和表名一样,字段名和属性名一样就不用写这些注解。
接下来我们看下Mapper层代码,这里继承了BaseMapper接口,就已经获取了基本的增删改查方法。
package com.butterflytri.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.butterflytri.entity.Student;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @author: WJF
* @date: 2020/5/16
* @description: StudentMapper
*/
/**
* 此处'StudentMapper'继承了'BaseMapper<T>'接口,就拥有了mybatis-plus提供的公共基础的CRUD方法。
*/
@Mapper
public interface StudentMapper extends BaseMapper<Student> {
/**
* 查询所有学生信息
* @return List<Student>
*/
List<Student> findAll();
/**
* 通过id查询学生信息
* @param id:学生id
* @return Student
*/
Student findOne(Long id);
/**
* 通过学号查询学生信息
* @param studentNo:学生学号
* @return Student
*/
Student findByStudentNo(String studentNo);
}
接下来我们看看service层代码:
StudentService:
package com.butterflytri.service;
import com.butterflytri.entity.Student;
import java.util.List;
/**
* @author: WJF
* @date: 2020/6/23
* @description: StudentService
*/
public interface StudentService {
/**
* 通过id查询某个学生的信息(BaseMapper<T>中的方法)
* @param id: 学生id
* @return Student
*/
public Student selectById(Long id);
/**
* 通过id查询某个学生的信息(通过xmlMapper实现)
* @param id: 学生id
* @return Student
*/
public Student findById(Long id);
/**
* 保存一个学生对象(BaseMapper<T>中的方法)
* @param student
*/
public void insert(Student student);
/**
* 查询性别为sex,年龄大于age的学生(普通的Wrapper)
* @param sex: 性别
* @param age: 年龄
* @return 学生list
*/
public List<Student> findByWrapper(String sex, Integer age);
/**
* 查询性别为sex,年龄大于age的学生(Lambda形式的Wrapper)
* @param sex: 性别
* @param age: 年龄
* @return 学生list
*/
public List<Student> findByWrapperLambda(String sex, Integer age);
/**
* 更新学生信息(Wrapper形式)
* @param student: 需要更新的学生实体
*/
public void updateByWrapper(Student student);
/**
* 更新学生信息(BaseMapper<T>中的方法)
* @param student: 需要更新的学生实体
*/
public void updateById(Student student);
/**
* 更新学生信息(Lambda形式的Wrapper)
* @param student: 需要更新的学生实体
*/
public void updateByWrapperLambda(Student student);
}
StudentServiceImpl:
package com.butterflytri.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.butterflytri.entity.Student;
import com.butterflytri.mapper.StudentMapper;
import com.butterflytri.service.StudentService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author: WJF
* @date: 2020/6/23
* @description: StudentServiceImpl
*/
@Service
public class StudentServiceImpl implements StudentService {
@Resource
private StudentMapper studentMapper;
@Override
public Student selectById(Long id) {
return studentMapper.selectById(id);
}
@Override
public Student findById(Long id) {
return studentMapper.findOne(id);
}
@Override
public void insert(Student student) {
studentMapper.insert(student);
}
@Override
public List<Student> findByWrapper(String sex, Integer age) {
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("SEX", sex);
queryWrapper.gt("AGE", age);
return studentMapper.selectList(queryWrapper);
}
@Override
public List<Student> findByWrapperLambda(String sex, Integer age) {
LambdaQueryWrapper<Student> queryWrapper = Wrappers.<Student>lambdaQuery().eq(Student::getSex, sex).gt(Student::getAge, age);
return studentMapper.selectList(queryWrapper);
}
@Override
public void updateByWrapper(Student student) {
UpdateWrapper<Student> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("ID", student.getId());
studentMapper.update(student, updateWrapper);
}
@Override
public void updateById(Student student) {
studentMapper.updateById(student);
}
@Override
public void updateByWrapperLambda(Student student) {
LambdaUpdateWrapper<Student> updateWrapper = Wrappers.<Student>lambdaUpdate().set(Student::getId, student.getId());
studentMapper.update(student, updateWrapper);
}
}
service层的方法都很简单,有通过刚刚继承的BaseMapper中的方法,但是我们还看到了一个类叫Wrapper,这个类是条件构造器,可以通过这个类实现比较复杂的查询,有直接通过字段名称去查询的,也有通过属性和字段名映射的lambda方式去查询数据库,总之就是很简单,也很好理解这些API,但是请记住,Wrapper很重,不是一个轻量级的东西,不要将这个对象在服务间进行传递,效率很低。请将条件放在DTO中传递到service层代码中,在service代码中创建Wrapper类进行查询。
CRUD的结果我就不展示了。然后附上Mybatis-Plus官网地址:传送门
3. 项目地址
本项目传送门:
- GitHub ---> spring-boot-mybatis-plus
- Gitee ---> spring-boot-mybatis-plus
此教程会一直更新下去,觉得博主写的可以的话,关注一下,也可以更方便下次来学习。
- 作者:Butterfly-Tri
- 出处:Butterfly-Tri个人博客
- 版权所有,欢迎保留原文链接进行转载
Spring Boot 教程 - MyBatis-Plus的更多相关文章
- Spring boot教程mybatis访问MySQL的尝试
Windows 10家庭中文版,Eclipse,Java 1.8,spring boot 2.1.0,mybatis-spring-boot-starter 1.3.2,com.github.page ...
- Spring Boot 教程(2) - Mybatis
Spring Boot 教程 - Mybatis 1. 什么是Mybatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 J ...
- Spring Boot教程(三十七)整合MyBatis
Spring中整合MyBatis就不多说了,最近大量使用Spring Boot,因此整理一下Spring Boot中整合MyBatis的步骤.搜了一下Spring Boot整合MyBatis的文章,方 ...
- Spring Boot整合Mybatis并完成CRUD操作
MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...
- Spring Boot 实战 —— MyBatis(注解版)使用方法
原文链接: Spring Boot 实战 -- MyBatis(注解版)使用方法 简介 MyBatis 官网 是这么介绍它自己的: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过 ...
- spring boot集成mybatis(1)
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- spring boot集成mybatis(2) - 使用pagehelper实现分页
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- spring boot集成mybatis(3) - mybatis generator 配置
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “清醒时做事,糊涂时跑步,大怒时睡觉,独处时思考” 本文提纲一.多数据源的应用场景二.运行 sp ...
- 使用intelliJ创建 spring boot + gradle + mybatis站点
Spring boot作为快速入门是不错的选择,现在似乎没有看到大家写过spring boot + gradle + mybatis在intellij下的入门文章,碰巧.Net同事问到,我想我也可以写 ...
随机推荐
- 导出Telegram贴纸
如何导出Telegram的贴纸1.在Telegram中 @StickerSetBot 机器人2.输入 /newpack 开启机器人,会提示 OK now send me stickers or sti ...
- CentOS7上安装Hadoop
设置sshssh-keygen -t rsa -P ''cat id_rsa.pub >> authorized_keys 查看slaves节点的id_rsa.pub文件,将文件内容复制到 ...
- Spring bean初始化
- Markdown画图(mermaid)学习
简介 目前博客园支持mermaid的graph,subgraph,sequenceDiagram,gantt,classDiagram mermaid(美人鱼), 是一个类似markdown,用文本语 ...
- MyBatis--动态插入多条数据
MySQL支持的一种插入多行数据的INSERT语句写法是 INSERT INTO 表名 (字段名1,字段名2,字段名3) VALUES (值1,值2,值3,...),(值1,值2,值3,...)... ...
- Python创建字符串
Python创建字符串: 一般情况下可以使用 ' 或 " 创建字符串 或 使用引用字符串变量 或 字符串表达式. # 字符串的创建 # 使用 ' 或 “ 进行创建 strs = 'ABCDE ...
- Python File tell() 方法
概述 tell() 方法返回文件的当前位置,即文件指针当前位置.高佣联盟 www.cgewang.com 语法 tell() 方法语法如下: fileObject.tell() 参数 无 返回值 返回 ...
- PHP array_unshift() 函数
实例 插入元素 "blue" 到数组中: <?php$a=array("a"=>"red","b"=> ...
- PHP hex2bin() 函数
实例 把十六进制值转换为 ASCII 字符: <?phpecho hex2bin("48656c6c6f20576f726c6421");?> 以上实例输出结果: He ...
- PDOStatement::columnCount
PDOStatement::columnCount — 返回结果集中的列数.(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0) 说明 语法 int PDOStateme ...
- Spring boot教程mybatis访问MySQL的尝试