• Mybatis Generator 使用com.mysql.cj.jdbc.Driver遇到的问题


    Mybatis Generator 使用com.mysql.cj.jdbc.Driver遇到的问题

    今天闲来无事,准备搭一套SSM的环境,当然所有的jar包都用最新的。 Mybatis使用3.4.6,Mysql使用最新的8.0,mysql-connector-java用的8.0.11。

    安装好数据库后,新建了一个test库,并创建了一张user表。配置好Mybatis的配置文件,如下:

    <?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>
    
    <!-- 指定数据连接驱动jar地址 -->
    <classPathEntry location="D:.m2
    epositorymysqlmysql-connector-java8.0.11mysql-connector-java-8.0.11.jar" />
    
    <!-- 一个数据库一个context -->
    <context id="infoGuardian" targetRuntime="MyBatis3DynamicSql">
        <!-- 注释 -->
        <commentGenerator >
            <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
            <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳-->
        </commentGenerator>
    
        <!-- jdbc连接 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf8
                        &serverTimezone=Asia/Shanghai"
                        userId="root"
                        password="xxxxx" />
    
        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
    
        <!-- 生成实体类地址 -->
        <javaModelGenerator targetPackage="com.example.xxx.model"
                            targetProject="srcmainjava" >
            <property name="enableSubPackages" value="false"/>
            <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
    
        <!-- 生成mapxml文件 -->
        <sqlMapGenerator targetPackage="mybatis"
                         targetProject="srcmain
    esources" >
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
    
        <!-- 生成mapxml对应client,也就是接口dao -->
        <javaClientGenerator targetPackage="com.example.xxx.dao"
                             targetProject="srcmainjava" type="XMLMAPPER" >
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        
        <table tableName="user" domainObjectName="User"></table>
    
    </context>
    </generatorConfiguration>

    安装好Mybatis Generator的maven插件后,直接运行,运行后,生成了UserUser.java.1两个文件,打开一看, User是test库中的表,只有4个字段,而User.java.1则是mysql库(Mysql的系统用户库)中的user表。怎么会扫描了两个 库(mysql和test)?再看看我的connectionURL,确实指到了/test了,怎么会扫描mysql库呢? 于是我翻阅资料,终于找到了问题。org.mybatis.generator.internal.db.DatabaseIntrospector的509行,代码如下:

    ResultSet rs = databaseMetaData.getColumns(localCatalog, localSchema,
                    localTableName, "%");

    变量localCatalog是上面配置文件中table中的元素,我们并没有配置,这里localCatalog是null,在底层会执行SHOW DATABASES 得到所有的数据库,但是我们已经在connectionURL="jdbc:mysql://localhost:3306/test?useSSL=false&amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai" 中指定了数据test呀,查看源码发现在连接中少配置了一个属性nullCatalogMeansCurrent=true,加上这个属性,再执行,就没有问题了。

    尤其是使用com.mysql.cj.jdbc.Driver这个驱动的时候,更要加上这个属性。在项目中不需要加,但是在使用Mybatis Generator时要加上。 com.mysql.cj.jdbc.Driver是mysql官方比较推荐的,旧的驱动com.mysql.jdbc.Driver已经不用了。

  • 相关阅读:
    Nmap参数详解(含扫描参数原理解释)
    为什么服务器突然回复RST——小心网络中的安全设备
    Security+学习笔记
    《HTTPS权威指南》读书笔记——PKI
    [Android 搞机]Twrp 中清除 data 和搞机清除的区别
    [C语言学习笔记五]复合语句和操作符的区分
    [C语言学习笔记四]变量与系统的交互
    [C语言学习笔记三]格式化输出和输入
    [C语言学习笔记二] extern 函数的用法
    [C语言学习笔记一]基本构架和变量
  • 原文地址:https://www.cnblogs.com/boboooo/p/9100991.html
Copyright © 2020-2023  润新知