MyBatis

66 阅读1分钟

MyBatis配置:

<configuration>
  <settings>
    <setting name="cacheEnabled" value="false"/>  // 分布式应用禁用查询缓存
    <setting name="lazyLoadingEnabled" value="false"/>  // 禁用懒加载
    <setting name="defaultStatementTimeout" value="30"/> // 默认执行超时时间
    <setting name="useGenerateKeys" value="true"/>  // 默认开启insert后返回自增的主键
  </settings>
</configuration>

1、MyBatis底层源码实现 2、MyBatis参数解析底层原理 3、MyBatis解析SQL底层原理 4、MyBatis执行SQL底层原理 5、MyBatis结果处理底层原理

sql中?是占位符,set的时候可以按照顺序setvalue,setString(1, "test") // 第一个占位符的值是test #{} MyBatis的参数占位符

MyBatis的接口的实现原理: mapper是一个接口,实际实现的时候都是使用了代理类,使用代理类执行方法。根据代理类,就可以获取参数、注解等配置信息,解析sql语句 1、使用代理 获取method的所有参数,将参数名和参数值组装成一个map:Map<String, Object> paramValueMap 2、将select * from user where name=#{name} and age =#{age} and first_name = #{name} 转换成 select * from user where name=? and age = ? and first_name = ? 3、将#{xxx} 保存到一个List中 [name, age, name] 4、代理类中获取到的Map<argName, value> 根据上面的List 取值并set到 select * from user where name=? and age = ? and first_name = ? 语句中 5、如何获取最终的结果?JDBC返回的是ResultSet 获取到返回值之后怎么对应到mapper的接口的返回值类型 根据代理的method获取method对应的返回值类型,根据返回值类型; 根据返回值类型,生成对应的对象

代理类中执行的内容: 1、获取数据库链接 2、获取sql语句 3、构造prepareStatement:替换MyBatis的sql语句 jdbc的statement的setXXX时需要执行参数类型

4、执行prepareStatement:执行sql 5、获取sql执行结果的返回值