mybatis面试题

$和#的区别

${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本 替换,比如${driver}会被静态替换为 com.mysql.jdbc.Driver 。

#{}是 sql 的参数占位符,Mybatis 会将 sql 中的#{}替换为?号,在 sql 执行前会使用 PreparedStatement 的参数设置方法,按序给 sql 的?号占位符设置参数值,比如 ps.setInt(0, parameterValue),#{item.name} 的取值方式为使用反射从参数对象中获取 item 对象的 name 属性值,相当于 param.getItem().getName() 。

 

mybatis常用标签

基础功能:

insert、select、update、delete

mybatis 两级缓存

一级缓存默认开启,是sqlsession纬度的 同一个sqlsession下的相同sql语句直接返回缓存

事务使用一个sqlsession 所以多次查询直接返回

可以使用flushcache取消一级缓存

二级缓存是

mapper纬度的缓存,返回的pojo必须是可序列化的 查会缓存增删改会删缓存

太多会lru过期

 

标签循环引用没有问题 

第一次加载的时候虽然不会加载到 但是第二次就会加载到

 

mybatis update返回的是匹配到的行数,如果想返回受影响的行数需在数据库连接时使用useAffectedRows=true

mybatis 分页

Rowbounds分页是逻辑分页,没有limit和offset的逻辑

pagehelper使用的是真正的分页,会有limit和offer的增加

 

mybatis 类型转换

实现TypeHandler 方法可以自定义类型处理器

mybatis的执行器

三种执行器

SimpleExecutor:每执行一次 update 或 select,就开启一个 Statement 对象,用完立刻关闭 Statement 对象。

`ReuseExecutor:执行 update 或 select,以 sql 作为 key 查找 Statement 对象,存在就使 用,不存在就创建,用完后,不关闭 Statement 对象,而是放置于 Map<String, Statement>内,供下 一次使用。简言之,就是重复使用 Statement 对象。

BatchExecutor:执行 update(没有 select,JDBC 批处理不支持 select),将所有 sql 都添加 到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个 Statement 对象,每 个 Statement 对象都是 addBatch()完毕后,等待逐一执行 executeBatch()批处理。与 JDBC 批处理 相同。

上一篇:JDBC的Statement


下一篇:Jmeter----续集