mybatis_preview
Sebastian Lv4

Mybatis帮助我们提升与数据库交互的效率,简化了JDBC的样板代码。

流程

1
2
3
4
5
6
7
8
9
10
11
start=>start: start
config=>operation: mybatis-config.xml
build=>operation: SqlSessionFactoryBuilder
factory=>operation: SqlSessionFactory
session=>parallel: SqlSession
mapper=>operation: Sql Mapper
end=>end: end

start->config->build->factory->session
session(path1,)->end
session(path2,right)->mapper->end

对于SqlSessionFactoryBuilder来说,作用是创建SqlSessionFactory,一旦创建完工厂就没用了,所以是作为局部变量;而对于SqlSessionFactory,可以把它看作连接池,应该一直运行,不应重复创建、销毁或另建实例(单例模式登场),否则浪费资源,他可以创建SqlSession 。创建SqlSession后用来链接数据库,每个session被看作是请求数据库,他是线程不安全的,每个线程都应有自己的session,不共享,所以最佳作用域是方法域,即每次与数据库交互都创建一个SqlSession,用完关闭(关闭是为了释放资源给别的线程使用,否则并发大了容易宕机)。

属性名与数据库表字段名

当pojo中的实例变量与数据库字段中不一致时,可以使用resultMap来解决,即结果集映射

也常用resultType,但是他是简单地将所有列映射到HashMap中的key上,很单一,不适合处理复杂情况,而map可以更加灵活地处理情况。用来resultMap时可以去掉resultType属性。

日志工厂

mybatis会默认去寻找日志框架,配置后会有sql信息输出,十分有用!

1
2
3
<settings>
<setting name="logImpl" value="log4j"/>
</settings>

分页

mybatis支持分页,有limitrowBounts两个方法。区别是前者在sql中实现,后者面向对象。

1
select * from USER limit #{index},#{size}

缓存

默认定义了两级缓存:一级缓存、二级缓存

一级缓存

默认开启,在session的close之前都有效,如果是查询相同的数据,直接在缓存中拿。

二级缓存

需要手动开启和配置,基于namespace级别,有Cache接口来自定义实现。