$和#的区别
${}是 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 批处理 相同。