Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
Mybatis-Plus
是Mybatis
的增强工具包,其简化了CRUD
操作,提供了代码生成器
,强大的条件构造器
,同时内置了多个实用插件:标配的分页
插件、性能分析
插件、全局拦截
插件等。使得开发过程中,基本的范式代码都一句话解决了,省去了很多重复的操作。
1、引入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.zj</groupId> <artifactId>demo-mybatis-plus</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo-mybatis-plus</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0-gamma</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
注意:mybatis-plus 自动的维护了mybatis以及mybatis-spring的依赖,在springboot中这三者不能同时的出现,避免版本的冲突
2、修改配置文件application.yml
server: port: 8080 #spring spring: #mysql datasource: url: jdbc:mysql://127.0.0.1:3306/springboot_study?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8 username: root password: 123456 # devtools: # restart: # enabled: true #这里是为了热部署的,与mybatis是无关的 mybatis-plus: #mybatis #Mapper路径 # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml # 如果是放在resource目录 classpath:/mapper/*Mapper.xml mapper-locations: classpath:/mapper/*Mapper.xml #实体,枚举类扫描,多个package用逗号或者分号分隔 type-aliases-package: com.zj.springboot.demomybatisplus.model # type-enums-package: com.zj.springboot.demomybatisplus.entity.enums global-config: db-config: # #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; # id-type: id_worker # #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" # field-strategy: not_empty # #驼峰下划线转换 # column-underline: true # #数据库大写下划线转换 # #capital-mode: true # #逻辑删除配置 # logic-delete-value: Y # logic-not-delete-value: N #数据库类型。支持主流的数据库 db-type: mysql #刷新mapper 调试神器 refresh: true # sql-injector: com.baomidou.mybatisplus.extension.injector.LogicSqlInjector #自定义填充策略接口实现 #meta-object-handler: com.baomidou.springboot.xxx #自定义SQL注入器 #sql-injector: com.baomidou.springboot.xxx configuration: #数据库字段与数据对象字段的映射策略 map-underscore-to-camel-case: true cache-enabled: false
注意:mapper 路径
我这里数据库的表是手动建的,所以主键类型之类的可以注释掉,不用
还要开启dao的扫描,在spring boot项目中添加mybatis的包扫描路径,这里有许多种方法,这里提供一种方法:
在启动类中加注解
@SpringBootApplication @MapperScan("com.zj.demomybatisplus.mapper") public class DemoMybatisPlusApplication { public static void main(String[] args) { SpringApplication.run(DemoMybatisPlusApplication.class, args); } }
注意:mapper 路径
3、mybatis plus配置类
配置mybatis plus自带的分页、逻辑删除、sql性能分析插件功能、测试公共字段自动填充功能、乐观锁
/** * MyBaits Plus 配置类 */ @EnableTransactionManagement @Configuration @MapperScan("com.zj.demomybatisplus.mapper*") public class MyBatisPlusConfig { /** * 分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } /** * sql注入器 逻辑删除插件 * @return */ @Bean public ISqlInjector iSqlInjector(){ return new LogicSqlInjector(); } /** * sql性能分析插件,输出sql语句及所需时间 * @return */ @Bean @Profile({"dev","test"})// 设置 dev test 环境开启 public PerformanceInterceptor performanceInterceptor() { return new PerformanceInterceptor(); } /** * 乐观锁插件 * @return */ public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); } }
4、建表:
这里简单地以user举个例子
SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; INSERT INTO `user` VALUES ('1', 'aaa', '18'); INSERT INTO `user` VALUES ('2', 'bbb', '18'); INSERT INTO `user` VALUES ('3', 'ccc', '20'); INSERT INTO `user` VALUES ('4', 'ddd', '24'); INSERT INTO `user` VALUES ('5', '111', null);
5、构建项目结构
项目目录结构:
User实体类:
/** * @Auther: zj * @Date: 2019/3/24 11:39 * @Description: */ //@TableName(“tb_student”) public class User extends Model { private Integer id; private String username; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { //重写toString() 方法,便于打印消息 return String.format( "User[id=%d, username='%s', age=%d]", id, username, age ); } @Override protected Serializable pkVal() { return this.id; } }
一些常用的注解:
@TableName(“tb_student”),它是指与数据库的关联,意味着表对应的数据库的表名是tb_student.
@TableFile(exist=false),表示Student类中有的属性,而对应的属性在表中没有这样的一个字段
注意:mybatis-plus只把id作为主键字段,非id的字段,需要用@TableId来标注。pkVal() 是用来支持组合主键的,现在版本的mybatis-plus不支持组合主键
UserMapper
public interface UserMapper extends BaseMapper<User> { User findOneByUsername(String username); }
mapper接口。 接口可以使用@Select等标注原生的sql,也可以使用mapper.xml 实现数据库操作。
如果觉得文章对你有帮助,欢迎关注微信公众号:小牛呼噜噜
自定义的mapper需要从BaseMapper中继承其定义的方法。BaseMapper中已经定义了很多类似JPA的自定义函数(增删改查),方便开发使用;
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zj.demomybatisplus.mapper.UserMapper"> <select id="findOneByUsername" resultType="com.zj.demomybatisplus.model.User"> SELECT * FROM user WHERE `username` = #{username} </select> </mapper>
实现UserMapper中自定义方法的具体实现操作
UserService
public interface UserService extends IService<User> { User selectOneByUsername(String username); }
需要继承IService接口。IService接口中定义了很多方便使用的函数(主要是与mapper对应的函数):
UserServiceImpl
@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService{ @Autowired UserMapper userMapper;//这边报红,没事 @Override public User selectOneByUsername(String username) { return userMapper.findOneByUsername( username ); } }
实现类也就要继承ServiceImpl,来对IService中的函数提供实现
UserController:
@RestController public class UserController { @Autowired UserService userService; @GetMapping("/test") public void test() { System.out.println( userService.selectById( "1" )); } @GetMapping("/test1") public Object test1(@RequestParam("username") String username) { return userService.selectOneByUsername( username ); } @GetMapping("/test2") public Object test2(@RequestParam("current") Integer current) { IPage<User> iPage =userService.selectPage( new Page<User>(current,3),new QueryWrapper<>( )); return iPage.getRecords(); } }
测试:
1、baseMapper自带的方法
2、自定义查询方法
3、分页查询
到这来,mybatis-plus就简单的讲到这了。它除了分页插件,还有代码生成器等其他有意思的插件,大家感兴趣可以去看看