快速了解:
本文介绍mybatis plus插件的基本使用方法
- 快速开始
- 常用注解介绍
- CRUD
- 分页查询
- 逆向工程自动生成器
一. 快速开始
1.新建一个springboot项目,勾选如下依赖
2.导入mybatis plus的依赖
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
//建议引入连接池
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
3.配置数据库连接
spring:
datasource: #配置数据库
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/mybatis_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
4.创建实体类
- User
package com.lin.entity;
import ...
@Data ///lombok
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true) //链式调用
public class User {
int id;
String username;
String password;
}
5.创建Dao接口,继承BaseMapper获得CRUD方法
- 使用mybatis plus 增强类BaseMapper<?>进行增强,Dao会继承BaseMappser中的所有CRUD方法
- 记得在springboot中注册,@Repository
- 记得要在入口类中添加扫描@MapperScan(“com.lin.dao”),或者用Mapper进行单个类的扫描
- 不需要mapper.xml文件,只需要继承方法即可
package com.lin.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lin.entity.User;
import org.springframework.stereotype.Repository;
//使用mybatis plus 增强类BaseMapper<?>进行增强,Dao会继承BaseMappser中的所有CRUD方法
@Repository
public interface UserDao extends BaseMapper<User> {
}
- 在springboot的入口类中添加mapper扫描
package com.lin;
import ...
@SpringBootApplication
@MapperScan("com.lin.dao") //扫描包
public class MybatisPlus01Application {
public static void main(String[] args) {
SpringApplication.run(MybatisPlus01Application.class, args);
}
}
6 .调用接口,进行测试
- 在测试类中调用接口
@SpringBootTest
class MybatisPlus01ApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testUserDao() {
List<User> users=userDao.selectList(null);//无条件查询表
users.forEach(user -> System.out.println(user)); //打印
}
}
- 测试结果
User(id=1, username=AA, password=A123)
User(id=2, username=BB, password=B123)
User(id=3, username=CC, password=C123)
User(id=4, username=EE, password=E1243)
二. 常用注解:
mybatis plus中常用的接口有
- @TableName
- @TableId
- @TableField
- 更多注解:mybatis plus常用注解
@TableName
- 用于将实体对象与数据库表明进行映射(默认是将类名作为表明)
- 修饰范围:作用在类上
- 常见属性:value=表名,resultMap=xml 中 resultMap 的 id
@TableId
- 主键注解,指定主键以及主键的自增方式
- 作用范围:类属性成员上
- 属性value:主键字段名
- 属性:type
@Data ///lombok
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true) //链式调用
@TableName(value = "t_user")
public class User {
//设置id为主键,并且采用自增的方式增长
@TableId(value = "id",type = IdType.AUTO)
int id;
String username;
String password;
}
@TableField
- 描述:字段注解(非主键),用于指定属性和数据库中的字段的映射关系
- 作用范围:类属性成员上
- 属性value:指定某个属性对应数据库中的哪个字段
- 属性exit=boolean,表示某个属性是否映射到数据库
package com.lin.entity;
import ...
@Data ///lombok
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true) //链式调用
@TableName(value = "t_user")
public class User {
//设置id为主键,并且采用自增的方式增长
@TableId(value = "id",type = IdType.AUTO)
int id;
String username;
//指定pwd->password
@TableField(value = "password")
String pwd;
//指定num不映射任何字段
@TableField(exist = false)
Integer num;
}
三. CRUD
package com.lin;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.lin.entity.User;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lin.dao.UserDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.management.Query;
import java.sql.Wrapper;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SpringBootTest
class MybatisPlus01ApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testUserDao() {
List<User> users=userDao.selectList(null);//无条件查询表
users.forEach(user -> System.out.println(user)); //打印
}
@Test
void testInsert(){
// 插入一条记录
User user = new User(10,"qdl","123456");
System.out.println(userDao.insert(user));
}
//Id删除
@Test
void testDeletById(){
userDao.deleteById(121);
}
//批量删除
@Test
void deleteBatchIds(){
List<Integer> list = new ArrayList<>();
list.add(121);
list.add(122);
list.add(123);
userDao.deleteBatchIds(list);
}
//集合指定某字段的值,将包含这个字段值的记录删除
@Test
void deleteByMap(){
Map<String,Object> map=new HashMap<>();
map.put("username","linxiaode");
userDao.deleteByMap(map);
}
//条件删除,删除密码为123456的记录
@Test
void deletequeryWrapper(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("password","123456");
userDao.delete(queryWrapper);
}
//修改
@Test
void update(){
User user=new User();
user.setId(1);
user.setUsername("linxiaode");
//根据id标识,设置usrname,但是password为空,pwd不进行修改
userDao.updateById(user);
}
//条件批量修改
//id大于等于4记录修改密码
@Test
void updateQ(){
User user = new User();
user.setPassword("11111111");
QueryWrapper<User> updateWrapper=new QueryWrapper<> ();
updateWrapper.ge("id",4);
//condition属性表示条件构造器是否生效,设置为false则不生效;注意如果没有设置条件,默认全部修改
userDao.update(user,updateWrapper);
}
//查询select
//全查询
@Test
void selectListNull(){
List<User> users=userDao.selectList(null);
users.forEach(user -> System.out.println(user));
}
@Test
void selecyById(){
User user = userDao.selectById("1");
System.out.println(user);
}
@Test
void testselectOne(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id",2);//注意,条件必须要保证查询结果唯一
User user = userDao.selectOne(queryWrapper);
System.out.println(user);
}
@Test
void testselectBatchIds(){
ArrayList<Integer> idList = new ArrayList<>();
idList.add(1);
idList.add(2);
idList.add(3);
List<User> users = userDao.selectBatchIds(idList);
users.forEach(user -> System.out.println(user));
}
@Test
void testselectByMap(){
HashMap<String , Object> map = new HashMap<>();
map.put("username","AA");
List<User> users=userDao.selectByMap(map);
users.forEach(user -> System.out.println(user));
}
//模糊查询,通过条件选择器like设置,调用selectList方法
@Test
void testSelectLike(){
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.like("password","0");
List<User>users = userDao.selectList(queryWrapper);
users.forEach(user -> System.out.println(user));
}
//可以条件查询
@Test
void testCount(){
int num=userDao.selectCount(null);
System.out.println(num);
}
}
四. 分页查询
对于分页查询,mybatis plus提供了相应的接口,但是调用接口之前,要先引入配置类(以下介绍的springboot的方式)
- 在com.lin目录下新建config目录
- 目录下新配置类:
//Spring boot方式
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
}
- 分页如下:
//无条件分页查询
//注意分页是从1开始的
@Test
void testPage(){
IPage<User> page=new Page<>(1,2);
page=userDao.selectPage(page,null);
page.getRecords().forEach(user -> System.out.println(user));
}
//有条件分页查询
@Test
void testPageQ(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.ge("id",2);
IPage<User> page=new Page<>(1,4);
page=userDao.selectPage(page,queryWrapper);
page.getRecords().forEach(user -> System.out.println(user));
}
五. 代码生成器
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
- 新建一个代码生成类
package com.lin;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
// 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_db?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("12345678");
mpg.setDataSource(dsc); //设置数据源配置
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir"); //获取当前项目的根目录
gc.setOutputDir(projectPath + "/src/main/java"); //设置输出文件夹
gc.setAuthor("qdl"); //设置作者信息
gc.setOpen(false); //生成之后是否打开文件夹
gc.setServiceName("%sService"); //设置service接口不包含I开头
mpg.setGlobalConfig(gc); //设置全局配置
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.lin"); //设置java目录下的输出包位置
pc.setModuleName("mybatisPlus"); //设置包名
pc.setEntity("entity"); //设置实体类
pc.setMapper("mapper"); //设置mapper接口
pc.setService("service"); //service
pc.setServiceImpl("service.impl"); //设置service实现类
pc.setController("controller"); //controller层
mpg.setPackageInfo(pc); //设置包配置
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel); //开启_转驼峰命名
strategy.setColumnNaming(NamingStrategy.underline_to_camel); //开启_转驼峰命名
//strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
strategy.setEntityLombokModel(true); //lombok
strategy.setRestControllerStyle(true); //RestController
strategy.setSuperEntityColumns("id"); //实体公共字段
String[] tables={
"user","teacher","student","blog"}; //设置输入表
strategy.setInclude(tables); //多个表名
strategy.setControllerMappingHyphenStyle(true); //是否生成实体时,生成字段注解
strategy.setTablePrefix(pc.getModuleName() + "_"); //字段前缀
mpg.setStrategy(strategy); //执行
mpg.execute();
}
}
- 一键生成