71
回答
高手问答第 165 期 —— 资深 Java 工程师带你解读 MyBatis
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

OSCHINA 本期高手问答(2017 年 8 月 9 日 — 8 月 15 日)我们请来了@Liuzh_533 刘增辉为大家解答关于 MyBatis 方面的问题。

刘增辉,资深 Java 工程师,热爱技术研究,乐于分享心得,活跃于 CSDN 和开源中国社区。对 MyBatis 源码有着深入研究,同时热衷于开源项目,在 GitHub 和开源中国社区上发布了多个开源项目,是 MyBatis 官方推荐的分页插件 PageHelper 通用 Mapper 的作者,所发布项目受到了数千人的关注。

MyBatis 的前身是 iBATIS,它以接近 JDBC 的性能优雅地实现 Java 代码与 SQL 语句的分离,让开发者将数据操作专注点转移到 SQL 语句上,进而使代码维护变得更加容易。历经 10 多年的发展,MyBatis 日臻成熟,现已成为 Java 持久化框架中的佼佼者被广泛应用。但是 MyBatis 也有一些不完美的地方,例如物理分页问题、缓存问题,对于这些问题,作者在《MyBatis从入门到精通》一书中给出了自己的解决方案。

本期问答内容:

  1. MyBatis基本用法
  2. MyBatis插件开发
  3. MyBatis缓存配置
  4. MyBatis分页插件
  5. 通用Mapper

或有其他关于 MyBatis 的问题,也欢迎大家积极提问。

为了鼓励踊跃提问,@博文视点 会在问答结束后从提问者中抽取 5 名幸运会员赠与《MyBatis从入门到精通》一书。

购买链接:https://item.jd.com/12103309.html

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就 MyBatis 方面问题向@Liuzh_533 刘增辉提问,请直接回帖提问。

举报
局长
发帖于4个月前 71回/7K+阅
共有71个答案 最后回答: 3个月前

@Liuzh_533 使用mybatis的缓存后,从缓存读取的数据能否copy一份出来,默认是直接返回原始的数据,这样的话有坑,如果有修改数据,下次获取的数据就是修改后的。 这个问题能解决吗?

@钟京丰 我已经写好了一个主从分离(读写分离)的插件,很简单:https://my.oschina.net/enyo/blog/1486746

--- 共有 2 条评论 ---
mahengyang@钟京丰 回复@钟京丰 : 你担心什么问题? 4个月前 回复
钟京丰非常感谢,我当前也是有类似的主从实现方案,主要问问大神,这种有没有什么问题哈,之前想这样写,主要还是图省事,不想去搞AOP拦截。 4个月前 回复
hibernate最大的优势就是可移植性好,还有就是减轻了SQL和映射文件的编写。毕竟是全自动的orm框架嘛!不足之处就速度有点慢 要回复 那个hibernate和mybatis的的的评论的 回复了三遍都没回复成功

@Liuzh_533 你好,可以简单的谈一下mybatis 在分别在反射和数据方面的缓存机制吗?

--- 共有 3 条评论 ---
宋民举 回复 @Liuzh_533 : 感谢回答! 4个月前 回复
Liuzh_533数据缓存方面,默认有一级缓存,SqlSession级别。二级缓存需要配置启用,根据二级缓存的具体实现,缓存共享的范围可以是单个sqlsessionfactory或者多个。由于二级缓存绑定在各自命名空间上,多表查询容易出现脏数据,因此要慎重使用。 4个月前 回复
Liuzh_533默认情况下,MyBatis会缓存类的反射信息,这也是MyBatis映射结果到对象使用最频繁的工具,缓存这部分数据非常重要,对整体效率影响很大。如果想要修改,可以配置reflectorFactory属性,自己实现。 4个月前 回复

@Liuzh_533

mybatis除了可以用来做主从读写分离,简单分表分库规则这些以外,还有没有能解决现一些日常问题和需求

--- 共有 1 条评论 ---
Liuzh_533mybatis最基本的功能是增删改查。 4个月前 回复

@Liuzh_533  mybatis虽然可以直接写sql方便了对sql的把控,但是也带来了一个问题就是不同的数据库对sql支持程度不一样,现在的处理方式就是根据不同的数据库都写不同的sql,有没有更好的解决方式呢

--- 共有 1 条评论 ---
Liuzh_533不同数据库的情况下,只能针对性的去写,像like这种可以借助bind标签,特殊的SQL根据差异的大小可以从select这种标签区分或者通过if标签局部处理。 4个月前 回复

你好,我最近开始在阅读MyBatis源码,是从初始化开始去一步步的分析其实现原理。能在阅读MyBatis源码方面提供一些建议吗?比如按照什么方式更好一些。另外,MyBatis在跨数据库或者跨服务器上如何处理增删改查?

--- 共有 1 条评论 ---
Liuzh_533书中最后一章有一段纯JAVA使用MyBatis的代码,第一遍按照这段代码的顺序看每种类的作用更好,源码地址:https://github.com/mybatis-book/book/blob/master/simple-all/src/test/java/tk/mybatis/simple/SimpleTest.java 4个月前 回复
这本书我有了,不过还是想问,mybatis在sql注入方面的一些防御机制
--- 共有 1 条评论 ---
Liuzh_533默认都是预编译模式,参数通常使用#{}方式防止注入,like情况下可以通过bind标签拼接字符串,然后使用#{}。一般需要${}的地方都是查询列,表名,排序的地方,如果有这种需要,做好数据校验。 4个月前 回复
顶部