本篇内容介绍了“怎么使用Spring Boot中的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.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类进行查询。
“怎么使用Spring Boot中的MyBatis-Plus”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。