资深Java工程师带你解读MyBatis第二十七期
2017年07月10日--2017年07月17日 分享到:

MyBatis的前身是iBATIS,它以接近JDBC的性能优雅地实现Java代码与SQL语句的分离,让开发者将数据操作专注点转移到SQL语句上,进而使代码维护变得更加容易。历经10多年的发展,MyBatis日臻成熟,现已成为Java持久化框架中的佼佼者被广泛应用。

本期专家问答我们请来了《 MyBatis从入门到精通 》一书作者 刘增辉 来为大家解答MyBatis相关问题。

本期问答内容
1、MyBatis基本用法
2、MyBatis插件开发
3、MyBatis缓存配置
4、MyBatis分页插件
5、通用Mapper

作者简介:
刘增辉
这里写图片描述

资深Java工程师,热爱技术研究,乐于分享心得,活跃于CSDN和开源中国网站。对MyBatis源码有着深入研究,同时热衷于开源项目,在GitHub和开源中国网站上发布了多个开源项目,是MyBatis官方推荐的分页插件PageHelper和通用Mapper的作者,所发布项目受到了数千人的关注。
CSDN博客地址:http://blog.csdn.net/isea533

为了营造更好的问答氛围,我们不欢迎一切与主题无关的讨论、灌水。欢迎大家踊跃提问,刘增辉老师会为大家解答问题,并在活动结束后奖励提问的每位用户提供100论坛可用分

这里写图片描述

新书购买:点击

已结束
本期嘉宾 1499669376 532081 刘增辉 资深Java工程师,热爱技术研究,乐于分享心得,活跃于CSDN和开源中国网站。对MyBatis源码有着深入研究,同时热衷于开源项目,在GitHub和开源中国网站上发布了多个开源项目,是MyBatis官方推荐的分页插件PageHelper和通用Mapper的作者,所发布项目受到了数千人的关注。
2 raodoudou321 raodoudou321 2017.07.11 18:18提问
求教MyBatis批量插入/更新的问题

刘老师你好:
我想请教下 MyBatis批量插入/更新 的实现 在内部是循环一条一条的操作并提交还是批量操作(类似于 Insert into 表 value () value () 这样的)后再执行?

2 isea533 isea533 2017.07.12 08:45回答

支持批量insert的情况下,就用这种方式。如果不支持,可以考虑一次执行多个sql。

ix_fly
ix_fly mybatis慢很多,建议jdbc批量,另加&rewriteBatchedStatements=true,否则还是会一条一条执行,快至少一个数量级
9 个月之前 回复
2 stdupanda stduPanda 2017.07.11 17:08提问
项目中处理Mybatis缓存策略的问题

刘老师你好,感谢能提供这个帮助我解决困惑。

1.关于和第三方缓存工具集成时需要注意哪些方面的问题?
2.项目中如何确定缓存更新策略?
3.spring cache、mybatis缓存、redis等内存缓存这三者在项目中如何搭配?

2 isea533 isea533 2017.07.14 09:06回答

和什么集成都没什么特别需要注意的,需要注意的是二级缓存本身,mybatis二级缓存设计的很容易出现脏数据,要特别注意。

建议从业务层控制缓存。

2 testcs dn testcs_dn 2017.07.11 12:29提问
一对多嵌套查询 mysql 8小时问题

刘老师你好:
我在结果映射中使用了collection,一对多嵌套查询,dbcp连接池;
但是间隔一段时间再访问就会出现异常: java.sql.SQLException: No operations allowed after statement closed.
再重新请求一次就好了,添加以下配置也没能解决:

        <!--指定数据库的默认自动提交-->
        <property name="defaultAutoCommit" value = "true" />
        <!--是否自动回收超时连接-->
        <property name="removeAbandoned" value="true" />
        <!--超时时间(以秒数为单位)-->
        <property name="removeAbandonedTimeout" value="10" />
        <!--记录中断事件 -->
        <property name="logAbandoned" value="true" />
        <!-- 池中的连接空闲30分钟后被回收 -->
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <!-- some positive integer -->
        <property name="timeBetweenEvictionRunsMillis" value="30000" />
        <!--取得对象时是否进行验证,检查对象是否有效 -->
        <property name="testOnBorrow" value="true" />
        <!--空闲时是否进行验证,检查对象是否有效 -->
        <property name="testWhileIdle" value="true" />
        <!--返回对象时是否进行验证 -->
        <property name="testOnReturn" value="true"/>
        <property name="validationQuery" value="select 1" />
        <!-- 下面这两个属性属于优化部分,加上这两个属性可以提高整体的响应时间 -->
        <!-- 表明是否开启statement cache,默认为false,也就是不开启 -->
        <property name="poolPreparedStatements" value="true" />
        <!-- statement cache的大小,默认为-1,也就是不限制 -->
        <property name="maxOpenPreparedStatements" value="10" />
        <!-- 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->
        <property name="numTestsPerEvictionRun" value="1" />
2 isea533 isea533 2017.07.11 15:32回答

这个嵌套查询时间是否过长?你这里设置的超时时间是10秒。

testcs_dn
testcs_dn 是因为连接被dbcp强制收回了?连接池为了防止程序从池里取得连接后忘记归还的情况, 而提供了一些参数来设置一个租期, 使用这个可以在一定程度上防止连接泄漏。
10 个月之前 回复
共9条数据 首页 2 尾页