这个插件是MyBatis的加强版,基本上可以脱离xml文件来实现CRUD。
Spring Boot实现快速开发,搭建步骤:
1、引入依赖。和lombok配合使用可以简化开发。
<!--mybatis-plus相关配置-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2、application.properties文件只需配置数据库连接
3、编写实体类。@TableName注解内对应数据库中表名。
@Data
@TableName("user") //指定表名
public class User {
@TableId //指定主键
private Long id;
@TableField("name") //指定表中某一列
private String name;
private Integer age;
private String email;
@TableField(exist = false) //若数据库种不存在,则不会插入
private String remark;
}
4、编写mapper接口,并在启动类上配置扫描@MapperScan,指定接口的位置。该接口需要继承BaseMapper,并指定泛型,与之前使用mybatis区别在此,也因此无需将SQL写在xml文件中了。
如果有特定的需求,也可以自定义SQL,使用xml文件,只需要在application.properties中指定mapper的位置。在接口中自定义方法。
例如:mybatis-plus.mapper-locations=classpath:mapper/*.xml
/**
* @Date 2019/7/13 15:18
* @Desc 注意需要继承BaseMapper,泛型为对应的实体类类型
*/
@SuppressWarnings("all")
public interface UserMapper extends BaseMapper<User> {
/**
* 自定义分页
* @param page
* @param queryWrapper
* @return
*/
IPage<User> selectUserPage(IPage<User> page, @Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
}
5、使用
package com.liu.plus.pojo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.liu.plus.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author LiuKe
* @Date 2019/7/13 15:20
* @Desc
*/
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void test(){
log.info("测试mybatis-plus使用开始————————");
List<User> list = userMapper.selectList(null);
Assert.assertEquals(7,list.size());
list.forEach(System.out::println);
}
@Test
public void insert(){
User user = new User();
user.setName("张三5");
user.setAge(27);
user.setEmail("123456@163.com");
user.setRemark("注释,数据库不存在对应字段");
userMapper.insert(user);
}
@Test
public void selectById(){
User user = userMapper.selectById("1150356678131077121");
log.info("查询结果:"+user.toString());
}
@Test
public void selectByMap(){
Map map = new HashMap<String,Object>();
//注意:key是数据库中的列,不是实体类中的字段名
map.put("name","张三");
map.put("age",27);
List<User> user = userMapper.selectByMap(map);
user.forEach(System.out::println);
}
@Test
public void selectByWrapper(){
//条件构造器查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 或者
QueryWrapper<User> queryWrapper1 = Wrappers.query();
//查询条件为:name like '%张%' and age<40
queryWrapper.like("name","张").lt("age",40);
List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
@Test
public void selectByWrapper1(){
//条件构造器查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//查询条件为:name like '%张%' and age between 20 and 40 and email is not null
queryWrapper.like("name","张").between("age",20,40).isNotNull("email");
List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
@Test
public void selectByWrapper2(){
//条件构造器查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//查询条件为:name like '张%' or age >= 20 order by age desc,id asc
queryWrapper.likeRight("name","张").or().ge("age",20).orderByDesc("age").orderByAsc("id");
List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
@Test
public void selectByWrapper3(){
//条件构造器查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//查询条件为:name like '张%' or age >= 20 order by age desc,id asc
queryWrapper.likeRight("name","张").or().ge("age",20).orderByDesc("age").orderByAsc("id");
List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
/**
* 分页插件的使用
*/
@Test
public void selectPage(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name","张").lt("age",30);
Page<User> userPage = new Page<>(2, 2); //生成当前对象的返回类型快捷键,光标移到对象前面Ctrl+Alt+V
Page<User> userPage1 = new Page<>(2, 2,true);//第三个参数若为false,则不查询总记录数
IPage<User> userIPage = userMapper.selectPage(userPage1, queryWrapper);
log.info("总页数:"+userIPage.getPages());
log.info("总记录数:"+userIPage.getTotal());
List<User> records = userIPage.getRecords();
records.forEach(System.out::println);
}
/**
* 使用lambda构造参数
*/
@Test
public void selectPageLambda(){
LambdaQueryWrapper<User> queryWrapper = Wrappers.<User>lambdaQuery();
queryWrapper.like(User::getName,"张").lt(User::getAge,30);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
/**
* 返回指定的map,两种方式
*/
@Test
public void selectMap(){
LambdaQueryWrapper<User> queryWrapper = Wrappers.<User>lambdaQuery();
queryWrapper.select(User::getId,User::getName).like(User::getName,"张").lt(User::getAge,30);
// QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// queryWrapper.select("id","name"); //指定需要返回的元素的列
// queryWrapper.like("name","张").lt("age",30);
List<Map<String,Object>> list = userMapper.selectMaps(queryWrapper);
list.forEach(System.out::println);
}
/**
* 自定义分页
*/
@Test
public void selectMyPage(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name","张").lt("age",30);
Page<User> userPage = new Page<>(2, 2); //生成当前对象的返回类型快捷键,光标移到对象前面Ctrl+Alt+V
IPage<User> userIPage = userMapper.selectUserPage(userPage, queryWrapper);
log.info("总页数:"+userIPage.getPages());
log.info("总记录数:"+userIPage.getTotal());
List<User> records = userIPage.getRecords();
records.forEach(System.out::println);
}
}
6、mapper
<?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.liu.plus.pojo.UserMapper" >
<select id="selectUserPage" resultType="com.liu.plus.entity.User">
select * from user ${ew.customSqlSegment}
</select>
</mapper>
7、分析
自定义的查询语句中,ew是接口中方法定义时,传入的参数@Param(Constants.WRAPPER),取值使用的是customSqlSegment,这个方法会生成WHERE的连接字,使用时不用单独添加。在com.baomidou.mybatisplus.core.conditions包下的Wrapper中可以看到:
/**
* 获取自定义SQL 简化自定义XML复杂情况
* <p>使用方法</p>
* <p>`自定义sql` + ${ew.customSqlSegment}</p>
* <p>1.逻辑删除需要自己拼接条件 (之前自定义也同样)</p>
* <p>2.不支持wrapper中附带实体的情况 (wrapper自带实体会更麻烦)</p>
* <p>3.用法 ${ew.customSqlSegment} (不需要where标签包裹,切记!)</p>
* <p>4.ew是wrapper定义别名,可自行替换</p>
*/
public String getCustomSqlSegment() {
MergeSegments expression = getExpression();
if (Objects.nonNull(expression)) {
NormalSegmentList normal = expression.getNormal();
String sqlSegment = getSqlSegment();
if (StringUtils.isNotEmpty(sqlSegment)) {
if (normal.isEmpty()) {
return sqlSegment;
} else {
return Constants.WHERE + " " + sqlSegment;
}
}
}
return StringUtils.EMPTY;
}