ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

mybatis-plus及常用CRUD方法

2022-01-11 23:04:13  阅读:169  来源: 互联网

标签:CRUD System wrapper println plus user mybatis new out


  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. 创建实体类
    在这里插入图片描述
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 = "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<User> {
}

  1. 具体的mybatis-plus常用的单表方法
    注:在测试类需要注入持久层对象

(1)主键查询及查询所有测试,selectById方法

@Test
    void contextLoads() {
        //查询所有,mybatis-plus中自定义的持久层接口继承定义好的接口,就有各种功能,设置条件自动生成SQL语句
        List<User> 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<User> userUpdateWrapper = new UpdateWrapper<>();
        userUpdateWrapper.eq("upwd", "ppp");
        userDao.update(user,userUpdateWrapper);
    }

(5)根据一组主键查询,selectBatchIds方法

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

(6)多条件,逻辑与查询,使用map封装查询条件,selectByMap方法

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

(7)selectOne方法,查询出一条数据

//使用wrapper封装条件,查询出一条数据selectOne方法
    @Test
    public void testSelectOne(){
        QueryWrapper<User> 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<User> 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<User> wrapper = new QueryWrapper<>();

        //会在左边拼接%
        wrapper.likeLeft("uname", "三");

		//主键小于等于3的数据被查询
        wrapper.le("uid", 3);
        List<User> list = userDao.selectList(wrapper);
        System.out.println(list);
    }

(10)查询结果是某列,selectMaps方法

//查询结果是某列
    @Test
    public void testSelectMaps(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();

        //分组统计城市的人数,且要大于1的
        wrapper.select("addr,count(*)");
        wrapper.groupBy("addr");
        wrapper.having("count(*) > 1");
        List<Map<String, Object>> maps = userDao.selectMaps(wrapper);
        System.out.println(maps);
    }

(11)QueryWrapper类中的last方法

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

(12)只查询一列数据,selectObjs方法

//只查询一列数据,selectObjs方法,多条件时依旧只显示第一列数据
    @Test
    public void testSelectObjs(){
        QueryWrapper<User> 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<User> page = new Page<>(2,3);

        //没条件查询
        QueryWrapper<User> wrapper = new QueryWrapper<>();

        IPage<User> userIPage = userDao.selectPage(page, wrapper);
        long total = userIPage.getTotal();
        long size = userIPage.getSize();
        long current = userIPage.getCurrent();
        long pages = userIPage.getPages();
        List<User> 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<User> {
}

其实现类:

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<UserDao,User> 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<User> userUpdateWrapper = new UpdateWrapper<>();
        userUpdateWrapper.eq("upwd", "123");
        userService.update(user,userUpdateWrapper);
    }

(3)list方法是查询
getXXX方法也可以查询,功能不同

//查询
    @Test
    public void testList(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        List<User> list = userService.list(wrapper);
        System.out.println(list);
    }

(4)page分页查询方法

//分页查询
    @Test
    public void testPage(){
        //和持久层中方法除了方法名不一样,其他一模一样
        
        Page<User> page = new Page<>(2,3);
        QueryWrapper<User> wrapper = new QueryWrapper<>();

        IPage<User> userIPage = userService.page(page, wrapper);
        long total = userIPage.getTotal();
        long size = userIPage.getSize();
        long current = userIPage.getCurrent();
        long pages = userIPage.getPages();
        List<User> records = userIPage.getRecords();
        System.out.println("总行数:"+total);
        System.out.println("页容量:"+size);
        System.out.println("当前页号:"+current);
        System.out.println("总页数:"+pages);
        System.out.println(records);
    }

注:无论是持久层还是业务层分页方法,都需要在主启动类中配置

标签:CRUD,System,wrapper,println,plus,user,mybatis,new,out
来源: https://blog.csdn.net/weixin_45893072/article/details/122440294

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有