MybatisPlus学习笔记

喜夏-厌秋 提交于 2019-12-24 13:48:53

毕业后开始实习的第一天,是熟悉项目中用到的mybatis plus,发现与过去用到的mybatis简便了不少东西(至少xml的mapper文件不用写了),在此特地记录下mybatis的单表crud和分页查询,以及多表复杂查询.
创建用户表

CREATE TABLE `user` (
`id` INT ( 20 ) NOT NULL COMMENT '主键ID',
`name` VARCHAR ( 30 ) DEFAULT NULL COMMENT '姓名',
`age` INT ( 11 ) DEFAULT NULL COMMENT '年龄',
`email` VARCHAR ( 50 ) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;

pom依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

application.properties配置数据库信息

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url= jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true 

实体类


import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private String email;
}

数据访问对象

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper extends BaseMapper<User> {

}

服务层

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;

public interface UserService extends IService<User> {
  
}

服务实现层

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.dao.UserMapper;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

}

控制层


@RestController
public class UserController {
    @Autowired
    private UserService userService;
     
}

在启动类中配置Mapper类的扫描路径


@SpringBootApplication
@MapperScan("com.example.demo.dao")
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

  1. 批量插入
	@RequestMapping("/saveBatch")
    public Boolean saveBatch() {
        List<User> list = new ArrayList<>();
        for (int i = 1; i <21 ; i++) {
            list.add(new User(i, "ckl"+i, 20+i, i+"@qq.com"));
        }
        Boolean insert = userService.saveBatch(list);
        return insert;
    }

浏览器访问http://localhost:8080/saveBatch
执行结果
在这里插入图片描述

  1. 插入单条记录
@RequestMapping("/save")
    public Boolean save() {
        User user = new User(0, "ckl0", 20, 0+"@qq.com");
        Boolean insert = userService.save(user);
        return insert;
    }

执行结果
在这里插入图片描述

  1. 更新
@RequestMapping("/updateById")
    public Boolean updateById() {
        User user = new User(0, "ckl", 20, 0+"@qq.com");
        Boolean insert = userService.updateById(user);
        return insert;
    }

执行结果
在这里插入图片描述

  1. 按主键查询单条记录
@RequestMapping("/getById")
    public User getById() {
        User user = userService.getById(0);
        return user;
    }

在这里插入图片描述

  1. 查询全部记录
@RequestMapping("/list")
    public List<User> list() {
        List users = userService.list();
        return users;
    }

在这里插入图片描述

  1. 用Wrapper实现复杂条件查询
    @RequestMapping("/listByWrapper")
    public List<User> listByWrapper() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//        查询年龄在20到24之间,且不等于22岁的用户
        queryWrapper.between("age", 20, 24).ne("age", 22);
        List<User> users = userService.list(queryWrapper);
        return users;
    }

在这里插入图片描述

  1. 使用Map实现用任意字段查询
    @RequestMapping("/listByMap")
    public List listByMap() {
        Map<String, Object> map = new HashMap<>();
//        查询年龄为25岁的用户
        map.put("age", 25);
        List count = userService.listByMap(map);
        return count;
    }

在这里插入图片描述

  1. 多表查询
    因为mybatis plus没有对xml的支持,所以这里用crud的注解@Select来实现多表查询,本质上还是mybatis的内容
    创建用户-角色表,并插入三条记录
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role`  (
  `user_id` int(11) NULL DEFAULT NULL,
  `role_id` int(11) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT INTO `user_role` VALUES (0, 0);
INSERT INTO `user_role` VALUES (1, 1);
INSERT INTO `user_role` VALUES (2, 2);

SET FOREIGN_KEY_CHECKS = 1;

在UserMapper类中加入以下方法

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper extends BaseMapper<User> {
//    根据用户名查找角色编号
    @Select("select role_id " +
            "from user_role " +
            "where user_id=" +
            "(select id " +
            "from user " +
            "where user.name=#{userName}) ")
    Integer selectRoleByUserName(String userName);
}

UserService

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;

public interface UserService extends IService<User> {
    Integer selectRoleByUserName(String userName);
}

UserServiceImpl

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.dao.UserMapper;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Resource
    private UserMapper userMapper;

    @Override
    public Integer selectRoleByUserName(String userName) {
        return userMapper.selectRoleByUserName(userName);
    }
}

控制层

@RequestMapping("/selectRoleByUserName")
    public Integer selectRoleByUserName() {
    //        查询用户名为ckl2对应的角色编号
        Integer roleId = userService.selectRoleByUserName("ckl2");
        return roleId;
    }

在这里插入图片描述

  1. 分页查询
    配置分页插件
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@MapperScan("com.example.demo.dao")
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }
}

控制层

    @RequestMapping("/page")
    public IPage<User> page(Long current, Long size) {
        Page<User> page = new Page<>();
//        当前页码
        page.setCurrent(current);
//        每页显示的行数
        page.setSize(size);
        QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//        查询年龄在20到30之间的用户
        queryWrapper.between("age", 20, 30);
        IPage<User> iPage = userService.page(page,queryWrapper);
        return iPage;
    }

访问一下地址,将返回年龄在20到30之间的用户中,每页两条记录的时候,第二页中的内容
http://localhost:8080/page?current=2&size=2
在这里插入图片描述
很明显,第一页是20岁和21岁的记录,第二页是22和22岁的记录,上面的结果也对应了我们的预测

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!