官方文档
https://baomidou.com/
引入
依赖
访问数据库,则mysql驱动必须添加。 MyBatisPlus是MyBatis的扩展。引入依赖时只需要引入MyBatisPlus,不要再引入MyBatis,否则可能会产生冲突。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
指定mapper文件夹
为Application类添加@MapperScan 注解来指定mapper文件夹。
@SpringBootApplication
@MapperScan("com.example.test.system.mapper")
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
分页支持
MyBatisPlus分页使用IPage ,不需要额外引入依赖,但需要添加配置类:
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
若在Application 类中已经添加了@MapperScan 注解来指定mapper文件夹,这里就不需要重复添加。 特别注意IPage 与PageHelper 冲突。因此不要在pom.xml中引入PageHelper 。
自动生成
文件
MyBatisPlus可根据数据库表自动生成对应的4个文件夹:entity、controller、service、mapper。 自动生成需要添加2个依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>spring-boot-starter-swagger</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
generator用于自动生成功能,swagger用于提供swagger支持。注意是spring-boot-starter-swagger,从1.6开始更新为swagger-spring-boot-starter,但目前新版本的swagger-spring-boot-starter引入后MyBatisPlus运行有问题。 在某个方法中添加自动生成逻辑。可以是某个controller方法,然后由系统调用;推荐放入Test方法,直接运行。
@RunWith(SpringRunner.class)
@SpringBootTest
public class Generator {
private final Logger logger = LoggerFactory.getLogger(Generator.class);
@Before
public void setUp() throws Exception {
logger.info("测试类Generator初始化");
}
@Test
public void autoGenerate() {
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8";
String userName = "root";
String password = "123456";
FastAutoGenerator.create(url, userName, password)
.globalConfig(builder -> {
builder.author("YuJian")
.enableSwagger()
.fileOverride()
.outputDir("E:\\workspace\\test\\src\\main\\java");
})
.packageConfig(builder -> {
builder.parent("com.example.test")
.moduleName("system");
})
.strategyConfig(builder -> {
builder.addInclude("user")
.addTablePrefix("t_", "c_")
.entityBuilder().enableLombok();
})
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
}
运行后,即可在设置的文件夹下生成对应的文件。 注意其中xml的配置被注释掉了。若设施生成xml文件,当需要使用@SelectProvider 这样的注解时必须在xml文件中做对应的配置。因此若无特殊作用,可屏蔽xml文件生成的配置。
实体类
由于开启了lombok插件,自动生成的entity代码不带getter和setter。
@Getter
@Setter
@TableName(value = "sys_user")
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private Integer age;
private String email;
}
可在实体类上使用@TableName 注解指定表名。若表名与类型相同,则该注解可省略。 在id 字段上使用了@TableId(type = IdType.AUTO) 来指明为自增长字段。具体属性名和属性值可参考文档。 实体类也封装了CRUD操作,需要继承Model 类。详见下文。
使用
CRUD接口封装
CRUD即增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)。MyBatisPlus已经做了封装,只要继承BaseMapper<T> 或IBaseService<T> ,即可直接为Service和Mapper赋予CRUD功能。
Mapper CRUD
Mapper CRUD需要在创建Mapper时继承BaseMapper<T> :
public interface UserMapper extends BaseMapper<User> {
}
这样即实现了Mapper CRUD。Mapper CRUD包含如下功能:
- Insert: 插入。只包含单条记录插入。
- Delete: 删除。可根据条件进行单条或批量删除。
- Upate: 更新。
- Select: 查询。可根据条件进行单条或批量查询。单条查询只会返回类对象;批量查询时返回结果可为
List<T> 、List<Map<String, Object>> 、List<Object> 或IPage<T> 、IPage<Map<String, Object>> 。
Service CRUD
Service CRUD需要在创建Service时继承IService<T> :
public interface UserService extends IService<User> {
}
这样即实现了Service CRUD。Service CRUD包含如下功能:
- Save: 插入。可进行单条插入或批量插入。对应Mapper的insert,但功能更强。
- Remove: 删除。可根据条件进行单条或批量删除。对应Mapper的Delete。
- Upate: 更新。
- Get: 查询单个。
- List: 查询批量。
- Page: 分页查询。
- Count: 查询数量。
- Chain: 链式查询。
实体类 CRUD
实体类也封装了CRUD操作,需要继承Model 类:
class User extends Model<User>{
}
然后即可直接调用:
User user = new User();
user.insert();
user.selectAll();
user.updateById();
user.deleteById();
条件构造器
查询时可调用Wrapper来传入查询条件。 AbstractWrapper 为QueryWrapper(LambdaQueryWrapper) 和UpdateWrapper(LambdaUpdateWrapper) 的父类。其主要作用是生成sql的where条件。具体可参考官方文档。 条件通常由2个Wrapper子类负责:
- QueryWrapper: 用于生成查询类的sql条件。
- UpdateWrapper: 用于生成更新类的sql条件。
QueryWrapper 示例:
int r = userMapper.delete(new QueryWrapper<User>().eq("id", "1"));
int r = userMapper.delete(new QueryWrapper<User>().eq("name", "张三").eq("age", "18"));
int r = userMapper.delete(new QueryWrapper<User>().eq("name", "张三").or().eq("name", "李四"));
Map<String , Object> map = new HashMap<>();
map.put("name" , "张三");
map.put("age" , 18);
QueryWrapper<User> queryWrapper = new QueryWrapper<User>().allEq(map);
List<User> userList = userMapper.selectList(queryWrapper);
自定义查询
可使用@Select 和@SelectProvider 在mapper中进行自定义查询。
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT * FROM user WHERE id=#{id};")
public User getUserById(Integer id);
@SelectProvider(type = UserProvider.class, method = "getUsers")
public List<User> getUsers();
}
public class UserProvider {
public String getUsers() {
String sql = "select * from user";
return sql;
}
}
注意若User对应的xml存在,则使用@SelectProvider 注解必须在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.example.test.system.mapper.UserMapper">
<select id="getUsers" resultType="com.example.test.system.entity.User"></select>
</mapper>
否则就会有错误提示:
Statement with id=“getUsers” not defined in mapper xml
若xml无其他作用,可直接将该xml删除,就不需要进行该配置了。
测试
通常地,使用SpringBoot自带的测试注解@SpringBootTest 标记测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestService {
private final Logger logger = LoggerFactory.getLogger(TestService.class);
@Before
public void setUp() throws Exception {
logger.info("测试类TestControllerTest初始化");
}
@Test
public void doTest() throws Exception {
}
}
该方式会启动整个环境,即所有的服务。 MyBatisPlus在3.4.0版本引入了test starter:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter-test</artifactId>
<version>3.5.0</version>
</dependency>
使用注解@MybatisPlusTest 标记测试类:
@RunWith(SpringRunner.class)
@MybatisPlusTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class MybatisPlusSampleTest {
@Autowired
private UserMapper userMapper;
@Test
public void doTest() throws Exception {
}
}
该方式只会启动数据库服务和远程数据库,不会启动其他服务。 但实际测试,该方式可正常查询,但对于插入等操作,返回成功,但实际数据库未更改。因此建议依然使用SpringBoot自带测试。
|