MyBatis的适用场景和生命周期
MyBatis使用场景
对比Hibernate和MyBatis是我们常见的话题,Hibernate作为常用的ORM框架,它使用起来简单易懂,对于SQL语言的封装,让对于SQL并不是很熟练的程序员也可以轻松地开发DAO层,IDE也有对应的工具来反向生成,所以开发效率较快,Hibernate也提供了缓存,级联等高级功能。但是其缺点在于:
1.对于需要SQL优化的场景,如果SQL复杂,Hibernate方法的封装也派不上用场,还是需要使用原生SQL,而原生SQL返回的是一个Object数组,接下来就是需要我们自己手工完成封装了。
2.Hibernate是一个全表映射的框架,所以更新和查询时,如果我们只需要操作表中某些字段,就无法做到。
3.不能有效支持存储过程
所以Hibernate适用于场景不复杂的,对于性能要求并不高的场景。
可以说MyBatis是一个半映射的框架,它也支持缓存,级联等操作,缺点就在于需要你提供映射规则和SQL,工作量比Hibernate要大。MyBatis虽然开发不如Hibernate效率高,但是其灵活,可SQL优化的特点很吸引人,正因为此,在于大数据,高并发移动互联网项目中较为常用。
MyBatis的组件
SqlSessionFactoryBuilder(构造器):它可以根据配置来获得SqlSessionFactory
SqlSessionFactory(工厂接口):依靠接口创建SqlSession
我们这里再对比一下Mybatis与Hibernate之间创建session工厂所使用方法的不同:
Hibernate中创建方法
Configuration cfg=new Configuration().configure("hibernate.cfg.xml"); //加载hibernate配置文件
SessionFactory sessionFactory=cfg.buidSessionFactory();
Mybatis中创建方法
String resource="mybatis-config.xml";
InputStream inputStream=Resources.getResourceAsStream(resource); //加载mybatis配置文件
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession:是一个既可以发送SQL去查询并返回结果,也可以用来获得Mapper接口
hibernate和Mybatis都是使用Session工厂中的方法来创建会话的,巧合的是这两者的方法名都为openSession
SQL Mapper:它是一个MyBatis较为推荐的方式,通过写接口替代传统DAO开发的方式。它是由Java接口和XML文件(或注解)构成
生命周期
SqlSessionFactoryBuilder的作用就是构建SqlSessionFactory,可以使用XML或注解的方式构建一个或多个SqlSessionFactory,构建成功之后,就失去了存在的意义,应该将其回收,所以,将其生命周期限制在方法局部中。
SqlSessionFactory是用来构建SqlSession的,如果我们多次创建同一个SqlSessionFactory,在每一次创建的时候,都会打开使用数据库资源,那么连接资源很快就会被耗尽,所以应该使用单例模式来构建。类比于Hibernate,Hibernate也是通过SessionFactory来构建Session的,都应该是使用了工厂模式。
SqlSession相当于JDBC中的Connection,其是线程不安全的,所以在多线程的时候需要当心,在操作数据库的时候需要注意隔离级别,数据库锁等问题。它在每次使用过后应该及时关闭,长期存在,就会减少数据库连接资源,对系统性能影响很大。
Mapper是一个接口,没有实现类,它的作用是发送SQL查询,并返回结果,或者是通过SQL修改数据库中的记录,所以应该存在于一个SqlSession的事务方法范围中。
SqlSessionFactory应该是单例的
SqlSessionFactory应该是单例的,所以我们就写一个单例的工厂工具类,在以后与Spring整合之后就不在需要了,那时我们是在applicationContext.xml文件中配置了SqlSessionFactoryBean作为SessionFactory的。
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class SQLSessionFactoryUtil { //SqlSessionFactory对象
private static SqlSessionFactory sqlSessionFactory;
//当前类的Class对象作为线程锁
private static final Class CLADD_LOCK=SqlSessionFactory.class; /**
* 私有化构造
*/
private SQLSessionFactoryUtil() {} /**
* 构建SQLSessionFactory
*/
public static SqlSessionFactory initSqlSessionFactory() {
//MyBatis配置文件
String resource="mybatis-config.xml";
InputStream inputStream=null;
try {
inputStream=Resources.getResourceAsStream(resource);
}catch (Exception e) {
e.printStackTrace();
}
synchronized (CLADD_LOCK) { //加上线程锁,避免在多线程环境下多次初始化造成对象不唯一
if(sqlSessionFactory==null) {
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
}
return sqlSessionFactory;
} /**
* 打开sqlsession
*/
public static SqlSession openSqlSession() {
if(sqlSessionFactory==null) {
initSqlSessionFactory();
}
return sqlSessionFactory.openSession();
} }
MyBatis的适用场景和生命周期的更多相关文章
- 【Cocos2d-x 3.x】 场景切换生命周期、背景音乐播放和场景切换原理与源码分析
大部分游戏里有很多个场景,场景之间需要切换,有时候切换的时候会进行背景音乐的播放和停止,因此对这块内容进行了总结. 场景切换生命周期 场景切换用到的函数: bool Setting::init() { ...
- cocos进阶教程(3)Cocos2d-x多场景切换生命周期
在多个场景切换时候,场景的生命周期会更加复杂.这一节我们介绍一下场景切换生命周期. 多个场景切换时候分为几种情况: 情况1,使用pushScene函数从实现HelloWorld场景进入Setting场 ...
- Cocos2d-x多场景切换生命周期
在多个场景切换时候,场景的生命周期会更加复杂.这一节我们介绍一下场景切换生命周期. 多个场景切换时候分为几种情况: 情况1,使用pushScene函数从实现HelloWorld场景进入Setting场 ...
- Cocos2d-x Lua中多场景切换生命周期
在多个场景切换时候,场景的生命周期会更加复杂.这一节我们介绍一下场景切换生命周期.多个场景切换时候分为几种情况:情况1,使用pushScene函数从实现GameScene场景进入SettingScen ...
- MyBatis中主要类的生命周期和应用范围
转自:http://ccchhhlll1988-163-com.iteye.com/blog/1420026 MyBatis中常用的类就要数SqlSessionFactoryBuilder.SqlSe ...
- cocos2dx JS 层(Layer)的生命周期
场景的生命周期: 一般情况下一个场景只需要一个层,需要创建自己的层类.一些主要的游戏逻辑代码都是写在层中的,场景的生命周期是通过层的生命周期反映出来的,通过重写层的生命周期函数,可以处理场景不同声明周 ...
- Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结
1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...
- MyBatis之八:需要说明的几个java api的生命周期以及封装
学习mybatis不得不了解SqlSessionFactoryBuilder.SqlSessionFactory.SqlSession.这里主要是讲解它们的生命周期以及一般最佳实践. 一般来说对象的生 ...
- Cocos2d-x场景功能描述的生命周期
层(Layer)的生命周期函数有例如以下: init().初始化层调用. onEnter().进入层时候调用. onEnterTransitionDidFinish(). 进入层并且过渡动画结束时候调 ...
随机推荐
- Bireme:一个 Greenplum数据仓库的增量同步工具
https://hashdatainc.github.io/bireme/ Bireme 是一个 Greenplum / HashData 数据仓库的增量同步工具.目前支持 MySQL.Postgre ...
- git clone 提示输入git@xxx的密码
如下: suse:~/ecox # git clone git@vcs.in.ww-it.cn:ecox/ecox.git 正克隆到 'ecox'... git@vcs.in.ww-it.cn's p ...
- Android程序员学WEB前端(2)-HTML(2)-锚点链接列表表单-Sublime
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76522417觉得博文有用,请点赞,请评论,请关注,谢谢!~锚点 链接 列表 表单 &l ...
- SpringMVC札集(06)——转发和重定向
自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...
- MySQL 大表在线DML神器--pt-online-schema-change
一个朋友问我在线对大表进行ddl操作,如何做能尽量避免主从延迟以及不影响在线dml操作呢?我想到一个开源的pt-online-schema-change工具,测试了吧,效果还可以. pt-online ...
- BZOJ2131 免费的馅饼【线段树优化DP】
Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5). 接下来n行,每一行给出了一块馅饼的信息.由三个正整数组成,分别表示了每个馅饼落到 ...
- baidu手机输入法:邂逅"吹神"的声场漫游
"十年,好久不见,兄妹,所有还好?年月如歌,你的背包.却仍然没有筛选.装满红玫瑰.人来人往,爱情搬运,纵使我成了K歌之王.也谢谢你.依然让我的全世界失眠. 孤单患者.不如不见,不要说 ...
- php mysql 字符集(三) (转)
http://bbs.csdn.net/topics/390097514 gbk页面插入数据到utf8表,然后取出到gbk页面 首先, 这个set names x等价于SET character_se ...
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- jquery 操作单选按钮
<input type="radio" name="sex" value="男" />男 <input type=&quo ...