bat 存储过程返回值_使用Mybatis过程中遇到的坑
常规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过程中遇到的坑相关推荐
- bat 存储过程返回值_为什么不推荐使用存储过程?
之所以有这个题目,我既不是故意吸引眼球,也不想在本文对存储过程进行教科书般论述.最近项目中遇到的存储过程问题,让我想起了去年在武汉出差时一位同事的发问: 我觉得存储过程挺好用的,为什么你不建议用? 当 ...
- mybatis mysql 调用存储过程 多个返回值_图解MyBatis的SQL执行流程(干货)
前言 MyBatis可能很多人都一直在用,但是MyBatis的SQL执行流程可能并不是所有人都清楚了,那么既然进来了,通读本文你将收获如下: 1.Mapper接口和映射文件是如何进行绑定的 2.MyB ...
- bat 存储过程返回值_MySQL-存储过程和函数详述
1.1 存储过程和函数概述 存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高 ...
- mybatis mysql 调用存储过程 多个返回值_被Mybatis坑惨了
关注米兜Java并置顶,一起涨姿势- 关注米兜 Spring 2020 热点推荐 1 抛去try {...} catch {...} finally {...},让代码更轻便 2 无所不能的J ...
- 获取mysql存储过程返回值_从强网杯随便注浅析mysql存储过程
作者:Smity 合天智汇 去年的强网杯,出了一道mysql堆叠注入叫随便注,这道题被好多比赛玩了一整年,直到现在还是有各种新姿势,但是今天我忽然想到似乎没有对这个题目有一个很认真的分析,因此这里总结 ...
- dapper 调用 存储过程返回值_数据库事务、存储过程、函数以及触发器之间的区别和联系...
一.[事务概念] 事务(Transaction)是指构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行. 1,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前 ...
- bat ping 返回值_专科生可以进bat大厂吗?
专科生中出现出类拔萃的人始终是少数,而当华为腾讯这种公司里面来了一个大专学历的人,大家的反应多半是:卧槽,牛逼! 阿里,腾讯,华为等公司有专科生吗?当然有,但你大概率复制不了人家的路.当然有,或许不 ...
- python一个函数调用另一个函数的返回值_在python函数中使用True,False和None作为返回值...
建议不是你不应该使用True,False或None.这只是你不应该使用如果x == True. 如果x == True是愚蠢的,因为==只是一个二进制运算符!它的返回值为True或False,取决于它 ...
- qdialog 返回值_如何从Python中的QDialog实例返回值?
我想打开一个QtGui.QDialog,从用户请求一组值,然后在单击"保存"后返回值.在 下面的代码应该在不修改的情况下运行.在import sys from PySide imp ...
最新文章
- linux 内网共享文件夹_在Linux下访问Windows共享文件夹
- 【转】CAD2012打开自动关闭解决方法
- Codechef_JULY14
- ubuntu下搭建一个数据化处理的开发环境
- 基于机器学习的捡球机器人设计与实现(探索)第6篇——另一种高效追踪网球思路
- python 调用控制台并获取返回结果_Java调用Python脚本并获取返回值
- 简单解决“无法打开内核设备:\\Global\\vmx86”错误
- spring mvc学习(48):java判断系统是linux还是windows系统
- NLP《Tranformer和Self-Attention》
- 开源机器人操作系统—ros_九美元计算机,机器人操作系统和更多开源新闻
- 苹果推送通知服务(APNs)编程(转)详细步骤
- Spring-ConfigurationClassPostProcessor类
- L1-014 简单题 (5 分)—团体程序设计天梯赛
- i2c-tools下载安装及使用调试
- maven jersey mysql_Maven和Jersey Framework开发REST风格Web Service
- 碳足迹 carbon footprint
- ModifyStyle, ModifyStyleEx
- IDEA快捷生成方法
- Pytorch入门教程学习笔记(六)循环神经网络RNN(学周杰伦写歌)
- 王之泰201771010131《面向对象程序设计(java)》第十五周学习总结
热门文章
- python3类的继承详解_基于python3 类的属性、方法、封装、继承详解
- facebook对话链接_如何应用防错原则,看看 Facebook 和 Gmail 是怎么做的
- mysql2008怎么重装_SQL Server2005、2008如何彻底删除卸载并重新安装?
- Java实现多线程售票
- android计算距离顶部的距离,(lua版)计算距离的逻辑是从Android的提供的接口(Location.distanceBetween)中拔来的,应该是最精确的方法了...
- python无人机路径规划算法_RRT算法在Python中的实现,快速,拓展,随机,树
- 华为鸿蒙系统还没发布吗,华为没有孤军奋战,合作伙伴“雪中送炭”,鸿蒙系统正式发布!...
- java char i=2+#039;2#039;;_P039 二维数组的字符按列存放到字符串中 ★★
- js禁止鼠标滑轮_js实现鼠标滑动到某个div禁止滚动
- os.environ[‘CUDA_VISIBLE_DEVICES‘]= ‘0‘设置环境变量