springBoot整合mybatis druid P6Spy 打印可执行sql

最近开发环境的不打印执行sql,但是我又不知道是哪个地方配置错误,因为不是自己搭的,所以打算自己重新搭建一下springBoot整合mybatis。顺便记录一下。

总共分为三个部分

SpringBoot 集成mybatis

新建项目

  1. idea 中选择 mybatis jdbc 2个 (下图的 mysql 可以不选)

    注意:我这里的项目 都是在test中运行的,所以没选web模块,因为没必要

在这里插入图片描述

  1. 或者直接pom.xml中引入如下配置

     	 	<dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.4</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
    		
    <!--            测试组件-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
    .....
     <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
    <!--            mybatis generator maven插件-->
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <configuration>
                        <verbose>true</verbose>
                        <overwrite>true</overwrite>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

配置数据库连接

新建application.yml,配置如下

spring:
  messages:
    basename: i18n/Messages,i18n/Pages
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource #durid数据源
    url: jdbc:mysql://localhost:3306/chat?serverTimezone=UTC           # 数据库连接地址
    username: root                                  # 数据库用户名
    password:                            # 数据库连接密码
    driver-class-name:  com.mysql.cj.jdbc.Driver
mybatis:
  type-aliases-package:   com.demo.myspringbootmybatis.entity #模型所在的包名
  mapper-locations: classpath*:/mybatis/mapper/*Mapper.xml   #映射文件路径
  configuration:
    call-setters-on-nulls: true # 返回Map集合时,针对空值字段强行返回

引入mybatis-generator

新建generator.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 配置生成器 -->
<generatorConfiguration>

    <!--classPathEntry:数据库的JDBC驱动,换成你自己的驱动位置 可选 -->
    <classPathEntry
            location="绝对路径/mysql-connector-java-8.0.12.jar"/>

    <!-- 一个数据库一个context -->
    <context id="DB2Tables" targetRuntime="Mybatis3">



        <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖 -->
        <property name="autoDelimitKeywords" value="true"/>

        <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="utf-8"/>

        <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 格式化java代码 -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>

        <!-- 格式化XML代码 -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>

        <!--配置生成注释信息,最多配置一个 -->
        <commentGenerator>
            <!-- 阻止生成注释包含时间戳 默认为false -->
            <property name="suppressDate" value="true"/>
            <!-- 注释是否添加数据库表的备注信息 默认为false -->
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>

        <!-- jdbc连接-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/chat?serverTimezone=UTC&amp;nullCatalogMeansCurrent=true"
                        userId="root"
                        password="123456"/>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 实体类生成的位置 -->
        <javaModelGenerator
                targetPackage="com.demo.myspringbootmybatis.entity"
                targetProject=".\src\main\java">
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- *Mapper.xml 文件的位置  sqlMapGenerator-->
        <sqlMapGenerator
                targetPackage="mybatis/mapper"
                targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- Mapper 接口文件的位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.demo.myspringbootmybatis.mapper"
                             targetProject=".\src\main\java">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 相关表的配置 -->
        <!-- table可以有多个,每个数据库中的表都可以写一个table,tableName表示要匹配的数据库表,也可以在tableName属性中通过使用%通配符来匹配所有数据库表,只有匹配的表才会自动生成文件 enableSelectByPrimaryKey相应的配置表示是否生成相应的接口 -->
        <table tableName="MyUser" enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="true"
               enableSelectByPrimaryKey="true"
               selectByExampleQueryId="false">
        </table>

    </context>
</generatorConfiguration>

注意 以下配置自己修改:

1.JDBC驱动 自己替换

2.jdbc连接 数据库地址 密码

3.实体类生成的位置 *Mapper.xml 文件的位置 Mapper 接口文件的位置 自己替换

4.table标签改为自己的表名

使用mybatis -generator 自动生成代码

在这里插入图片描述

解决警告Cannot obtain primary key information from the database, generated objects may be incomplete

这个是使用过程遇到的问题,他会导致生成的mapper文件,没有selectByPrimaryKey方法。

解决方法:generator.xml中修改链接mysql的url,添加nullCatalogMeansCurrent=true,如下

  <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/chat?serverTimezone=UTC&amp;nullCatalogMeansCurrent=true"
                        userId="root"
                        password=""/>

测试

@SpringBootTest(classes = MyspringbootmybatisApplication.class)
@WebAppConfiguration
class MyspringbootmybatisApplicationTests {
    @Resource
    private DataSource dataSource;

    @Test
    public void testConnection() throws Exception {
        System.out.println(this.dataSource.getClass() );
        System.out.println(this.dataSource );
        System.out.println(this.dataSource.getConnection() );
    }

    @Resource
    private MyuserMapper myuserMapper;
    @Resource
    private UserDao userDao;
    @Test
    public void testMapper() throws Exception {
            //testMapper 运行成功说明 mybatis 和mybatis generator插件集成成功
        System.out.println(myuserMapper.selectByPrimaryKey(1));
    }
    @Test
    public void testDao() throws Exception {
        //testDao 运行成功说明 mybatis 配置没问题
        System.out.println(userDao.selectByPrimaryKey(1));

    }
}

运行 testConnection 就成功就说明 连接是通的,如下:

class com.zaxxer.hikari.HikariDataSource
HikariDataSource (null)
2020-11-28 20:25:15.903  INFO 31412 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-11-28 20:25:16.206  INFO 31412 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
HikariProxyConnection@2098830440 wrapping com.mysql.cj.jdbc.ConnectionImpl@63411512

打印可执行sql

探究了一下打印可执行sql ,发现打印sql ,mybatis 的只能做到 打印时 带?,参数另行打印,要打印执行sql,只能通过

如下两种方式:

一.更换数据源为durid

druid 是阿里的开源 连接池,他有很多其他功能,这里主要用他来打印可执行sql

首先引入包

   <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

修改application.xml

spring:
  messages:
    basename: i18n/Messages,i18n/Pages
  datasource:
    #1. durid数据源
    type: com.alibaba.druid.pool.DruidDataSource 
    url: jdbc:mysql://localhost:3306/chat?serverTimezone=UTC           # 数据库连接地址
    username: root                                  # 数据库用户名
    password:  密码                           # 数据库连接密码
    driver-class-name:  com.mysql.cj.jdbc.Driver
   # 配置打印sql配置 
    druid:
      filters: slf4j
      filter:
        slf4j:
          enabled: true  #开启日志
          statement-log-enabled: false #这里不配置的话 sql会被重复打印
          statement-executable-sql-log-enable: true #打印执行sql的
mybatis:
  type-aliases-package:   com.demo.myspringbootmybatis.entity #模型所在的包名
  mapper-locations: classpath*:/mybatis/mapper/*Mapper.xml   #映射文件路径
logging:
  level:
    druid:
      sql:
        Statement: debug  # 这里也很重要 这里就是将sql的打印级别调整为debug
采坑点

1.引入druid之后千万别自己写config类,自己在new 一个 druid数据源,这样会导致 yml中关于druid的配置完全不起作用,毕竟springBoot的配置加载优先级 代码里的是比配置文件的要高。

2.SpringBoot的默认日志框架是 logback,但是slf4j是日志统一接口,logback是slf4j的实现,所以druid的官方文档中没有logback的配置。只有slf4j的配置。 下面是官方文档中关于配置可执行sql的文档链接:

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter

测试:运行上面的testDao或testMapper输出:

2020-11-28 20:57:06.867 DEBUG 5944 --- [           main] druid.sql.Statement                      : {conn-10001, pstmt-20000} executed. select id, aid, tel, `name`, f
	, createTime
from myuser
where id = 1
Myuser [Hash = 1594981181, id=1, aid=2, tel=null, name=233, f=null, createtime=null, serialVersionUID=1]

可以看到打印出来,可直接执行的sql

二.使用p6spy进行可执行sql打印

这个信息是来自mybatis-plus,在浏览其官方网站时发现的

与druid不同 只需要

1.引入jar包

        <dependency>
            <groupId>p6spy</groupId>
            <artifactId>p6spy</artifactId>
            <version>3.7.0</version>
        </dependency>

2.修改application.yml

url 中间要加p6spy
driver要改成 com.p6spy.engine.spy.P6SpyDriver

spring:
  messages:
    basename: i18n/Messages,i18n/Pages
  datasource:
    # 1.url 中间要加p6spy
    url: jdbc:p6spy:mysql://localhost:3306/chat?serverTimezone=UTC           # 数据库连接地址
    username: root                                  # 数据库用户名
    password: # 数据库连接密码
    #2.driver要改成 com.p6spy.engine.spy.P6SpyDriver
    driver-class-name:   com.p6spy.engine.spy.P6SpyDriver
mybatis:
  type-aliases-package:   com.demo.myspringbootmybatis.entity #模型所在的包名
  mapper-locations: classpath*:/mybatis/mapper/*Mapper.xml   #映射文件路径

3.resource下添加spy.properties

appender=com.p6spy.engine.spy.appender.StdoutLogger

4.测试

运行testDao可以看到也同样输出了可执行sql

1606570278590|13|statement|connection 0|select                   id, user_name, password, age               from user_t         where id = ?|select                   id, user_name, password, age               from user_t         where id = 1
User{id=1, userName='b', password='b,b', age=101}

项目地址:

https://gitee.com/LylYorick/myspringbootmybatis

参考资料:

https://www.cnblogs.com/hankuikui/p/10150205.html

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值