标签分类
技术文章
当前位置:主页 > 计算机编程 > java > Mybatis逆向工程中使用Mysql8.0版本驱动

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

  • 发布时间:
  • 作者:码农之家原创
  • 点击:224

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

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

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

更多相关的学习资源可以参阅 程序设计电子书Java视频Java电子书、等栏目。

前言

今天在使用 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

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

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

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到儿童python编程入门书籍推、 vue项目中使用md5加密以及、 解决axios.interceptors.respon、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:SpringCloud实现简单的微服务架构方法

下一篇:自定义BufferedReader中read和readLine方法

展开 +

收起 -

学习笔记
网友NO.534811

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=${jdbc.username},password=${jdbc.password} /value /property property name="user" value="${jdbc.username}" / property name="password" value="${jdbc.password}" / property name="driver" value="${jdbc.driverClassName}" / property name="driverUrl" value="${jdbc.url}" / property name="maximumConnectionCount" value="${jdbc.maximumConnectionCount}"/property property name="maximumActiveTime" value="${jdbc.maximumActiveTime}"/property property name="maximumConnectionLifetime" value="${jdbc.maximumConnecti……

网友NO.977999

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('%', commodityName, '%'),1 = 1)AND B.is_delete = 0AND B.shop_setup_state = 1AND A.is_delete = 0AND C.is_delete = 0AND D.is_delete = 0GROUP BYA.user_business_idORDER BYCASE intelligenceSortWHEN 1 THEN'B.total_order DESC'WHEN 2 THEN'B.total_score DESC'WHEN 3 THEN'B.create_time DESC'ELSE'B.create_time ASC'END;ELSESELECTB.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_busine……

网友NO.879013

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" + name + "\t" + status + "\n"; } System.out.println(result); 而逆向工程的却不行: UserExample example = new UserExample();UserExample.Criteria criteria = example.createCriteria();criteria.andIdEqualTo(userId);ListUser list = userMapper.selectByExample(example);//这一步进去后就出不来了。。。 经过确认ssm其他配置文件都没有发现有问题,然后就想是不是自己用的MySQL8版本的问题,毕竟之前使用Navicat连接MySql8也是出了好几个问题,于是便……

网友NO.978686

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); String[] strarr=customerId.split(","); int[] arr=new int[strarr.length]; for(int i=0;istrarr.length;i++){ arr[i]=Integer.parseInt(strarr[i]); } pcustomerService.deletes(arr); return new ResponseEntity(HttpStatus.OK); } 总结 以上所述是小编给大家介绍的mybatis mysql delete in操作只能删除第一条数据,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持! ……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明