
Mybatis
文章平均质量分 93
好记性不如烂笔头
一只懒鱼a
言念君子,温其如玉
展开
-
Mybatis之@MapKey
演示返回单行、多行数据,使用@MapKey和不使用@MapKey注解的区别,然后通过源码解析产生各种结果的原因。原创 2024-05-21 09:25:53 · 2607 阅读 · 0 评论 -
Mybatis之returnInstanceForEmptyRow、callSettersOnNulls
指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值进行初始化时比较有用。当返回行的所有列都是空时,MyBatis默认返回 null。请注意,它也适用于嵌套的结果集(如集合或关联)。方法, foundValues被设置为true。(未指定构造方法,使用的默认构造方法)方法, foundValues被设置为true。(未指定构造方法,使用的默认构造方法),并将foundValues值设置为true。原创 2024-05-21 09:03:18 · 1266 阅读 · 0 评论 -
Mybatis源码解析之结果集处理
先演示一个有代表性的查询,然后对照源码逐步分析、扩展。原创 2024-05-17 14:38:10 · 1048 阅读 · 0 评论 -
Mybatis自定义RowBounds、ResultHandler
我们使用Mybatis的时候,一些参数基本上都是用的默认值。这篇博文我们一起来探究一下,如何自定义RowBounds、ResultHandler以及相关源码解析一共查出来三条数据,mybstis也处理了三条数据创建接口方法创建测试方法@Test// 获取sqlSession// 获取mapper执行测试方法一共查出来三条数据,mybstis仅处理俩条数据PS : 如果方法有多个参数类型为RowBounds,则抛出异常创建接口方法创建测试方法@Test// 获取sqlSession。原创 2024-05-17 10:34:31 · 1127 阅读 · 0 评论 -
Mybatis之ResultMap
select语句查询得到的结果集是一张二维表,水平方向上看是一个个字段,垂直方向上看是一条条记录。而Java是面向对象的程序设计语言,对象是根据类定义创建的,类之间的引用关系可以认为是嵌套的结构。在JDBC编程中,为了将结果集中的数据映射成对象,我们需要自己写代码从结果集中获取数据,然后封装成对应的对象并设置对象之间的关系,而这些都是大量的重复性代码。原创 2024-05-10 14:07:14 · 1674 阅读 · 0 评论 -
Mybatis懒加载
延迟加载”的含义是 : 暂时不用的对象不会真正载入到内存中,直到真正需要使用对象时,才去执行数据库查询操作,将该对象加载到内存中。在 MyBatis 中,如果一个对象的某个属性需要延迟加载,那么在映射该属性时,会为该属性创建相应的代理对象并返回。当真正要使用延迟加载的属性时,会通过代理对象执行数据库加载操作,得到真正的数据。原创 2024-05-10 09:17:10 · 1291 阅读 · 0 评论 -
Mybatis四种实例化对象方式
创建ConstructorMapper.xml创建实体类Employee 创建ConstructorMapper.java创建测试类ConstructorTest 1.使用默认构造方法默认情况下,mybatis通过默认构造方法,实例化对象如果select指定了resultMap,且resultMap存在constructor标签,则mybatis就根据constructor标签指定的构造器进行实例化 PS : 如果测试方法报错,需要在maven文件中添原创 2024-05-01 13:57:38 · 631 阅读 · 0 评论 -
Mybatis日志模块
良好的日志在一个软件中占了非常重要的地位,日志是开发与运维管理之间的桥梁。日志可以帮助运维人员和管理人员快速查找系统的故障和瓶颈,也可以帮助开发人员与运维人员沟通,更好地完成开发和运维任务。但日志的信息量会随着软件运行时间不断变多,所以需要定期汇总和清理,避免影响服务器的正常运行。在 Java 开发中常用的日志框架有 Log4j、Log4j2、Apache Commons Log、java.util.logging、slf4j等,这些工具对外的接口不尽相同。原创 2024-05-04 09:27:11 · 1112 阅读 · 0 评论 -
Mybatis分页插件PageHelper
我们还可以自定义count查询,比如上文中的使用案例1(listAllEmployee),如果我们自定义了一个id为listAllEmployee_COUNT的查询,则最终将使用我们自定义的查询。1.如果reasonable的默认值被设置为true,且构建出的page的reasonable属性为null,page对象有一次优化分页的机会。注解来对可以增强的方法进行描述,将能进行方法增强的method,放入一个signatureMap,后续符合条件的method,则执行intercept方法。原创 2024-04-29 13:44:28 · 1455 阅读 · 0 评论 -
Mybatis参数处理
如果xml中存在占位符"#{param}",并且convertArgsToSqlCommandParam方法的返回值中,不存在一个name为param的key(返回值为paramMap)或 一个name为param的属性(返回值为实体类),则在增删改操作的sql填充或者查询操作创建cacheKey的过程中抛出异常。ParamNameResolver的构造方法会判断存不存在@Param注解,如果存在,则使用自定义的value值,否则就通过getActualParamName方法返回name。原创 2024-04-29 10:03:28 · 1227 阅读 · 0 评论 -
MappedStatement解析流程
之前写了一篇博文,介绍了mybatis的解析过程,其中mapper标签只演示了如何使用,这篇博文我们来探究mapper标签解析流程。原创 2024-04-24 09:09:22 · 870 阅读 · 0 评论 -
Mybatis二级缓存
阻塞的情况下,如果一个sqlSession获取指定cacheKey的二级缓存为null时,在其实时查询数据、填充缓存之前,如果有其他sqlSession也尝试获取该cacheKey的二级缓存,则该sqlSession将处于blocking状态,直到上一个sqlSession将缓存填充完毕。开启二级缓存后,并不是所有的查询结果立刻放入二级缓存,而是将其放入暂存区,等执行commit方法后,才会将暂存区的数据put到二级缓存中。属性可以被设置为任意的正整数,设置的值应该是一个以毫秒为单位的合理时间量。原创 2024-04-24 10:04:53 · 1743 阅读 · 0 评论 -
Mybatis之KeyGenerator
默认情况下,insert语句并不会返回自动生成的主键,而是返回插入记录的条数。如果业务逻辑需要获取插入记录时产生的自增主键,则可以使用Mybatis提供的KeyGenerator接口。不同的数据库产品对应的主键生成策略不一样,例如,Oracle、DB2等数据库产品是通过 sequence 实现自增 id 的,在执行insert语句之前必须明确指定主键的值;而MySQL、Postgresql等数据库在执行insert 语句时,可以不指定主键,在插入过程中由数据库自动生成自增主键。原创 2024-04-18 13:42:22 · 952 阅读 · 0 评论 -
Mybatis之SqlNode&SqlSource
apply()是SqlNode 接口中定义的唯一方法,该方法会根据用户传入的实参, 参数解析该SqlNode所记录的动态SQL节点,并调用DynamicContext.appendSql()方法将解析后的SQL片段追加到DynamicContext.sqlBuilder中保存。SqlNode的解析流程,主要是由XMLScriptBuilder这个类来完成的,其构造方法会调用initNodeHandlerMap这个方法,这个方法会注册很多handler,即不同的标签将会由不同的handler处理。原创 2024-04-18 09:43:54 · 1223 阅读 · 0 评论 -
Mybatis一级缓存
在常见的应用系统中,数据库是比较珍贵的资源,很容易成为整个系统的瓶颈。在设计和护系统时,会进行多方面的权衡,并且利用多种优化手段,减少对数据库的直接访问。使用缓存是一种比较有效的优化手段,使用缓存可以减少应用系统与数据库的网络交互、减少数据库访问次数、降低数据库的负担、降低重复创建和销毁对象等一系列开销,从而提高整个系统的性能。从另一方面来看,当数据库意外宕机时,缓存中保存的数据可以继续支持应用程序中的部分展示的功能,提高系统的可用性。原创 2024-04-08 14:02:03 · 1017 阅读 · 0 评论 -
Mybatis执行器(Executor)
Executor是MyBatis的核心接口之一,其中定义了数据库操作的基本方法。在实际应用中经常涉及的SqlSession接口的功能,都是基于Executor接口实现的。原创 2024-04-08 13:26:02 · 1664 阅读 · 0 评论 -
Mybatis配置文件解析
每次MyBatis创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。目标 : 创建一个plugin,每次执行四个参数的query方法,打印传入的property内容。PS : 标签必须按顺序配置,可以不配置,但不能乱序。使用映射器接口实现类的完全限定类名。引入mapper方式。原创 2024-03-31 13:24:51 · 923 阅读 · 0 评论