常规SSM框架开发中,mybatis遇到的坑是最多的,把以下几点坑记录下来防止以后再遇到同样的情况。

1、mybatis 若果在mapper中返回值没有配置resultMap而是使用resultType直接返回的话,那么当心默认配置中的驼峰匹配规则,参考以下配置文件。该情况适用于bean属性字段和数据库完全一致且字段名带有下划线如(user_menu)这样的字段时

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><setting name="callSettersOnNulls" value="true"/><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="true"/><setting name="multipleResultSetsEnabled" value="true"/><setting name="useColumnLabel" value="false"/><setting name="useGeneratedKeys" value="false"/><setting name="autoMappingBehavior" value="PARTIAL"/><setting name="defaultExecutorType" value="SIMPLE"/><!-- 禁用掉驼峰规则,不然实体类带下划线的都匹配不上 --><setting name="mapUnderscoreToCamelCase" value="false"/><setting name="localCacheScope" value="SESSION"/><setting name="jdbcTypeForNull" value="NULL"/><setting name="autoMappingUnknownColumnBehavior" value="FAILING"/><!--自定义日志类--><setting name="logImpl" value="main.com.log.MyBatisLogImpl" /> </settings><typeAliases><typeAlias alias="Integer" type="java.lang.Integer"/><typeAlias alias="Long" type="java.lang.Long"/><typeAlias alias="String" type="java.lang.String"/><typeAlias alias="HashMap" type="java.util.HashMap"/><typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/><typeAlias alias="ArrayList" type="java.util.ArrayList"/><typeAlias alias="LinkedList" type="java.util.LinkedList"/><!-- 自定义实体类 --></typeAliases>
</configuration>

2、mybatis想要打印sql,如果按照常规配置是无法打印的,

如果这样配置,sql可以打印,但是无法进入文件。

<setting name="logImpl" value="STDOUT_LOGGING " />

或者

<setting name="logImpl" value="SLF4J" />

但是有时候会失效

因为本人使用logback做日志管理,因此也无法用log4j来实现sql的打印。

这时候就需要重写log打印功能

@Component

mybatis 配置

<setting name="logImpl" value="xx.xx.MyBatisLogImpl" />

3、有的时候mybatis需要调用oracle存储过程,而这个存储过程的参数还是一个自定义的oracle类型。

private 

这里要注意:1、oracle的自定义类型和自定义列表必须是全局的,不能是pkg里面的,否则不识别。

2、本人没有找到使用Mybatis的自定义typeHandler来进行参数拼接方案,尤其是跨用户执行存储过程的时 候,使用typeHandler往往是匹配不上的,他会莫名其妙把你JDBC的用户名给带上去,所以我暂定的方案是直接拿连接池里面的连接直接操作数据库。

4、JDBC连接池拿到的连接有的时候需要转成oracle的connection或者mysql的connection,如果你直接close转换之后的连接实例是没用的,因为数据连接池的连接并没有关闭掉,而且调用连接池连接的关闭方法也不是真的关闭,而是放回至连接池中,所以如果要做转换,记得分两步,拿到连接池连接实例,操作完之后记得close掉。

5、这个相对大头一些,有的时候(通常是连oracle这种数据库),我们要导出大量数据到excel,如果数据量比较大,比如大概3、4 十万行,每行100多列的这种情况。

如果用常规的导出办法,也就是查到list中再传入poi进行处理,是会报堆溢出的,很明显list里面放那么多数据根本就放不下。那解决办法就是边查边导,这时候需要重写ResultHandler,按照自定义返回值处理的方式进行处理。

个人解决方案是,在service方法中写一个方法域内的全局list,逐条插入数据,当list.size()达到500的时候,将里面的数据用poi导到文档,清空list。往复循环,直到数据全部被插入到excel为止。

这里poi有几个特定的配置强调一下:

1、final SXSSFWorkbook sbook = new SXSSFWorkbook(100);

workboox实例要用SXSSFWorkbook初始化,常规的最大行数就到Integer.MAX_VALUE (65535)了,超过就溢出。

构造方法参数是内存缓存100条,超过就写入临时文件了,如果列超级多的话建议设置小点儿,但是不能不设置,不设置就是不限制了。

2、sbook.setCompressTempFiles(true); //要开启写入临时文件这个功能。

以上就是Mybatis遇到的几个比较大的坑,小来小去的错误就不在这写了,当然也可能有一些更大的坑被遗漏掉了,以后再慢慢捡吧。其实mybatis的本质就是一个常规JDBC的封装,添加了很多易用性的功能,它既是一个框架也可以算作一种规范了,不过不要被它限制死了,要学会使用它而不是被它使用。

bat 存储过程返回值_使用Mybatis过程中遇到的坑相关推荐

  1. bat 存储过程返回值_为什么不推荐使用存储过程?

    之所以有这个题目,我既不是故意吸引眼球,也不想在本文对存储过程进行教科书般论述.最近项目中遇到的存储过程问题,让我想起了去年在武汉出差时一位同事的发问: 我觉得存储过程挺好用的,为什么你不建议用? 当 ...

  2. mybatis mysql 调用存储过程 多个返回值_图解MyBatis的SQL执行流程(干货)

    前言 MyBatis可能很多人都一直在用,但是MyBatis的SQL执行流程可能并不是所有人都清楚了,那么既然进来了,通读本文你将收获如下: 1.Mapper接口和映射文件是如何进行绑定的 2.MyB ...

  3. bat 存储过程返回值_MySQL-存储过程和函数详述

    1.1 存储过程和函数概述 存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高 ...

  4. mybatis mysql 调用存储过程 多个返回值_被Mybatis坑惨了

    关注米兜Java并置顶,一起涨姿势- 关注米兜 Spring 2020     热点推荐 1 抛去try {...} catch {...} finally {...},让代码更轻便 2 无所不能的J ...

  5. 获取mysql存储过程返回值_从强网杯随便注浅析mysql存储过程

    作者:Smity 合天智汇 去年的强网杯,出了一道mysql堆叠注入叫随便注,这道题被好多比赛玩了一整年,直到现在还是有各种新姿势,但是今天我忽然想到似乎没有对这个题目有一个很认真的分析,因此这里总结 ...

  6. dapper 调用 存储过程返回值_数据库事务、存储过程、函数以及触发器之间的区别和联系...

    一.[事务概念] 事务(Transaction)是指构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行. 1,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前 ...

  7. bat ping 返回值_专科生可以进bat大厂吗?

    专科生中出现出类拔萃的人始终是少数,而当华为腾讯这种公司里面来了一个大专学历的人,大家的反应多半是:卧槽,牛逼!  阿里,腾讯,华为等公司有专科生吗?当然有,但你大概率复制不了人家的路.当然有,或许不 ...

  8. python一个函数调用另一个函数的返回值_在python函数中使用True,False和None作为返回值...

    建议不是你不应该使用True,False或None.这只是你不应该使用如果x == True. 如果x == True是愚蠢的,因为==只是一个二进制运算符!它的返回值为True或False,取决于它 ...

  9. qdialog 返回值_如何从Python中的QDialog实例返回值?

    我想打开一个QtGui.QDialog,从用户请求一组值,然后在单击"保存"后返回值.在 下面的代码应该在不修改的情况下运行.在import sys from PySide imp ...

最新文章

  1. linux 内网共享文件夹_在Linux下访问Windows共享文件夹
  2. 【转】CAD2012打开自动关闭解决方法
  3. Codechef_JULY14
  4. ubuntu下搭建一个数据化处理的开发环境
  5. 基于机器学习的捡球机器人设计与实现(探索)第6篇——另一种高效追踪网球思路
  6. python 调用控制台并获取返回结果_Java调用Python脚本并获取返回值
  7. 简单解决“无法打开内核设备:\\Global\\vmx86”错误
  8. spring mvc学习(48):java判断系统是linux还是windows系统
  9. NLP《Tranformer和Self-Attention》
  10. 开源机器人操作系统—ros_九美元计算机,机器人操作系统和更多开源新闻
  11. 苹果推送通知服务(APNs)编程(转)详细步骤
  12. Spring-ConfigurationClassPostProcessor类
  13. L1-014 简单题 (5 分)—团体程序设计天梯赛
  14. i2c-tools下载安装及使用调试
  15. maven jersey mysql_Maven和Jersey Framework开发REST风格Web Service
  16. 碳足迹 carbon footprint
  17. ModifyStyle, ModifyStyleEx
  18. IDEA快捷生成方法
  19. Pytorch入门教程学习笔记(六)循环神经网络RNN(学周杰伦写歌)
  20. 王之泰201771010131《面向对象程序设计(java)》第十五周学习总结

热门文章

  1. python3类的继承详解_基于python3 类的属性、方法、封装、继承详解
  2. facebook对话链接_如何应用防错原则,看看 Facebook 和 Gmail 是怎么做的
  3. mysql2008怎么重装_SQL Server2005、2008如何彻底删除卸载并重新安装?
  4. Java实现多线程售票
  5. android计算距离顶部的距离,(lua版)计算距离的逻辑是从Android的提供的接口(Location.distanceBetween)中拔来的,应该是最精确的方法了...
  6. python无人机路径规划算法_RRT算法在Python中的实现,快速,拓展,随机,树
  7. 华为鸿蒙系统还没发布吗,华为没有孤军奋战,合作伙伴“雪中送炭”,鸿蒙系统正式发布!...
  8. java char i=2+#039;2#039;;_P039 二维数组的字符按列存放到字符串中 ★★
  9. js禁止鼠标滑轮_js实现鼠标滑动到某个div禁止滚动
  10. os.environ[‘CUDA_VISIBLE_DEVICES‘]= ‘0‘设置环境变量