Mybatis
文章平均质量分 69
WannaRunning
这个作者很懒,什么都没留下…
展开
-
Mybatis插入数据时返回自增主键
对于Oracle这种不支持主键自增功能的数据库,不可以使用useGeneratedKeys属性配置。要使用seleckey标签嵌套在insert标签中显示查询主键后进行返回。 标签支持返回插入前最新主键和插入后最新主键,通过order参数控制。对于MySQL sqlserver这种支持自增主键功能的数据库,可以使用。两个属性配合使用,支持单条或批量插入返回主键信息。原创 2022-09-03 13:21:10 · 867 阅读 · 0 评论 -
浅谈Mybatis在Spring整合后的执行原理和一级缓存管理
Spring整合Mybatis的方式是通过SqlSessionTemplate创建sqlSession代理对象执行CRUD操作。MapperProxy类MapperProxy#invoke 这个方法是Mapper接口执行方法的入口。关键逻辑在最后一处代码,调用了MapperMethod类的execute方法public class MapperProxy<T> implements InvocationHandler, Serializable { private sta原创 2021-08-05 23:40:18 · 213 阅读 · 1 评论 -
Spring整合MyBatis后一级缓存的使用
Mybatis的一级缓存是sqlSession级别的,在不进行Insert,Update操作的情况下,使用同一sqlsession下的多次相同查询会使用缓存结果。Spring整个MyBatis后与Mybatis单独使用有所区别Spring整合Mybatis后,通过SqlSessionTemplate创建sqlSession代理对象,默认每次查询都是创建新的sqlSession对象,查询执行结束后在finally中关闭代理sqlSession。Spring整合Mybatis中,默认情况下一级缓存原创 2021-08-05 21:02:32 · 380 阅读 · 2 评论 -
Mybatis整合Spring源码分析——Mapper接口的实现
对于一般的类都是通过Spring加载Bean的流程加载,但是Mybatis中的Mapper接口本身并不是类,接口是不能被直接实例化的,那么这些接口时如何被加载到Spring中的呢?简单概括一下就是通过JDK的动态代理创建代理类,然后通过注入BeanDefinition的方式被Spring加载的。MapperScannerConfigurer这个类实现了BeanDefinitionRegistryPostProcessor接口,可以猜到这个接口是用来注册BeanDefinition的,在Sprin原创 2021-02-05 17:48:57 · 232 阅读 · 0 评论 -
Mybatis动态表名SQL解析器
水平分表的方式对大数据量表的优化是有一定作用的。但是从分布式的角度来讲感觉并没有削减当前库的压力,所以水平分表适合对大数据量表做优化。水平分表基于表结构一直,根据某些字段划分不同数据存在不同的表中,提高数据查询的效率。例如一张庞大的订单信息表,可以根据订单类型或者日期划分为多个表,Mybatis中使用动态表名拦截器的方式动态指定目标表名称进行查询。下面的示例,对替换目标CAP_DOCUMENT_CATALOG表明自定义逻辑动态决定最终查询的表名进行替换后查询目标表数据@Configuratio原创 2021-01-07 16:39:40 · 706 阅读 · 0 评论 -
MybatisPlus乐观锁插件使用(拦截器)
从拦截器代码看得出与之前文章写的实现思路一样,拦截器会在更新操作时以查询时查到的version值为条件,并设置新的version值为version+1,这样一来如果version值存在即没有被修改就可以更新成功。 public Object intercept(Invocation invocation) throws Throwable { Object[] args = invocation.getArgs(); MappedStatement ms = (Mapp原创 2020-12-29 15:43:03 · 810 阅读 · 0 评论 -
Mybatis游标Cursor查询
通常对一张表中大量数据处理时由于数据量太大都要使用分页分批查询处理,否则数据量太大会导致OOM等问题。Cursor查询适用于这种场景下可以替代分页查询的方案,Cursor实现了Closeable和Iterable接口,我们可以通过迭代器来获取数据进行处理。public interface Cursor<T> extends Closeable, Iterable<T> { boolean isOpen();//用于在取数据之前判断 Cursor 对象是否是打开状态。原创 2020-12-14 14:22:48 · 12106 阅读 · 0 评论 -
PageHelper分页插件使用过程中的问题
项目中使用了Mybatis加PageHelper插件实现分页查询功能。空闲时间研究了一下这个插件的使用。只有紧跟在PageHelper.startPage方法后的第一个 Mybatis 的查询(Select)方法会被分页。也就是当分页查询是,设置完pageSize和pageNum后的第一个sql查询语句才会实现分页查询功能,再后面的不会被实现。不支持一对一和一对多结果映射的分页查询在一对一和一对多时,根据分页条件查询出 100 条数据时,由于一对一和一对多会去重,经过嵌套处理后数据量会减..原创 2020-07-05 16:18:34 · 1280 阅读 · 0 评论 -
Mybatis——二级缓存
目录认识Mybatis的二级缓存:概念理解:使用场景:通过代码进一步理解:使用Mybatis的二级缓存:1.开启二级缓存配置2.在要是用二级缓存的Mapper中配置使用缓存3.对应的model类要序列化禁用某个特定方法的二级缓存功能:使用mybatis的二级缓存(整合ehcache):1.引入ehcache的JAR2.指定cache的实现方式使用eh...原创 2019-12-16 15:39:29 · 584 阅读 · 0 评论 -
Mybatis——多表查询结果映射(ResultMap)
目录一对一映射:1.简单的可以基于主表model扩展一个新的model添加缺少的字段,作为ResultType使用。2.自定义ResultMap,一个model里面包含另一个model配置映射一对多映射自定义ResultMap,一的model里放以多的model为元素的集合(List)多对多映射:一对一映射:一张user表,一张order表,现在要查询某个o...原创 2019-12-16 12:00:03 · 6151 阅读 · 1 评论 -
Mybatis——编写动态SQL中where,if使用
where与if的使用起到了参数字段的非空校验作用。直接上代码: where标签会自动生成where关键字。如果前面的sql条件不会拼装(sex = #{user.sex}),那么后面if标签内的and关键字会自动省略。所以sql不会出错。 <select id="findUserList" parameterType="userQueryVO" resultType="u...原创 2019-12-13 18:29:17 · 513 阅读 · 0 评论 -
Mybatis——返回值resultType(resultMap)详解
之前的文章记录了传参类型,本文记录一下返回值类型的配置。返回值属性有两种设置,一种是resultType,一种是resultMap。resultType适用于返回值是简单类型(String,Integer)或者数据库字段与POJO字段完全一致的情况下,所以属性值一般是某一个pojo类或者简单类型。如果数据库中的字段在resultType指定的实体类中没有对应的字段名称,那这个值将丢失。...原创 2019-12-13 16:28:54 · 22386 阅读 · 0 评论 -
Mybatis——传参parameterType详解
Mybatis使用的重点就是传参和返回值,也就是parameterType和ResultType(ResultMap)文章记录一下传参的几种使用情况:1.单个参数或较少参数的时候。单个参数直接传就好了,不需要细说。如果参数两三个,推荐在Mapper接口中使用@param注解表明字段。 public User findUserById(int id); <select ...原创 2019-12-13 15:21:19 · 2408 阅读 · 0 评论