mybatis plus springboot test_Spring Boot 教程 - MyBatis-Plus

作者 | Butterfly-Tri

来源 | urlify.cn/reA3au

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:

            org.springframework.boot        spring-boot-starter-parent        2.2.2.RELEASE                                             com.baomidou            mybatis-plus-boot-starter            3.3.2                                    org.springframework.boot            spring-boot-starter-web                                    mysql            mysql-connector-java            8.0.18                                    org.projectlombok            lombok            1.18.10            

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: rootmybatis-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'接口,就拥有了mybatis-plus提供的公共基础的CRUD方法。 */@Mapperpublic interface StudentMapper extends BaseMapper {    /**     * 查询所有学生信息     * @return List     */    List 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中的方法)     * @param id: 学生id     * @return Student     */    public Student selectById(Long id);    /**     * 通过id查询某个学生的信息(通过xmlMapper实现)     * @param id: 学生id     * @return Student     */    public Student findById(Long id);    /**     * 保存一个学生对象(BaseMapper中的方法)     * @param student     */    public void insert(Student student);    /**     * 查询性别为sex,年龄大于age的学生(普通的Wrapper)     * @param sex: 性别     * @param age: 年龄     * @return 学生list     */    public List findByWrapper(String sex, Integer age);    /**     * 查询性别为sex,年龄大于age的学生(Lambda形式的Wrapper)     * @param sex: 性别     * @param age: 年龄     * @return 学生list     */    public List findByWrapperLambda(String sex, Integer age);    /**     * 更新学生信息(Wrapper形式)     * @param student: 需要更新的学生实体     */    public void updateByWrapper(Student student);    /**     * 更新学生信息(BaseMapper中的方法)     * @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 */@Servicepublic 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 findByWrapper(String sex, Integer age) {        QueryWrapper queryWrapper = new QueryWrapper<>();        queryWrapper.eq("SEX", sex);        queryWrapper.gt("AGE", age);        return studentMapper.selectList(queryWrapper);    }    @Override    public List findByWrapperLambda(String sex, Integer age) {        LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().eq(Student::getSex, sex).gt(Student::getAge, age);        return studentMapper.selectList(queryWrapper);    }    @Override    public void updateByWrapper(Student student) {        UpdateWrapper 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 updateWrapper = Wrappers.lambdaUpdate().set(Student::getId, student.getId());        studentMapper.update(student, updateWrapper);    }}
7f7a93ad23634e96688c2d1cd39bb68f.png
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 */@Servicepublic 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 findByWrapper(String sex, Integer age) {        QueryWrapper queryWrapper = new QueryWrapper<>();        queryWrapper.eq("SEX", sex);        queryWrapper.gt("AGE", age);        return studentMapper.selectList(queryWrapper);    }    @Override    public List findByWrapperLambda(String sex, Integer age) {        LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().eq(Student::getSex, sex).gt(Student::getAge, age);        return studentMapper.selectList(queryWrapper);    }    @Override    public void updateByWrapper(Student student) {        UpdateWrapper 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 updateWrapper = Wrappers.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

此教程会一直更新下去,觉得博主写的可以的话,关注一下,也可以更方便下次来学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值