当前位置:首页 > 编程教程 > java技术文章 > Mybatis逆向工程中使用Mysql8.0版本驱动

解决Mybatis逆向工程中使用Mysql8.0版本驱动遇到的问题

  • 发布时间:
  • 作者:码农之家
  • 点击:274

这篇文章主要知识点是关于Mysql8、Mybatis逆向工程、Mybatis、Mysql8.0驱动问题、mybatis连接MySQL8出现的问题解决方法 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

神经网络算法与实现 基于Java语言
  • 类型:神经网络大小:32 MB格式:PDF作者:法比奥
立即下载

Mybatis逆向工程中使用Mysql8.0版本驱动

前言

今天在使用 8.0.12 版的 mysql 驱动时遇到了各种各样的坑,在使用 JDBC 连接上遇到的问题可以参考我的上一篇博客。我在使用 mybatis 逆向工程生成各种 mapper , pojo , dao 时,遇到了一个困惑我好几个小时的错误,这个错误是

Result Maps collection already contains value for BaseResultMap

产生这个错误可能有各种原因。但是这里我只说我的原因及解决过程。

初步探索

我在网上查阅了大量的博客文章,对于产生这类错误的原因最多的是:生成了多次 mapper , dao 以及 pojo 文件。也就是多次运行了生成这些文件的方法。造成 XXXmapper.xml 中出现了重复的 resultmap 。但是我这里把这些文件删除后,再重新生成还是会报这个错。所以肯定不是多次生成的问题。

于是我打开了出现问题的那个 Mapper.xml 文件,搜索 BaseResultMap 发现其作为 resultMap 的 id 居然出现了三次,还有很多其他的 sql 标签的 id 也有很多重复的。我将这些重复的都删除,再次运行,成功了,没有出现错误。而且利用这些生成的 mapper 做后面的功能也没有任何问题。这就非常奇怪,为什么会多生成这些代码呢,我继续在网上找相关的文章。

深入探索

好不容易找到一篇博客中提到 :升级到 mysql 8.0 驱动后的使用 mybatis 逆向工程生成的文件或不一样,具体的怎么不一样也没有说。看到这里,我猜会不会是驱动版本造成的,于是我将 pom.xml 里的 mysql 驱动版本调整到了 5.1.10。删干净文件,再次生成后,发现之前出错的那个 mapper.xml 里的 以 BaseResultMap 作为 id 的 resultMap 只有一个了,其他的 resultMap 中 id 也是唯一的。为了检验这次生成的到底有没有用。我启动 Tomact 运行程序。发现正常启动,后续的功能也没有问题。

最终解决

但是如果使用 5.0 版本的驱动连接 mysql 8.0 在项目中可能会遇到难以预料的问题,所以我并没有就此将驱动版本改变。我继续在网上通过换各种关键词来搜寻解决方案。几个小时过去了,还是没有任何结果。最后被迫去看了 [MyBatis Generator] 的官方英文文档。中文文档已经看过了,没有找到相关的内容。在阅读英文文档中,我在Database Specific Information (使用注意事项)下面的 mysql使用注意事项 中似乎找到了相关的内容。其原内容如下:

If you are using version 8.x of Connector/J you may notice that the generator attempts to generate code for tables in the MySql information schemas (sys, information_schema, performance_schema, etc.) This is probably not what you want! To disable this behavior, add the property “nullCatalogMeansCurrent=true” to your JDBC URL.

For example:

  <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost/my_schema"
      userId="my_user" password="my_password">
    <property name="nullCatalogMeansCurrent" value=true" />
  </jdbcConnection>

上面的英文文档翻译过来就是:

如果您使用的是Connector / J的8.x版,您可能会注意到生成器尝试为MySql信息模式(sys,information_schema,performance_schema等)中的表生成代码。这可能不是您想要的! 要禁用此行为,请将属性“nullCatalogMeansCurrent = true”添加到JDBC

的确,我发现使用 8.0 版的驱动比使用 5.0 版时不仅 mapper.xml 文件中多生成了好多代码,而且还多生成了一个 xxxWithBLOBs 的 pojo 文件。虽然还是不太理解上面说的问题,但是我还是添加 nullCatalogMeansCurrent 属性。然后重新生成了相关的 mapper , pojo , dao 。打开之前出现问题的 mapper.xml 文件,和使用 5.0 版的驱动生成的代码一样,以 BaseResultMap 作为 id 的 resultMap 只有一个了。再次启动 Tomact,成功启动,没有任何问题,测试其他业务功能,也没有任何问题。

mybatis连接MySQL8出现的问题解决方法

使用MySQL8,在整合ssm框架,用mybatis逆向工程生成的代码测试时,执行到数据库查询前均正常,但进行查询时,便卡主没有反应了,设置了日志、try catch等也不报错,页面就在那一直转,之前mybatis自动生成代码都是正常的,然后在测试类中,使用Connection进行连接测试并查询数据库,也是能够正常查询到数据的:

Connection conn = null;
try {
  String userName = "root";
  String password = "111@tesT";
  String jdbcurl = "jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&autoReconnect=true&characterEncoding=UTF-8";
  Class.forName("com.mysql.jdbc.Driver").newInstance();
  conn = DriverManager.getConnection(jdbcurl, userName, password);
  String sql = "select * from tb_user";
  PreparedStatement pstmt = conn.prepareStatement(sql);
  ResultSet rs = pstmt.executeQuery();
  String result = "";
  while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("username");
    String status = rs.getString("phone");
    result += id + "\t" + name + "\t" + status + "\n";
  }
  System.out.println(result);

而逆向工程的却不行:

UserExample example = new UserExample();
UserExample.Criteria criteria = example.createCriteria();
criteria.andIdEqualTo(userId);
List<User> list = userMapper.selectByExample(example);//这一步进去后就出不来了。。。

经过确认ssm其他配置文件都没有发现有问题,然后就想是不是自己用的MySQL8版本的问题,毕竟之前使用Navicat连接MySql8也是出了好几个问题,于是便将mysql-connect-java版本由5.1.6升级为8.0.11,并修改了db.properties文件:

#数据库连接 注意 文件内不要留有空格
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT
jdbc.username=root
jdbc.password=111@tesT

重启项目后,一切终于正常了。。。。。。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

相关电子书
学习笔记
网友NO.621882

mysql+spring+mybatis实现数据库读写分离的代码配置

场景:一个读数据源一个读写数据源。 原理:借助spring的【 org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource 】这个抽象类实现,看名字可以了解到是一个路由数据源的东西,这个类中有一个方法 /** * Determine the current lookup key. This will typically be * implemented to check a thread-bound transaction context. * pAllows for arbitrary keys. The returned key needs * to match the stored lookup key type, as resolved by the * {@link #resolveSpecifiedLookupKey} method. */ protected abstract Object determineCurrentLookupKey(); 每次去连数据库的时候,spring会调用这个方法去找对应的数据源。返回值即对应的数据源的LookUpKey.那么这个LookUpKey在哪定义的呢?看下面的 dataBase.xml 的配置 !--数据源 读写 -- bean id="dataSourceRW" class="org.logicalcobwebs.proxool.ProxoolDataSource" property name="alias" value="ihotelRW"/property property name="delegateProperties" valueuser=……

网友NO.148031

Mybatis应用mysql存储过程查询数据实例

1.创建mysql存储过程,这是个复杂查询加上了判断,比较复杂 CREATE PROCEDURE searchAllList (IN tradingAreaId VARCHAR (50),IN categoryName VARCHAR (100),IN intelligenceSort TINYINT UNSIGNED,IN priceBegin DOUBLE,IN priceEnd DOUBLE,IN commodityName VARCHAR (200),IN flag TINYINT UNSIGNED)BEGINIF flag = 0 THENSELECTB.user_business_id businessId,B.shop_name,B.total_score,B.shop_logo,B.average_consume,D.category_name,B.shop_addressFROMuser_business_commodity ALEFT JOIN user_business B ON B.user_business_id = A.user_business_idLEFT JOIN user_business_category C ON C.business_id = B.user_business_idLEFT JOIN service_category D ON D.category_id = C.category_one_idWHERE1 = 1ANDIF (categoryName IS NOT NULLAND LENGTH(TRIM(categoryName)) 0,D.category_name = categoryName,1 = 1)ANDIF (priceBegin != 0,B.average_consume = priceBegin,1 = 1)ANDIF (priceEnd != 0,B.average_consume = priceEnd,1 = 1)ANDIF (commodityName IS NOT NULLAND LENGTH(TRIM(commodityName)) 0,A. NAME LIKE concat('%', ……

网友NO.309827

mybatis连接MySQL8出现的问题解决方法

使用MySQL8,在整合ssm框架,用mybatis逆向工程生成的代码测试时,执行到数据库查询前均正常,但进行查询时,便卡主没有反应了,设置了日志、try catch等也不报错,页面就在那一直转,之前mybatis自动生成代码都是正常的,然后在测试类中,使用Connection进行连接测试并查询数据库,也是能够正常查询到数据的: Connection conn = null;try { String userName = "root"; String password = "111@tesT"; String jdbcurl = "jdbc:mysql://localhost:3306/test?useUnicode=trueautoReconnect=true Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(jdbcurl, userName, password); String sql = "select * from tb_user"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); String result = ""; while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("username"); String status = rs.getString("phone"); result += id + "\t" + nam……

网友NO.164691

mybatis mysql delete in操作只能删除第一条数据的方法

出现的Bug 如图,我开始复制delete语句和参数到数据库执行,删除两条数据,但是后台执行确只删除一条数据,当时表示一脸懵逼 分析原因 分析原因 如图,正确的参数传值应该是这样的,聪明的同学,应该就知道哪里错了 解决问题 解决问题 我就不贴开始的代码了,直接贴解决bug的代码 mybatis中的代码 !-- 批量删除-- delete id="deleteByIds" parameterType="int[]" ![CDATA[ DELETE FROM p_customer WHERE customerId in ]] foreach collection="array" item="arr" index="no" open="(" separator="," close=")" #{arr} /foreach /delete controller中的代码 /** * 删除和批量删除 */ @RequestMapping(value = "/del", method = RequestMethod.POST, produces = { MediaType.APPLICATION_JSON_VALUE }) public ResponseEntityPCustomerVo delete(@RequestParam String customerId) throws Exception { //获取批量删除的id,去掉最后一个“,” customerId=customerId.substring(0,customerId.length()-1); Stri……

<
1
>

Copyright 2018-2020 xz577.com 码农之家

本站所有电子书资源不再提供下载地址,只分享来路

版权投诉 / 书籍推广 / 赞助:QQ:520161757