【Spring Boot学习笔记】集成Mybatis Plus对MySQL数据库进行操作

2025-05-30 21:05:29  阅读 109 次 评论 0 条


本篇文章,我们讲一下如何去使用苞米豆的Mybatis Plus来进行数据库访问

1、添加Mybatis依赖

首先要添加对应的依赖:

Spring Boot 3.5.0 、Mybatis Plus 版本是 3.5.12MySQL数据库驱动版本是 8.2.0Mybatis-Spring 版本是 3.0.3(至少我这么配暂时能跑起来)

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.5.0</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>3.0.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.2.0</version>
</dependency>

2、添加数据源配置文件

新建一个配置文件,比如我这个是 application-db-test.yml (连线信息修改成自己的)

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    url: jdbc:mysql://127.0.0.1:3306/db_test?&serverTimezone=Asia/Shanghai

在主配置中,在include中添加  db-test 这一项

spring:
  application:
    name: MyFirstProject

  profiles:
    active: test
    include: test1,test2,db-test #在这里哦

3、创建数据表并添加测试数据

首先我们创建一个 userinfo 表 ,里面包含了 uid(作为主键)、name、age

CREATE TABLE `userinfo`(
    `uid` INT NOT NULL AUTO_INCREMENT COMMENT '用户id',
    `name` VARCHAR(50) NOT NULL,
    `age` INT NOT NULL
    PRIMARY KEY (`uid`)
);

再插入一些测试数据

INSERT INTO userinfo (`name`,`age`) VALUES ('小明',8);
INSERT INTO userinfo (`name`,`age`) VALUES ('小红',5);

4、创建实体类

目前我是把数据和业务层单独抽离了出来,其实就是创建一个新的组件用来放入口和控制器,然后把根目录下src里面的内容移动到新组建里面启动配置改一下就行,后期抽空再写一篇关于这个的~

这个是 UserInfo 实体类的代码

package xyz.ygmx.test.business.user.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("username")
public class UserInfo {
    @TableId(value = "uid", type=IdType.AUTO)//这个是设置标识列,并且自增
    @TableField("uid")//绑定对应的列名
    private int uid;
    @TableField("name")
    private String name;
    @TableField("age")
    private int age;
}

5、创建映射(Mapper)

创建一个接口,名称设定为 UserInfoMapper 然后要继承 BaseMapper 这个类

代码如下(对的没错,简单查询的话暂时什么都不用写,Mybatis plus 自带的增删改查):

这里有个坑,SpringBoot 可能扫描不到 Mapper,可以在程序的入口类添加 @SpringBootApplication(scanBasePackages = {"xyz.ygmx.test"}) 注解解决此问题,这个是设定了扫描的范围(包名改成自己的)

package xyz.ygmx.test.business.user.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import xyz.ygmx.test.business.user.entity.UserInfo;

public interface UserInfoMapper extends BaseMapper<UserInfo> {

}

在这个项目的 resource 目录下建立一个 mapper 目录,里面再建立一个 user 目录,这个就是放和用户有关所有数据表映射的~

里面的内容是这样~ (如果没有自定sql语句的话可以先不建立)

<?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接口的位置-->
<mapper namespace="xyz.ygmx.test.business.user.mapper.UserInfoMapper">
</mapper>

6、进行查询

创建对应的Service接口和实现类(具体类怎么放看个人喜好,我反正比较喜欢把实现的类用一个impl包装起来)

接口中继承 IService<UserInfo>接口,实现类中继承 ServiceImpl<UserInfoMapper,UserInfo> 

(这个泛型写这个Service主要操作的实体就好,其余的Mapper可以通过依赖注入后拿到)

并且,实现类要用 @Service 这个注解修饰,不然注入会报错的哦~


我们在 Service 的实现类里面(我的是 IUserInfoService),添加一个方法,写入如下的测试代码,感受一下条件查询~

@Autowired //直接把实例注入
    private UserInfoMapper userInfoMapper;

    //按名字查询
    public UserInfo getByName(String name){
//        //这个是注入Mapper的写法
//        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
//        queryWrapper.lambda().like(UserInfo::getName, name).last("LIMIT 1");//查询中名字包含xxx的,就像sql中 like '%xxx%',可能返回多个数据,所以限制为1个
//        UserInfo u = null;
//        u=userInfoMapper.selectOne(queryWrapper);

        //这个是直接用Mybatis Plus自带的查询
        UserInfo u = null;
        u=this.lambdaQuery().like(UserInfo::getName,name).last("LIMIT 1").one();//查询中名字包含xxx的,就像sql中 like '%xxx%',可能返回多个数据,所以限制为1个

        if(u==null){
            u=new UserInfo();
            u.setName("不存在的");
            u.setUid(-1);
            u.setAge(200);
        }
        return u;
    }

当然,插入新数据也是可以的~(别杠!我这个只是为了方便一下理解,正常开发这个得用返回对象封装的)

@Autowired //直接把实例注入
private UserInfoMapper userInfoMapper;//前面添加过这个Mappeer就不用管了~

//添加数据(Mapper中的方法)
public int createUserByMapper(UserInfo userInfo){
    int res=userInfoMapper.insert(userInfo);//使用Mapper新增数据(返回执行行数,个人比较推荐)
    return res;

}

//添加数据(MybatisPlus 自带方法)
public boolean createUser(UserInfo userInfo){

    boolean res=this.save(userInfo);

    return res;
}

还有删除和修改哦~

//修改对应uid的用户名(Mapper中的方法)
    public boolean editUserByPlus(int uid,String newName){
        //这里面有个坑,如果age你没有设置,默认是0,结果咱们在更新name的时候也把age改成0了
//        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("uid",uid);
//        UserInfo userInfo = new UserInfo();
//        userInfo.setName(newName);
        UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("uid",uid).set("name",newName);
        return this.update(updateWrapper);
    }
    //修改对应uid的用户名(Mapper中的方法)
    public int editUserByMapper(int uid,String newName){
        //这里面有个坑,如果age你没有设置,默认是0,结果咱们在更新name的时候也把age改成0了
//        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("uid",uid);
//        UserInfo userInfo = new UserInfo();
//        userInfo.setName(newName);

        UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("uid",uid).set("name",newName);

        return userInfoMapper.update(updateWrapper);
    }

注意:实现方法建立完成后还不能直接引用,要在它的接口中(我的是 IUserInfoService )暴露一下的哦,像这样~

//条件查询
UserInfo getByName(String name);
//添加数据(Mapper中的方法)
int createUserByMapper(UserInfo userInfo);
//添加数据(MybatisPlus 自带方法)
boolean createUser(UserInfo userInfo);
//修改对应uid的用户名(Mapper中的方法)
boolean editUserByPlus(int uid,String newName);
//修改对应uid的用户名(Mapper中的方法)
int editUserByMapper(int uid,String newName);
//删除对应uid的用户(MybatisPlus 自带方法)
boolean deleteUserByPlus(int uid);
//删除对应uid的用户(Mapper中的方法)
int deleteUserByMapper(int uid);

前面做好后,就可以在Controller里面写啦,注意要使用 @Autowried 修饰 Service 来实现手动注入的哦~

@Autowired
private IUserService userService;

然后写调用的方法~

//通过名字查询用户
@GetMapping("getuserbyname/{username}")
public UserInfo getUserByName(@PathVariable String username){
    UserInfo ui = userService.getByName(username);

    return ui;
}

//这个是通过Mapper创建的用户
@GetMapping("createuserbymapper")
public  int createUser_1(UserInfo userInfo){
    int res=userService.createUserByMapper(userInfo);
    return res;
}
//通过 MybatisPlus 自带的方法创建用户
@GetMapping("createuserbyplus")
public  boolean createUser_2(UserInfo userInfo){
    boolean res=userService.createUser(userInfo);
    return res;
}

直接启动!(目前展示了新增和查询,其余的大差不差,都可以自行尝试~)

这个是查询用户的运行结果

user/getuserbyname/小红

QQ_1748713841816.png

这个是通过 Mapper 添加用户的执行结果

 user/createuserbymapper?name=通过 Mapper 创建的用户&age=20

QQ_1748714305492.png


这个是通过Mybatis Plus自带方法添加用户的执行结果

user/createuserbyplus?name=通过Mybatis%20Plus%20创建的用户&age=20

QQ_1748714331835.png

到数据库查一下,完美~

QQ_1748717233758.png

3、全部代码

UserInfo.java

package xyz.ygmx.test.user.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
//import lombok.Data;

//@Data
@TableName("userinfo")
public class UserInfo {
    @TableId(value = "uid", type=IdType.AUTO)//这个是设置标识列,并且自增
    @TableField("uid")//绑定对应的列名
    private int uid;
    @TableField("name")
    private String name;
    @TableField("age")
    private int age;

    public void setUid(int uid) {
        this.uid = uid;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public  int getUid(){
        return uid;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }


}

UserInfoMapper.java

package xyz.ygmx.test.user.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import xyz.ygmx.test.user.entity.UserInfo;

@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {

}

IUserService.java

package xyz.ygmx.test.user.services;


import xyz.ygmx.test.user.entity.UserInfo;
import com.baomidou.mybatisplus.extension.service.IService;

public interface IUserService extends IService<UserInfo> {
    //条件查询
    UserInfo getByName(String name);
    //添加数据(Mapper中的方法)
    int createUserByMapper(UserInfo userInfo);
    //添加数据(MybatisPlus 自带方法)
    boolean createUser(UserInfo userInfo);
    //修改对应uid的用户名(Mapper中的方法)
    boolean editUserByPlus(int uid,String newName);
    //修改对应uid的用户名(Mapper中的方法)
    int editUserByMapper(int uid,String newName);
    //删除对应uid的用户(MybatisPlus 自带方法)
    boolean deleteUserByPlus(int uid);
    //删除对应uid的用户(Mapper中的方法)
    int deleteUserByMapper(int uid);
}

UserService.java

package xyz.ygmx.test.user.services.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import xyz.ygmx.test.user.entity.UserInfo;
import xyz.ygmx.test.user.mapper.UserInfoMapper;
import xyz.ygmx.test.user.services.IUserService;

@Service//必须有这个注解哦,不然无法用Autowried注入的~~
public class UserService extends ServiceImpl<UserInfoMapper,UserInfo> implements IUserService {
    @Autowired //直接把实例注入
    private UserInfoMapper userInfoMapper;

    //修改对应uid的用户名(Mapper中的方法)
    public boolean editUserByPlus(int uid,String newName){
        //这里面有个坑,如果age你没有设置,默认是0,结果咱们在更新name的时候也把age改成0了
//        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("uid",uid);
//        UserInfo userInfo = new UserInfo();
//        userInfo.setName(newName);
        UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("uid",uid).set("name",newName);
        return this.update(updateWrapper);
    }
    //修改对应uid的用户名(Mapper中的方法)
    public int editUserByMapper(int uid,String newName){
        //这里面有个坑,如果age你没有设置,默认是0,结果咱们在更新name的时候也把age改成0了
//        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("uid",uid);
//        UserInfo userInfo = new UserInfo();
//        userInfo.setName(newName);

        UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("uid",uid).set("name",newName);

        return userInfoMapper.update(updateWrapper);
    }

    //删除对应uid的用户(MybatisPlus 自带方法)
    public boolean deleteUserByPlus(int uid){
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("uid",uid);
        return this.remove(queryWrapper);
    }
    //删除对应uid的用户(Mapper中的方法)
    public int deleteUserByMapper(int uid){
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("uid",uid);
        return userInfoMapper.delete(queryWrapper);
    }

    //添加数据(Mapper中的方法)
    public int createUserByMapper(UserInfo userInfo){
        int res=userInfoMapper.insert(userInfo);//使用Mapper新增数据(返回执行行数,个人比较推荐)
        return res;

    }

    //添加数据(MybatisPlus 自带方法)
    public boolean createUser(UserInfo userInfo){

        boolean res=this.save(userInfo);

        return res;
    }

    //按名字查询
    public UserInfo getByName(String name){
//        //这个是注入Mapper的写法
//        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
//        queryWrapper.lambda().like(UserInfo::getName, name).last("LIMIT 1");//查询中名字包含xxx的,就像sql中 like '%xxx%'
//        UserInfo u = null;
//        u=userInfoMapper.selectOne(queryWrapper);

        //这个是直接用Mybatis Plus自带的查询
        UserInfo u = null;
        u=this.lambdaQuery().like(UserInfo::getName,name).last("LIMIT 1").one();//查询中名字包含xxx的,就像sql中 like '%xxx%',可能返回多个数据,所以限制为1个

        if(u==null){
            u=new UserInfo();
            u.setName("不存在的");
            u.setUid(-1);
            u.setAge(200);
        }
        return u;
    }

}

UserController.java

package xyz.ygmx.test.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import xyz.ygmx.test.user.entity.UserInfo;
import xyz.ygmx.test.user.services.IUserService;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private IUserService userService;

//    @GetMapping("getuser")
//    public User getUserInfo(){
//        User user = new User();
//        user.setUid(1);
//        user.setUsername("喵喵喵");
//        return user;
//    }
//    @GetMapping("setuser")
//    public User setUserInfo(User user){
//
//        return user;
//    }

    //通过名字查询用户
    @GetMapping("getuserbyname/{username}")
    public UserInfo getUserByName(@PathVariable String username){
        UserInfo ui = userService.getByName(username);

        return ui;
    }

    //这个是通过Mapper创建的用户
    @GetMapping("createuserbymapper")
    public  int createUser_1(UserInfo userInfo){
        int res=userService.createUserByMapper(userInfo);
        return res;
    }
    //通过 MybatisPlus 自带的方法创建用户
    @GetMapping("createuserbyplus")
    public  boolean createUser_2(UserInfo userInfo){
        boolean res=userService.createUser(userInfo);
        return res;
    }

    //通过 MybatisPlus 自带方法修改用户
    @GetMapping("edituserbyplus")
    public boolean editUserByPlus(int uid,String newName){
        boolean res=userService.editUserByPlus(uid,newName);
        return res;
    }
    //通过 Mapper 修改用户
    @GetMapping("edituserbymapper")
    public int editUserByMapper(int uid,String newName){
        int res=userService.editUserByMapper(uid,newName);
        return res;
    }
    //通过MybatisPlus自带方法删除用户
    @GetMapping("deleteuserbyplus")
    public boolean editUserByPlus(int uid){
        boolean res=userService.deleteUserByPlus(uid);
        return res;
    }
    //通过MybatisPlus自带方法删除用户
    @GetMapping("deleteuserbymapper")
    public int editUserByMapper(int uid){
        int res=userService.deleteUserByMapper(uid);
        return res;
    }
}

4、拓展一下

QueryWrapper UpdateWrapper 方法对照表(常用比较)

方法
含义示例对应sql
eq
等于eq(UserInfo::getName, "张三");
`name`='张三'
ne不等于ne(UserInfo::getName, "张三");`name`<>'张三'
gt大于gt(UserInfo::getAge, 20);`age`>20
lt小于lt(UserInfo::getAge, 20);`age`<20
ge大于等于ge(UserInfo::getAge, 20);`age`>=20
le小于等于le(UserInfo::getAge, 20);`age`<=20
between在区间内between(UserInfo::getAge, 20,30);`age`>=20 and `age`<=30
like模糊匹配(包含“张”的)like(UserInfo::getName, "张");`name` like '%张%'
likeRight模糊匹配(以“张”开头的)likeRight(UserInfo::getName, "张");`name` like '张%'
likeLeft模糊匹配(以“三”结尾的)likeLeft(UserInfo::getName, "三");`name` like '%三'



微信扫码查看本文
本文地址:https://www.yangguangdream.com/?id=2251
版权声明:本文为原创文章,版权归 编辑君 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?