一、MyBatis简介
Mybatis 是持久层开发框架。
MyBatis的机制的原理:
①MyBatis支持普通的SQL查询,存储过程和高级映射的持久层框架。
②MyBatis将大量的SQL语句从程序里面抛离出来,配置在配置文件中,实现SQL的灵活配置。
二、为什么要使用MyBatis?
① 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
② Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。(使用MyBatis将代码和SQL语句分离,便于各自的维护)
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
③ 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决: Mybatis自动将java对象映射至sql语句。
④ 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。
三、MyBatis编程步骤?
① 创建SqlSessionFactory
② 通过SqlSessionFactory创建SqlSession
③ 通过sqlsession执行数据库操作
④ 调用session.commit()提交事务
⑤ 调用session.close()关闭会话 返回到连接池中
public class MyBatisUtil{
private static MyBatisUtil instance = new MyBatisUtil();
private SqlSessionFactory sqlSessionFactory = null;
private MyBatisUtil(){
String resource = "config/mybatis.xml";
InputStream in = null;
//读取数据库配置文件config.xml的数据,
//包含了事务配置,连接池配置,mysqld连接信息配置,mybatis xml文件路径信息
in = MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);
//创建sqlSessionFactory对象,整个应用周期都存在
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}
public static SqlSession openSession(){
//参数传入true设置自动提交事务的
SqlSession session = instance.sqlSessionFactory.openSession();
//手动提交事务
//session.commit(true);
return session;
}
}
四、MyBatis的一级缓存和二级缓存
一级缓存在内存上,第一级缓存是SqlSession实现的,一级缓存实现就是实现一个Map表,Key:id val:recode 一级缓存默认开启的
对记录的任何增加删除修改都可以使一级缓存失效(所有缓存都失效)
多线程环境中,一级缓存会产生问题!!!
读到的都是缓存中的旧值
Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象
Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。