【SpringBoot】整合Mybatis-Plus并输出SQL日志

news2025/5/24 18:56:51

目录

  • 本地开发环境说明
  • pom.xml主要依赖
  • application.yml主要配置
  • @MapperScan注解使用说明
  • 实体类示例
  • Mapper接口示例
  • Service接口示例
  • Service接口实现类示例
  • 单元测试示例
  • 打印SQL日志
    • 使用slf4j打印SQL
  • 总结

本地开发环境说明

开发依赖版本
Spring Boot3.0.6
Mybatis-Plus3.5.3.1
JDK20

pom.xml主要依赖

    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
    </dependency>
    <!-- 根据需要修改数据库 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>
</dependencies>

application.yml主要配置

debug: true
logging:
  level:
    root: debug

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:tcp://localhost/D:/ProgramFiles/h2database/data/test;MODE=MYSQL;
    username:
    password:

mybatis-plus:
  # 所有实体类所在包路径
  type-aliases-package: com.wen3.**.po
  # mapper.xmml文件路径,多个使用逗号分隔
  mapper-locations: classpath*:resources/mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

@MapperScan注解使用说明

@MapperScan注解的作用是用来指定Mapper接口的位置,示例如下

@MapperScan(basePackages = "com.wen3.demo.mybatisplus.dao")
@SpringBootApplication
public class DemoMybatisplusApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoMybatisplusApplication.class, args);
    }
}
  • basePackages一定要指定Mapper接口的包路径,启动的时候Mybatis-Plus会把这个包及子包下的所有接口当做Mapper
  • 比如basePackages的值指定为com.wen3,则会把Service接口也当做Mapper,在调用方法的时候就会报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

实体类示例

package com.wen3.demo.mybatisplus.po;

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.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

/**
 * <p>
 * 
 * </p>
 *
 * @author tangheng
 * @since 2023-05-21
 */
@Getter
@Setter
@Accessors(chain = true)
@TableName("USER")
public class UserPo {

    /**
     * 用户id
     */
    @TableId(value = "USER_ID", type = IdType.AUTO)
    private String userId;

    /**
     * 用户姓名
     */
    @TableField("USER_NAME")
    private String userName;

    /**
     * 用户性别
     */
    @TableField("USER_SEX")
    private String userSex;

    /**
     * 用户邮箱
     */
    @TableField("USER_EMAIL")
    private String userEmail;

    /**
     * 用户账号
     */
    @TableField("USER_ACCOUNT")
    private String userAccount;

    /**
     * 用户地址
     */
    @TableField("USER_ADDRESS")
    private String userAddress;

    /**
     * 用户密码
     */
    @TableField("USER_PASSWORD")
    private String userPassword;

    /**
     * 用户城市
     */
    @TableField("USER_CITY")
    private String userCity;

    /**
     * 用户状态
     */
    @TableField("USER_STATUS")
    private Integer userStatus;

    /**
     * 用户区县
     */
    @TableField("USER_SEAT")
    private String userSeat;
}

Mapper接口示例

package com.wen3.demo.mybatisplus.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wen3.demo.mybatisplus.po.UserPo;

import java.util.Map;

public interface UserMapper extends BaseMapper<UserPo> {

}

Service接口示例

package com.wen3.demo.mybatisplus.service;

import com.wen3.demo.mybatisplus.po.UserPo;

import java.util.Map;

public interface UserService {

    UserPo getById(String userId);
}

Service接口实现类示例

package com.wen3.demo.mybatisplus.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wen3.demo.mybatisplus.po.UserPo;
import com.wen3.demo.mybatisplus.dao.UserMapper;
import com.wen3.demo.mybatisplus.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.Map;

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

    @Override
    public UserPo getById(String userId) {
        LambdaQueryWrapper<UserPo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(UserPo::getUserId, userId);
        return baseMapper.selectOne(queryWrapper);
    }
}

单元测试示例

package com.wen3.demo.mybatisplus.service;

import com.wen3.demo.mybatisplus.MybatisPlusSpringbootTestBase;
import com.wen3.demo.mybatisplus.po.UserPo;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;

import java.util.Map;

import static org.junit.jupiter.api.Assertions.*;

class UserServiceTest extends MybatisPlusSpringbootTestBase {

    @Resource
    private UserService userService;

    @Test
    void getById() {
        String userId = "U11902a8436094248a45dd3821b07e82a1651108484889";
        UserPo testResult = userService.getById(userId);
        log.info("testResult: {}", testResult);
    }
}

打印SQL日志

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  • 加上这段配置后,SQL的日志确实是输出了,在控制台可以看到
    在这里插入图片描述
  • StdOutImpl源码是使用System.out或System.err来打印SQL的
  • SpringBoot默认使用logback日志组件,我们可以使用Mybatis-Plus提供的slf4j实现

使用slf4j打印SQL

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
  • 重启后日志没打印出来,连控制台也没有输出SQL日志
  • 使用slf4j后,日志输出级别就由SpringBoot接管了,SpringBoot默认是INFO级别
  • 修改Mybatis-Plus下的日志为DEBUG,比如: logging.level.com.baomidou.mybatisplus=DEBUG
  • 重启后就能看到日志了

总结

Mybatis-Plus完全兼容Mybatis,如果项目曾经使用的是Mybatis,想要引入Mybatis-Plus,是完成可以的,仅仅是在数据源的处理上有稍微细节的处理,本人在处理MybatisMybatis-Plus方面具有丰富经验,如有需要,欢迎交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/581636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git客户端的使用

1. git 分布式版本控制工具。 具有中央服务器仓库和本地仓库。 客户端下载&#xff1a;GitHub Desktop | Simple collaboration from your desktop 2. git的使用 2.1 修改操作本地仓库的用户信息 2.2 创建本地仓库 左上角&#xff1a;File - New repository 本地的两个仓库…

chatgpt赋能python:Python中4.5/2:浮点数除法的谬误

Python中4.5/2&#xff1a;浮点数除法的谬误 在Python中&#xff0c;当我们尝试对两个整数进行除法运算时&#xff0c;通常可以得到预期的正确结果。但是&#xff0c;当我们的被除数或者除数是浮点数时&#xff0c;可能会遇到令人疑惑的结果。 例如&#xff0c;执行4.5/2的计…

chatgpt赋能python:Python中Delete的用法及其重要性

Python中Delete的用法及其重要性 Python是一种强大的编程语言&#xff0c;它提供了许多强大的工具和API&#xff0c;帮助程序员轻松编写高效的代码。其中&#xff0c;Delete是Python语言中一个非常重要的关键字&#xff0c;用于删除对象和变量。 Delete的用法 Delete作为Pyt…

chatgpt赋能python:Python中IDLE怎么执行代码

Python中IDLE怎么执行代码 介绍 作为一种非常流行的编程语言&#xff0c;Python可以编写各种应用程序&#xff0c;从自动化脚本到网站后端。无论您是一个新手还是一个经验丰富的程序员&#xff0c;您都可能会使用Python编程语言来完成您的工作。 一个好的Python IDE可以大大…

sql的各种排序(order by加asc或者desc、order by加field()加asc或者desc)

sql的各种排序&#xff08;order by加asc或者desc、order by加field()加asc或者desc&#xff09; 1.单字段排序&#xff1b; 【order by】排序&#xff1a;order by后面跟着的字段就是数据的排序字段&#xff1b; &#xff08;1&#xff09;升序排序&#xff1b; 举例&#x…

c++—封装:构造函数、析构函数、成员操作

1. 封装的主要目的是解决代码的维护性问题&#xff0c;经过封装的函数代码独立性高&#xff1b; 2. 封装的演变历史&#xff0c;以栈为例子介绍&#xff1a; ①成员&#xff08;top、data[ ]&#xff09;都在main函数里&#xff0c;动作方法&#xff08;push、pop&#xff09;…

力扣sql中等篇练习(二十八)

力扣sql中等篇练习(二十八) 1 每个城市最高气温的第一天 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT w.city_id,MIN(w.day) day,w.degree FROM Weather w INNER JOIN (SELECT city_id,MAX(degr…

chatgpt赋能python:Python中keys的概述

Python中keys的概述 在Python中&#xff0c;字典&#xff08;dictionary&#xff09;是一种非常常见的数据结构&#xff0c;它由一系列键&#xff08;keys&#xff09;和对应值&#xff08;values&#xff09;组成。键是唯一的&#xff0c;而值可以重复。在字典中&#xff0c;…

Lucene基础学习

一、基础知识 1.Lucene简介 2.入门实例 3.内建Query对象 4.分析器Analyzer 5.Query Parser 6.索引 7.排序 8.过滤 9.概念简介 10.Lucene入门实例 二、Lucene的基础 三、索引建立 1.lucene索引_创建_域选项 2.lucene索引_的删除和更新 3.lucene索引_加权操作和Luke的简单演示…

msvcp140.dll丢失怎么办?msvcp140.dll重新安装的解决方法

msvcp140.dll是微软编译器系统中的一个动态链接库文件&#xff0c;它存储了许多的代码和数据&#xff0c;能帮助计算机程序正常运行。当系统中出现了msvcp140.dll丢失的情况时&#xff0c;则会出现程序无法正常运行的错误。这篇文章将为大家介绍如何解决msvcp140.dll丢失的问题…

WookTeam是一款轻量级的开源在线团队协作工具

产品介绍 English Documentation wookteam 是一款轻量级的在线团队协作工具&#xff0c;提供各类文档工具、在线思维导图、在线流程图、项目管理、任务分发&#xff0c;知识库管理等工具。wookteam 支持团队在线聊天沟通&#xff0c;订阅任务动态实时推送。wookteam 全部开源…

JavaScript实现用while语句来计算1-10的和的代码

以下为实现用while语句来计算1-10的和的程序代码和运行截图 目录 前言 一、用while语句来计算1-10的和 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博文代码可以根据…

chatgpt赋能python:Python中的Dayup:如何用编程实现日益进步?

Python中的Dayup&#xff1a;如何用编程实现日益进步&#xff1f; 在Python编程语言中&#xff0c;Dayup是一个非常受欢迎的概念&#xff0c;它代表了一种积极向上的生活态度&#xff0c;即每天都在不断进步。这一概念起源于一位中国作家的作品&#xff0c;被广泛应用于生活、…

哈希表(模拟散列表 字符串哈希)

目录 一、哈希表的概念二、模拟散列表题目代码实现①拉链法②开放寻址法 三、字符串哈希题目思路注意点代码实现 一、哈希表的概念 哈希表&#xff08;又称为散列表&#xff09;&#xff0c;将一个比较大的值域映射到一个小的范围。 例如有哈希函数 h(x)&#xff0c;将区间 [ …

点到直线距离

点到直线距离最小二乘解释 推倒部分 形象描述是C到AB距离最短&#xff0c;也就是CD最短用数学语言描述是 m i n ∣ ∣ ( B − A ) λ A − C ∣ ∣ min||(B-A) \lambda A - C || min∣∣(B−A)λA−C∣∣ 其中 D ( B − A ) λ A D (B-A) \lambda A D(B−A)λA,其实本质…

c++—断言、异常

一、 断言&#xff0c;主要用于在函数入口处进行参数检查&#xff0c;是否符合参数设置要求&#xff1b; &#xff08;1&#xff09;true&#xff1a;继续执行&#xff1b;false&#xff1a;终止运行&#xff1b; &#xff08;2&#xff09;特点&#xff1a;在程序运行时才能起…

chatgpt赋能python:Python中Decimal模块的使用

Python中Decimal模块的使用 在Python中&#xff0c;用来处理浮点数的内置浮点数类型float&#xff0c;其精度受限于机器上的位数和操作系统的规范。当需要比float类型更高精度的计算时&#xff0c;Python提供了decimal模块。 Decimal模块的导入 from decimal import Decimal…

chatgpt赋能python:Python中的Curdir:介绍与使用

Python中的Curdir: 介绍与使用 Python中的Curdir是一个重要的概念&#xff0c;它表示当前工作目录。Curdir是操作系统中的概念&#xff0c;它在Python中也有着广泛的应用。Curdir不仅仅是一个字符串常量&#xff0c;还是一个有用的属性&#xff0c;通过它我们可以更方便地进行…

34.Mybatis-plus延续

一、Mybatis-Plus。 &#xff08;1&#xff09;ActiveRecord。 简介&#xff1a;ActiveRecord 是一种常见的设计模式之一。ActiveRecord 是一种面向对象的数据库操作模式&#xff0c;它将数据库表映射为类&#xff0c;将表中的行映射为对象。在 ActiveRecord 模式中&#xff…

LAMP安装部署

文章目录 一、LAMP平台与编译安装二、安装部署apache服务三、安装部署MySQL四、安装部署php 一、LAMP平台与编译安装 &#xff08;一&#xff09;、LAMP平台概述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整台系统和相关软件&#xff0c;能够提…