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();
} }

最新文章

  1. OBS MAC 系统开发(基于mac OS X 10.12)
  2. 1264: [AHOI2006]基因匹配Match
  3. poj 2031Building a Space Station(几何判断+Kruskal最小生成树)
  4. 每天一个 Linux 命令(5):rm 命令
  5. 删除SSMS中保存的帐户信息
  6. nodejs read/write file
  7. BOM 之 location
  8. iOS内存管理系列之一:对象所有权与引用计数
  9. iOS-BLE蓝牙开发持续更新
  10. Angular - - angular.element
  11. 使用Gradle发布SNAPSHOT版本到JCenter(oss.jfrog.org)
  12. Spring系列(六) Spring Web MVC 应用构建分析
  13. ThreadPoolExecutor使用
  14. Django 中文和时区设置
  15. Idea创建一个springboot多模块项目
  16. 用 CPI 火焰图分析 Linux 性能问题
  17. Spring boot(六)优雅使用mybatis
  18. 给Ubuntu软件升级命令
  19. 【JAVA】POI设置EXCEL单元格格式为文本、小数、百分比、货币、日期、科学计数法和中文大写
  20. install命令

热门文章

  1. Linux:wc命令详解
  2. (转) MapReduce Design Patterns(chapter 5 (part 1))(九)
  3. Softmax 函数的特点和作用
  4. Python2、3学习及迁移
  5. 数据交换格式 —— JSON(JavaScript Object Notation)
  6. grunt使用
  7. sqlserver获取代理服务作业job的执行情况
  8. BZOJ4292 PA2015 Równanie 【暴力水题】
  9. HDU5126 stars【CDQ分治】*
  10. BZOJ2824 AHOI2012 铁盘整理 【IDA*】