Mybatis_springboot与mybatis-plus

一 Mybatis_springboot

MyBatis 是一个流行的持久层框架,可以与 Spring Boot 无缝集成。下面是如何在 Spring Boot 项目中使用 MyBatis 的基本步骤。

1. 创建 Spring Boot 项目

你可以使用 Spring Initializr 创建一个新的 Spring Boot 项目。选择以下依赖项:

  • Spring Web
  • MyBatis Framework
  • 数据库(如 H2、MySQL、PostgreSQL 等)

2. 添加依赖

如果你已经创建了项目,可以在 pom.xml(对于 Maven 项目)中添加 MyBatis 和数据库的依赖。例如对于 MySQL:

XML 复制代码
<dependencies>
        <!-- mybatis坐标 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

3. 数据库配置

application.ymlapplication.properties 文件中配置 数据库连接信息。例如,如果使用 MySQL,可以这么配置:

XML 复制代码
#数据源
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/myschool?serverTimezone=GMT
    driver-class-name: com.mysql.cj.jdbc.Driver

4. 创建数据模型

创建一个 Java 类,表示数据库表的结构。例如:

java 复制代码
package com.xn.mybatis_springboot.pojo;

/**
 * @author 许娜
 * @version 1.0
 * @since 2024/8/13
 */
public class Account {
    private int aid;
    private String aname;
    private int amoney;

    @Override
    public String toString() {
        return "Account{" +
                "aid=" + aid +
                ", aname='" + aname + '\'' +
                ", amoney=" + amoney +
                '}';
    }

    public Account(int aid, String aname, int amoney) {
        this.aid = aid;
        this.aname = aname;
        this.amoney = amoney;
    }

    public Account() {
    }

    public int getAid() {
        return aid;
    }

    public void setAid(int aid) {
        this.aid = aid;
    }

    public String getAname() {
        return aname;
    }

    public void setAname(String aname) {
        this.aname = aname;
    }

    public int getAmoney() {
        return amoney;
    }

    public void setAmoney(int amoney) {
        this.amoney = amoney;
    }
}

5. 创建 Mapper 接口

创建 MyBatis 的 Mapper 接口,用于定义 SQL 操作。例如:

java 复制代码
//@Mapper//注册注入一个mapper
public interface AccountMapper {

    @Select("select * from account")
    public List<Account> findAll();
}

java 复制代码
@SpringBootApplication
@MapperScan(basePackages="com.xn.mybatis_springboot.mapper")//注册注入多个mapper(以包为单位)

public class MybatisSpringbootApplication {

    public static void main(String[] args) {

        SpringApplication.run(MybatisSpringbootApplication.class, args);
    }

}

6.测试

java 复制代码
@SpringBootTest
class MybatisSpringbootApplicationTests {

    @Autowired(required=false)
    AccountMapper accountMapper;

    @Test
    void contextLoads() {
        List<Account> all=accountMapper.findAll();
        for (int i=0;i<all.size();i++){
            Account account=all.get(i);
            System.out.println(account);
        }
    }

}

二 mybatis-plus

1.坐标

<dependency>

<groupId>com.baomidou</groupId>

<artifactId>mybatis-plus-boot-starter</artifactId>

<version>3.1.1</version>

</dependency>

注意:mp坐标添加后,mybatis坐标移除

XML 复制代码
        <!-- mybatisPlus坐标 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!-- mybatis坐标 -->
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>2.2.2</version>-->
<!--        </dependency>-->
<!--         mysql -->

2.编写注解配置实体类与关系表映射关系(truncate清空表以及主键)

@TableName(value = "关联表名称")=========================》修饰在类

@TableField(value = "关联字段名称")======================》修饰在属性

exist = "忽略字段"

@TableId(type="指定主键生成策略,默认雪花算法")=============》修饰在属性

AUTO(0),

NONE(1),

INPUT(2),

ASSIGN_ID(3),

ASSIGN_UUID(4);

java 复制代码
@TableName("account")
public class Account {
    @TableId(value = "aid",type= IdType.AUTO)
    private int aid;
    @TableField("aname")
    private String aname;
    @TableField("amoney")
    private int amoney;
}

3.使用

BaseMapper===========》公共的数据访问层

IService/ServiceImp==》公共的业务层

4.配置yml文件

java 复制代码
#数据源
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/myschool?serverTimezone=GMT
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  mapper-locations: mappers/*.xml
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5.测试代码使用

(1)新增

java 复制代码
@SpringBootTest
public class Test01 {

    @Autowired(required = false)
    AccountMapper accountMapper;


    //新增
    @Test
    public void show1(){
        Account account = new Account("夕夕",2000);
        int row = accountMapper.insert(account);
        System.out.println("主键回填id:"+account.getAid());
        System.out.println("影响行数:"+row);
    }
}

(2) 修改

java 复制代码
@SpringBootTest
public class Test01 {

    @Autowired(required = false)
    AccountMapper mapper;
    //修改ID
    @Test
    public void test02()throws Exception{
        Account account = new Account(3,"发发",5000,1,"干饭");
        int row =  mapper.updateById(account);
        System.out.println("影响行数:"+row);
    }
//
//    //修改Name
    @Test
    public void test03()throws Exception{
        //1.修改数据
        Account  account = new Account();
        account.setAhobby("打架");
        //2.创建条件
        QueryWrapper<Account> wrapper = new QueryWrapper<Account>();
        wrapper.eq("aname","毛毛");
        mapper.update(account,wrapper);
    }

}

(3) mp分页使用

注意:

1.page.setCurrent(2);当前页码从1开始

2.分页需要配置插件

3.mp坐标版本3.1.1不能使用过高版本

XML 复制代码
<!-- mybatisPlus坐标 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>
java 复制代码
@Configuration
public class MyBatisPlusConfig {

    //注入mp拦截器
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //1.实例化拦截器
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //2.分页拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }

}
java 复制代码
 /**
     * mp分页使用
     * 注意:
     * 1.page.setCurrent(2);当前页码从1开始
     * 2.分页需要配置插件
     * 3.mp坐标版本3.1.1不能使用过高版本
     * */
    @Test
    public void test08()throws Exception{

        //1.定义分页规则
        Page<Account> page = new Page<Account>();
        page.setSize(3);//每页记录数
        page.setCurrent(2);//当前页码

        //2.查询条件(可选)
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("ahobby","唱歌");

        IPage<Account> iPage = mapper.selectPage(page,null);

        List<Account> list = iPage.getRecords();//分页结果
        System.out.println("总记录数:"+iPage.getTotal());
        System.out.println("总记页数:"+iPage.getPages());

        for (int i = 0; i < list.size(); i++) {
            Account account =  list.get(i);
            System.out.println(account);
        }
    }

(4)查询

普通查询

java 复制代码
    //查询ID
    @Test
    public void test04()throws Exception{
        Account account = mapper.selectById(5);
        System.out.println(account);
    }
//
    //查询IDS
    @Test
    public void test05()throws Exception{
        List<Account> list = mapper.selectBatchIds(Arrays.asList(5,1,3));
        for (int i = 0; i < list.size(); i++) {
            Account account =  list.get(i);
            System.out.println(account);
        }
    }

QueryWrapper

QueryWrapper 是 MyBatis-Plus 中常用的一个工具类,用于构建 SQL 查询条件的方式。它提供了链式调用的方法来设置查询条件,使得代码更加简洁、易读。

java 复制代码
//查询count
    @Test
    public void test06()throws Exception{
        int count = mapper.selectCount(null);
        System.out.println(count);
    }

    //查询list
    @Test
    public void test07()throws Exception{
        QueryWrapper<Account> queryWrapper = new QueryWrapper();
//        queryWrapper.eq("aage","11");
//        queryWrapper.eq("ahobby","唱歌");
        queryWrapper.eq("ahobby","唱歌").or().eq("aage","11");
        List<Account> list = mapper.selectList(queryWrapper);
        for (int i = 0; i < list.size(); i++) {
            Account account =  list.get(i);
            System.out.println(account);
        }
    }
LambdaQueryWrapper
java 复制代码
 @Test
    public void show1(){
        //1.查询条件
        LambdaQueryWrapper<Account> lambdaQueryWrapper =  new LambdaQueryWrapper<Account>();
        lambdaQueryWrapper.gt(Account::getAage,12);
        //2.查询
        List<Account> list =  mapper.selectList(lambdaQueryWrapper);
        for (int i = 0; i < list.size(); i++) {
            Account account =  list.get(i);
            System.out.println(account);
        }
    }

模拟动态查询

java 复制代码
//模拟动态查询1
    @Test
    public void show2(){
        //1.前端发送来的数据
        Integer num1 = null;
        Integer num2 = 15;

        //1.查询条件
        LambdaQueryWrapper<Account> lambdaQueryWrapper =  new LambdaQueryWrapper<Account>();
        //2.判断
        if(null != num2){
            lambdaQueryWrapper.lt(Account::getAage,num2);
        }
        if(null != num1){
            lambdaQueryWrapper.gt(Account::getAage,num1);
        }
        //3.查询
        List<Account> list =  mapper.selectList(lambdaQueryWrapper);
        for (int i = 0; i < list.size(); i++) {
            Account account =  list.get(i);
            System.out.println(account);
        }
    }

    //模拟动态查询2
    @Test
    public void show3(){
        //1.前端发送来的数据
        Integer num1 = null;
        Integer num2 = 15;

        //1.查询条件
        LambdaQueryWrapper<Account> lambdaQueryWrapper =  new LambdaQueryWrapper<Account>();
        //2.判断
        lambdaQueryWrapper.lt(null != num2,Account::getAage,num2);
        lambdaQueryWrapper.gt(null != num1,Account::getAage,num1);
        //3.查询
        List<Account> list =  mapper.selectList(lambdaQueryWrapper);
        for (int i = 0; i < list.size(); i++) {
            Account account =  list.get(i);
            System.out.println(account);
        }
    }

投影查询-字段查询

java 复制代码
//投影查询-字段查询
    @Test
    public void show4() {
        //1.条件
        LambdaQueryWrapper<Account> lambdaQueryWrapper  = new LambdaQueryWrapper<Account>();
        lambdaQueryWrapper.select(Account::getAname,Account::getAhobby);

        //2.查询
        List<Account> list =  mapper.selectList(lambdaQueryWrapper);
        //4.遍历
        for (int i = 0; i < list.size(); i++) {
            Account account =  list.get(i);
            System.out.println(account);
        }
    }

(5)删除

逻辑删除:

为数据设置是否可用状态字段,删除时设置状态字段为不可用状态, 数据保留在数据库中,执行的是update操作

实现步骤:

步骤1:修改数据库表添加`deleted`列,比如`0`代表正常,`1`代表删除,可以在添加列的同时 设置其默认值为`0`正常。

步骤2:实体类添加属性以及注解 @TableLogic(value="0",delval="1") private Integer deleted; value为正常数据的值,delval为删除数据的值 逻辑删除

java 复制代码
//查询delete
    @Test
    public void test09()throws Exception{
        mapper.deleteById(4);
    }

物理删除:

业务数据从数据库中丢弃,执行的是delete操作

java 复制代码
 //查询delete
    @Test
    public void test09()throws Exception{
        mapper.deleteById(3);
    }
相关推荐
也无晴也无风雨33 分钟前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
2401_857610034 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
颜淡慕潇5 小时前
【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
后端·云原生·容器·kubernetes·问题解决
CoderJia程序员甲5 小时前
重学SpringBoot3-整合 Elasticsearch 8.x (三)使用Repository
java·大数据·spring boot·elasticsearch
荆州克莱5 小时前
Mysql学习笔记(一):Mysql的架构
spring boot·spring·spring cloud·css3·技术
独泪了无痕6 小时前
WebStorm 如何调试 Vue 项目
后端·webstorm
怒放吧德德7 小时前
JUC从实战到源码:JMM总得认识一下吧
java·jvm·后端
代码小鑫7 小时前
A025-基于SpringBoot的售楼管理系统的设计与实现
java·开发语言·spring boot·后端·毕业设计
前端SkyRain7 小时前
后端SpringBoot学习项目-项目基础搭建
spring boot·后端·学习