MyBatis(1)高级应用

Published on with 0 views and 0 comments

MyBatis 的特点:

  1. 使用连接池对连接进行管理
  2. SQL 和代码分离,集中管理
  3. 结果集映射
  4. 参数映射和动态 SQL
  5. 重复 SQL 的提取
  6. 缓存管理
  7. 插件机制
MyBatis 核心配置
全局配置文件

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

MyBatis 最佳实践
Executor
  1. SimpleExecutor:每执行一次 update 或 select,就开启一个 Statement 对象,用完立刻关闭 Statement 对象。
  2. ReuseExecutor:执行 update 或 select,以 SQL 作为 key 查找 Statement 对象,存在就使用,不存在就创建,用完后,不关闭 Statement 对象,而是放置于 Map 内,供下一次使用。简言之,就是重复使用 Statement 对象。
  3. BatchExecutor:执行 update(没有 select,JDBC 批处理不支持 select),将所有 SQL 都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch()完毕后,等待逐一执行 executeBatch()批处理。与 JDBC 批处理相同。executeUpdate()是一个语句访问一次数据库,executeBatch()是一批语句访问一次数据库(具体一批发送多少条 SQL 跟服务端的 max_allowed_packet 有关)。BatchExecutor 底层是对 JDBC ps.addBatch()和 ps. executeBatch()的封装。
关联查询

用户和部门的对应关系是 1 对 1 的关系

<resultMap id="nestedMap1" type="user">
	<id property="id" column="id" jdbcType="INTEGER"/>
	<result property="userName" column="user_name" jdbcType="VARCHAR" />
	<result property="realName" column="real_name" jdbcType="VARCHAR" />
	<association property="dept" javaType="dept">
		<id column="did" property="dId"/>
		<result column="d_name" property="dName"/>
		<result column="d_desc" property="dDesc"/>
	</association>
</resultMap>

还有就是 1 对多的关联关系

<resultMap id="nestedMap2" type="dept">
	<id column="did" property="dId"/>
	<result column="d_name" property="dName"/>
	<result column="d_desc" property="dDesc"/>
	<collection property="users" ofType="user">
		<id property="id" column="id" jdbcType="INTEGER"/>
		<result property="userName" column="user_name" jdbcType="VARCHAR" />
		<result property="password" column="password" jdbcType="VARCHAR"/>
	</collection>
</resultMap>
延迟加载
<!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!--当开启时,任何方法的调用都会加载该对象的所有属性。默认false,可通过select标签的fetchType来覆盖-->
<!-- aggressiveLazyLoading决定了是不是对象的所有方法都会触发查询。 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- MyBatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->
<setting name="proxyFactory" value="CGLIB" />

标题:MyBatis(1)高级应用
作者:cuijianzhe
地址:https://cjzshilong.cn/articles/2022/04/11/1649659669550.html