java|mybatis-plus及常用CRUD方法

  1. 在springboot框架中整合mybatis-plus
    properties配置文件中:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql:///db_1220?characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root#配置别名 mybatis-plus.type-aliases-package=com.offcn.entity#给持久层配置日志,用于显示生成的SQL语句 logging.level.com.offcn.dao:debug

  1. 创建实体类
    java|mybatis-plus及常用CRUD方法
    文章图片
package com.offcn.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; //lombok中的注解 @Data @ToString @AllArgsConstructor @NoArgsConstructor//此注解的作用是进行实体类和数据库表名的对应 @TableName("t_user") public class User { //此注解作用是匹配主键和主属性的匹配 //value是数据库中的主键名,type是设置主键的生成策略 //只注解,没有参数的时候就只是指明主键和主属性的匹配,说明主键和主属性匹配 @TableId(value = "https://www.it610.com/article/uid",type = IdType.AUTO) private int uid; private String uname; private String upwd; private String addr; }

  1. 创建持久层
需要继承BaseMapper接口,就有了定义好的方法
引入了lombok启动器,所有使用注解生成对应的get、set、有参、无参构造、toString方法
package com.offcn.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.offcn.entity.User; //生成SQL语句依据对应的实体类 public interface UserDao extends BaseMapper { }

  1. 具体的mybatis-plus常用的单表方法
    注:在测试类需要注入持久层对象
(1)主键查询及查询所有测试,selectById方法
@Test void contextLoads() { //查询所有,mybatis-plus中自定义的持久层接口继承定义好的接口,就有各种功能,设置条件自动生成SQL语句 List list = userDao.selectList(null); System.out.println(list); //主键查询方法 User user = userDao.selectById(1); System.out.println(user); }

(2)新增功能,insert方法
//新增功能测试 @Test public void testInsert(){ User user = new User(); user.setUname("王八蛋"); user.setUpwd("2333"); user.setAddr("K城"); userDao.insert(user); System.out.println(user.getUid()); }

(3)主键修改测试,updateById方法
//主键修改方法 @Test public void testUpdateById(){ User user = new User(); user.setUname("王武"); user.setUpwd("xyz"); user.setAddr("M城"); user.setUid(12); userDao.updateById(user); }

(4)条件修改,update方法
//条件修改测试 @Test public void testUpdate(){ //将密码是ppp的全改成123 User user = new User(); user.setUpwd("123"); UpdateWrapper userUpdateWrapper = new UpdateWrapper<>(); userUpdateWrapper.eq("upwd", "ppp"); userDao.update(user,userUpdateWrapper); }

(5)根据一组主键查询,selectBatchIds方法
//根据一组主键查询 @Test public void testSelectByIds(){ List ids = new ArrayList<>(); Collections.addAll(ids,1,3,4,7); List list = userDao.selectBatchIds(ids); System.out.println(list); }

(6)多条件,逻辑与查询,使用map封装查询条件,selectByMap方法
//多条件,逻辑与查询 @Test public void testSelectAnd(){ Map map = new HashMap<>(); map.put("uname", "王三"); map.put("upwd", "123"); List list = userDao.selectByMap(map); System.out.println(list); }

(7)selectOne方法,查询出一条数据
//使用wrapper封装条件,查询出一条数据selectOne方法 @Test public void testSelectOne(){ QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("uname", "李四"); wrapper.eq("upwd", "avb"); User user = userDao.selectOne(wrapper); System.out.println(user); }

此查询方法如果返回结果超过一条就会报:TooManyResultsException异常
(8)统计个数,selectCount方法
//统计个数 @Test public void testSelectCount(){ //无条件查询 Integer integer = userDao.selectCount(null); System.out.println(integer); //逻辑或条件查询 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.like("uname", "三").or().like("upwd", "3"); Integer integer1 = userDao.selectCount(wrapper); System.out.println(integer1); }

(9)查询一组数据,selectList方法
wrapper中有一些方法,le是<=,lt是<,ge是>=,gt是>,ne是!=,between是一个闭区间中取值,notBetween是不再一个闭区间中取值
//查询一组数据,类似于selectByMap @Test public void testSelectList(){ //写了wrapper没有写条件就是查所有,或者在调用的selectList方法中参数写null也是查所有 QueryWrapper wrapper = new QueryWrapper<>(); //会在左边拼接% wrapper.likeLeft("uname", "三"); //主键小于等于3的数据被查询 wrapper.le("uid", 3); List list = userDao.selectList(wrapper); System.out.println(list); }

(10)查询结果是某列,selectMaps方法
//查询结果是某列 @Test public void testSelectMaps(){ QueryWrapper wrapper = new QueryWrapper<>(); //分组统计城市的人数,且要大于1的 wrapper.select("addr,count(*)"); wrapper.groupBy("addr"); wrapper.having("count(*) > 1"); List maps = userDao.selectMaps(wrapper); System.out.println(maps); }

(11)QueryWrapper类中的last方法
//在最后拼接一句sql @Test public void testSelectLimit(){ QueryWrapper wrapper = new QueryWrapper<>(); wrapper.last("limit 5"); System.out.println(userDao.selectList(wrapper)); }

(12)只查询一列数据,selectObjs方法
//只查询一列数据,selectObjs方法,多条件时依旧只显示第一列数据 @Test public void testSelectObjs(){ QueryWrapper wrapper = new QueryWrapper<>(); wrapper.select("uname"); System.out.println(userDao.selectObjs(wrapper)); }

(13)分页查询
需要配置分页拦截器,根据AOP思想,将分页插件切入进去,在主启动类中添加拦截器方法,注解创建对象
//分页拦截器 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; }

然后就可以使用mybatis-plus的分页功能
//分页查询 @Test public void testSelectPage(){ //创建一个分页page对象,参数是第几页和每页显示条数 Page page = new Page<>(2,3); //没条件查询 QueryWrapper wrapper = new QueryWrapper<>(); IPage userIPage = userDao.selectPage(page, wrapper); long total = userIPage.getTotal(); long size = userIPage.getSize(); long current = userIPage.getCurrent(); long pages = userIPage.getPages(); List records = userIPage.getRecords(); System.out.println("总行数:"+total); System.out.println("页容量:"+size); System.out.println("当前页号:"+current); System.out.println("总页数:"+pages); System.out.println(records); }

  1. mybatis-plus业务层
package com.offcn.service; import com.baomidou.mybatisplus.extension.service.IService; import com.offcn.entity.User; //让业务层继承框架中定义好的接口,获得方法 public interface UserService extends IService { }

其实现类:
package com.offcn.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.offcn.dao.UserDao; import com.offcn.entity.User; import com.offcn.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service //业务层实现类不但要实现接口,还需要继承ServiceImpl类,泛型一个是持久层接口名,一个是实体类 public class UserServiceImpl extends ServiceImpl implements UserService { @Autowired private UserDao userDao; }

这样就配置好,可以测试了
(1)sava方法
//业务层新增功能 @Test public void testSave(){ User user = new User(); user.setUname("琪琪"); user.setUpwd("djd"); user.setAddr("p城"); userService.save(user); System.out.println(user.getUid()); }

(2)update方法
//条件修改多条数据 @Test public void testUpdates(){ //将密码是123的全改成ppp User user = new User(); user.setUpwd("ppp"); UpdateWrapper userUpdateWrapper = new UpdateWrapper<>(); userUpdateWrapper.eq("upwd", "123"); userService.update(user,userUpdateWrapper); }

(3)list方法是查询
getXXX方法也可以查询,功能不同
//查询 @Test public void testList(){ QueryWrapper wrapper = new QueryWrapper<>(); List list = userService.list(wrapper); System.out.println(list); }

(4)page分页查询方法
//分页查询 @Test public void testPage(){ //和持久层中方法除了方法名不一样,其他一模一样Page page = new Page<>(2,3); QueryWrapper wrapper = new QueryWrapper<>(); IPage userIPage = userService.page(page, wrapper); long total = userIPage.getTotal(); long size = userIPage.getSize(); long current = userIPage.getCurrent(); long pages = userIPage.getPages(); List records = userIPage.getRecords(); System.out.println("总行数:"+total); System.out.println("页容量:"+size); System.out.println("当前页号:"+current); System.out.println("总页数:"+pages); System.out.println(records); }

【java|mybatis-plus及常用CRUD方法】注:无论是持久层还是业务层分页方法,都需要在主启动类中配置

    推荐阅读