Mybatis源码分析(一)

对于web开发的人来说mybatis并不陌生,用官网的话来说MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。它的优势在于消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。使用框架一般使用约定大于配置的方式。

Mybatis使用
  • 编程式
  • 集成式(容器,如spring)

建议使用的时候不要使用example,便于后期排查问题。Mapper的注解和xml方式兼容,但是两者对应的一个方法不能同时存在。

作用域
实体类编程式scope集成式scope
SqlSessionFactoryBuildermethodmethod
SqlSessionFactoryapplicationapplication
SqlSessionrequest/method(线程级)request/method(线程级)
Mappermethodapplication(mapper在spring框架中是单例的,mapper 内部不包含 成员字段,无状态单例是安全的,一直存在不用每次调用都new 一个新实例)
Config 文件部分解读

environment
typeHandler:用于JavaType<->JdbcType转化,可以自定义想要的转换方式
plugins:类似拦截器,但只能在以下操作时进行拦截:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)
Mapper 文件解读
  1. namespace:关联对应的接口,区分类似package
  2. resultType/resultMap(支持对应字段联合查询):返回值对应到类或者用Map一一映射resultType/resultMap(支持对应字段联合查询):返回值对应到类或者用Map一一映射
  3. parameterType/parameterType :参数,现都使用parameterTypeparameterType/parameterType :参数,现都使用parameterType
  4. sql:类似定义变量,可引入的通用sqlsql:类似定义变量,可引入的通用sql
  5. CRUD:useGeneratedKeys自动生成主键CRUD:useGeneratedKeys自动生成主键
  6. 动态sql动态sql
  7. 缓存:mybatis有一级和二级缓存。
    一级缓存是SqlSession级别的(减小数据库压力,如果多次调用查询同一个数据期间修改会存在脏数据的问题但基本不会出现),默认开启;
    二级缓存是基于Mapper级别的(减轻数据库压力,容易造成脏数据的问题且有更新全部失效不建议使用,一般使用redis等第三方缓存替代),默认关闭。
基本常识
  1. 分页
    1)逻辑分页mybatis自带,不建议使用
    org.apache.ibatis.executor.resultset.DefaultResultSetHandler$handleRowValuesForSimpleResultMap
    2)物理分页
    select … limit 0,10
    三方插件PageHelper或自己实现
  2. 批量操作
方式性能缺点
for循环一个一个插入低 每次都要IO
foreach拼SQL(性能最高,推荐)有sql长度限制
show variables like ‘%packet%’
show variables like ‘%net_buffer%’
ExeutorType.BATCH需要配置BATCH的SqlSessionTemplate
  1. 联合查询
    1)嵌套结果
    2)嵌套查询:Lazy loading
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值