MybatisPlus学习笔记

前言:这里使用的是SpringBoot整合MybtisPlus项目。

项目准备

1、创建springboot整合mybatis plus的项目。

2、创建用户实体类,有/无参构造函数与toString/set/get这里省略。

public class User{
    private Integer id;
    private String  name;
}

3、创建接口类,使用mybatis plus必须继承BaseMapper泛型为要操作的类名,数据库的表明也要与实体类的表名一直,不区分大小写。

@Mapper
public interface UserDao extends BaseMapper {
}

4、创建测试类

@SpringBootTest
class MybatisPlusStringBootApplicationTests {

    @Autowired
    private UserDao userDao;

    @Test
    void addUser() {
        User user = new User(3, "李三新");
        //添加用户
        userDao.insert(user);
    }

    @Test
    void delUser() {
        //删除用户
        userDao.deleteById(3);
    }

    @Test
    void updataUser() {
        //更新用户信息,为null的属性不更新
        User user = new User(2, "李er新");
        userDao.updateById(user);
    }

    @Test
    void queryAll() {
        //查询所有的用户并输出
        userDao.selectList(null).forEach(System.out::println);
    }
}

使用mybatis plus进行分页

创建拦截器类(mybatis plus使用分页功能,必须要有拦截器

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor pageInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

进行分页

@SpringBootTest
class MybatisPlusStringBootApplicationTests {

    @Autowired
    private UserDao userDao;

    @Test
    void page() {
        //第一个参数代表当前页数,第二个代表每页要展示的数据量
        IPage page = new Page(4, 30);
        userDao.selectPage(page, null);
        System.out.println("当前页码:" + page.getCurrent());
        System.out.println("每页数据总量:" + page.getSize());
        System.out.println("总页数:" + page.getPages());
        System.out.println("当前页码:" + page.getTotal());
        System.out.println("当前页数据:" + page.getRecords());
    }
}

在yml中配置启用在控制台输出mybatis plus日志。

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

条件查询的三种写法

条件可以添加多个,LambdaQueryWrapper的方法支持链式编程。

@SpringBootTest
class MybatisPlusStringBootApplicationTests {
    @Test
    void queryAll() {
        //id小于十八的
        QueryWrapper queryWrapper=new QueryWrapper();
        queryWrapper.lt("id", 18);
        userDao.selectList(queryWrapper).forEach(System.out::println);

        //id小于十八的
        QueryWrapper qw = new QueryWrapper<>();
        qw.lambda().lt(User::getId, 18);
        userDao.selectList(qw).forEach(System.out::println);

        //id小于十八的
        LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
        lqw.lt(User::getId, 18);
        userDao.selectList(lqw).forEach(System.out::println);


        //id小于十八,大于5的
        LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
        lqw.lt(User::getId, 10);
        lqw.gt(User::getId, 2);
        //或者 lqw.lt(User::getId, 10).gt(User::getId, 2);
        userDao.selectList(lqw).forEach(System.out::println);


        //id小于十八,大于5的
        LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
        lqw.lt(User::getId, 10);
        lqw.gt(User::getId, 2);
        //或者 lqw.lt(User::getId, 10).gt(User::getId, 2);
        userDao.selectList(lqw).forEach(System.out::println);

    }
}

执行条件不为空时执行

//如果条件成立则拼接,如果第一个条件不成立,不影响链式编程的第二个。
lqw.gt(min != null, User::getId, min).lt(max != null, User::getId, max);

查询的字段控制

方法一

LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//设置要查询的值,参数任意
lqw.select(User::getId);
userDao.selectList(lqw).forEach(System.out::println);

方法二

QueryWrapper lqw = new QueryWrapper<>();
//设置要查询的值,参数任意
lqw.select("id,name");
userDao.selectList(lqw).forEach(System.out::println);

其它查询操作

查询总共多少条数据:

QueryWrapper lqw = new QueryWrapper<>();
lqw.select("count(*) as count");
List> maps = userDao.selectMaps(lqw);
System.out.println(maps);     //结果:[{count=99}]

按性别分组,统计人数:

QueryWrapper lqw = new QueryWrapper<>();
lqw.select("sex,count(*) as count");
lqw.groupBy("sex");
List> maps = userDao.selectMaps(lqw);
System.out.println(maps);

判断账号密码是否正确:

LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//判断账号密码
lqw.eq(User::getAccount, "846581636").eq(User::getPassword, "123456");
//selectOne方法用于查询一条数据
User user = userDao.selectOne(lqw);
System.out.println(user);

范围查询

lt:小于

le:小于等于

gt:大于

ge:大于等于

eq:等于

between:范围查询(lambdaQueryWrapper.between(User::getAge,10,30));查询范围在

 模糊查询

LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//查询带有新的用户名
lqe.like(User::getName,"新");
List userList = userDao.selectList(lqw);
System.out.println(userList);

字段映射

用于解决字段名与数据库中列名不同的情况。

public class User{
    //数据库中的字段名是userAccount
    @TableField(value = "userAccount")
    private String  account;
}

代码添加数据库中未定义的属性

public class User{
    //表示这个属性就是在类中用的数据库中没有对应的列
    @TableField(exist = false)
    private String  account;
    
    //与上面一样的效果
    private transient String  sex;
}

设置字段是否参与查询

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User{

    //为false时该字段不参与查询
    @TableField(select = false)
    private String  password;
}

表名与实体类名不同

通过@TableName注解指定对应的表名:

@TableName("tab_User")
public class User{
    private Integer id;
    private String  name;
    private String  sex;
}

批量操作

批量删除

List list = new ArrayList<>();
list.add(4L);
list.add(5L);
userDao.deleteBatchIds(list);

批量查询

List list = new ArrayList<>();
list.add(4L);
list.add(5L);
userDao.selectBatchIds(list).forEach(System.out::println);

逻辑删除

表中添加对应字段deleted,int型,长度为1,默认为0(0表示没有删除,1表示删除了)

对数据库的CRUD操作都不会操作逻辑删除的数据。

删除的时候不是真正意义的删除是执行的update语句,把对应字段设置为删除状态。

public class User {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private String sex;

    @TableLogic(value = "0", delval = "1")  //逻辑删除字段,0是没有删除,1是删除了
    private int deleted;
}

可在application.yml中可设置通用的逻辑删除配置

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted   //逻辑删除字段
      logic-delete-value: 0         //数据存在时的逻辑值
      logic-not-delete-value: 1     //数据删除时的逻辑值

乐观锁

可以用于商品的秒杀。

表中添加对应字段version,int型,长度为11,默认为1。

该字段每操作一次mybarisplus都对自增一。

一般操作是先从数据库中查询对应的商品id查商品,把商品信息返回到前端,前端更改后再把信息返回到后端进行写入到数据可。

Goods goods = goods Dao.selectById(1);
user.setName("苹果");
goodsDao.updateById(goods);

业务层快速开发

使用mybatisPlus提供有义务层调用接口(IService)与业务层通用实现类(ServiceImpl)。

通用类基础上左功能重载或功能追加。

  1. 定义一个接口继承:IService<实体类> 
  2. 定义一个类,继承:ServiceImpl<实现BaseMapper的接口, 实体类>,再实现第一步中定义的接口。
public interface IBookService extends IService {
}

@Service
public class MyServiceImpl extends ServiceImpl implements IBookService{
}




@Autowired
private MyServiceImpl myService;

@Test
void contextLoads() {
    myService.list().forEach(System.out::println);
}

你可能感兴趣的:(javaWeb,SSM系列,spring,boot,mybatisplus)