4. 从零开始学SpringBoot-JPA_JDBC_Hibernate_Mybatis概念原理篇

前言

我们知道,springboot操作mysql方式众多,Spring为各种支持的持久化技术,都提供了简单操作的模板和回调,目前大概有如下几种

ORM持久化技术 模板类
JDBC org.springframework.jdbc.core.JdbcTemplate
Hibernate org.springframework.orm.hibernate.HibernateTemplate
IBatis org.springframework.orm.ibatis.SqlMapClientTemplate
JPA org.springfrmaework.orm.jpa.JpaTemplate

那么这些方式的区别如何?
我们从几个概念讲起。

JDBC

JDBC(Java DataBase Connectivity ,java数据库连接技术) ,Java访问数据库的一种规范, Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库

开发步骤

  • 加载驱动程序
  • 创建数据库连接
  • 创建一个preparedStatement
  • 通过preparedStatement执行SQL语句,返回结果集
  • 处理结果集
  • 处理异常,关闭数据库相关的资源

案例

        Connection con = null;
        PreparedStatement pStmt = null;
        ResultSet rs = null;
        try {
            con = ods.getConnection();
            String sql = "select * from admin";
            pStmt = con.prepareStatement(sql);
            rs = pStmt.executeQuery();
            while (rs.next()) {
            }
        } catch (Exception ex) {
            try {
                con.rollback();
            } catch (SQLException sqlex) {
                sqlex.printStackTrace(System.out);
            }
            ex.printStackTrace();
        } finally {
            try {
                rs.close();
                pStmt.close();
                con.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

优点

  • 简单易学,上手快
  • 非常灵活构建SQL,效率高

缺点:

  • 代码繁琐,难以写出高质量的代码
  • 需要处理资源的释放,对象的创建和销毁,SQL注入,异常处理等额外工作
  • 需要关心底层数据库的细节
  • 不支持数据库跨平台

JPA

JPA (Java Persistence API, Java 持久化 API),是 SUN 公司推出的一套基于ORM规范,为各种不同的ORM技术提供一个统一的接口,方便把应用移植的不同的ORM技术上。内部是由一系列的接口和抽象类构成。

JPA同样作为一种规范,但是和JDBC不同,没有提供实现的类,也就说JPA规范中提供的只是一些接口,显然接口不能直接拿来使用。虽然应用程序可以面向接口编程,但JPA底层一定需要某种JPA实现,否则JPA依然无法直接使用。

Sun之所以提出JPA规范,其目的是以官方的身份来统一各种ORM框架的规范,包括著名的Hibernate、TopLink等。JPA规范给开发者带来了福音:开发者面向JPA规范的接口,但底层的JPA实现可以任意切换:觉得Hibernate好的,可以选择Hibernate JPA实现;觉得TopLink好的,可以选择TopLink JPA实现……这样开发者可以避免为使用Hibernate学习一套ORM框架,为使用TopLink又要再学习一套ORM框架。

JDBC和JPA

JDBC和JPA都是规范和接口,不过JDBC 是面向 SQL 的,使用起来比较繁琐,所以就有了 ORM 框架,建立了 Java 对象与数据库表之间的映射关系,可以通过直接操作对象来实现持久化,简化了操作的繁杂度。而 JPA 就是 ORM 框架的规范,值得一提的是 Hibernate 是符合 JPA 规范的(Hibernate实现了JPA规范),而 MyBatis 却不符合,因为 MyBatis 还是需要写 SQL 的。

细心的同学发现了,作者介绍JPA的时候没有写案例,是的,可不是楼主偷懒,而是JPA只是接口,无法直接拿来用,必须依赖于底层的实现才能使用,这点可以在下图中体现。


1.png
2.png

JDBCTemplate

JDBC已经能够满足大部分用户最基本的需求,但是在使用JDBC时,必须自己来管理数据库资源如:获取PreparedStatement,设置SQL语句参数,关闭连接等步骤。为了解决这个问题,JDBCTemplate技术出现。

JDBCTemplate就是对JDBC的封装,处理了资源的建立和释放,帮助我们自动处理了一些异常,避免一些常见的错误,比如忘了总要关闭连接,目的是使JDBC更加易于使用。它运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和获取结果集。

开发步骤

  • 导入依赖的jar包(连接池、mysql驱动、spring相关)
  • 准备连接池
  • 创建 JdbcTemplate 对象,传入连接池对象
  • 编写SQL语句,
  • 调用 execute()执行 DDL、update()执行 DML、queryXxx()执行 DQL 等方法
  • 获取结果集

案例

//启动IoC容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取IoC容器中JdbcTemplate实例
JdbcTemplate jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
String sql="insert into user (name,deptid) values (?,?)";
int count= jdbcTemplate.update(sql, new Object[]{"caoyc",3});
System.out.println(count);

优点

  • 使用简单,内嵌Spring框架中
  • 高效
  • 支持基于AOP的声明式事务

缺点

  • 必须于Spring框架结合在一起使用
  • 不支持数据库跨平台
  • 默认没有缓存

Spring Data JPA

Spring Data JPA是啥?说起这个,就要说起Spring,Spring框架什么都想做,当然也想做一点持久化相关的工作,所以有了形如spring-data-*(举例:spring-data-jpa)等包,Spring Data JPA即代表了spring框架对JPA的整合,Spring Data JPA在JPA的实现(如Hibernate)的顶部添加了一个额外的抽象层。你可以这么理解,Spring Data JPA在JPA规范的基础上又抽象了一层Repository层,用于显著减少为各种持久性存储实现数据访问层所需的代码量。想直接使用它依旧需要依赖JPA的实现(hibernate或其它orm)


3.png

使用案例参考
5.从零开始学springboot-连接数据库的几种方式-JPA

Hibernate

Hibernate是JPA规范的一种实现。
Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,它将 POJO 与数据库表建立映射关系,是一个全自动的 orm 框架,hibernate 可以自动生成 SQL 语句,自动执行,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibername一问世就成为了Java世界首选的ORM框架。

执行过程

  • 创建Configuration对象(配置文件的装载操作,读取所有的配置文件并进行解析)
  • 创建SessionFactory对象
  • 创建Session对象 (理解为数据库的一个连接对象)
  • 开始一个事务Transaction
  • 进行持久化操作(增删改查操作)
  • 结束事务Transaction
  • 关闭Session (理解为连接对象的释放)

优点

  • 对象化。 以面相对象的思想来操作数据库。
  • 更好的移植性。对于不同的数据库,开发者只需要使用相同的数据操作即可.
  • 开发效率高。 hibernate提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需写大量的sql语句,这就极大的提高了开发者的开发效率。
  • hibernate提供了缓存机制(session缓存,二级缓存,查询缓存)

缺点

  • 对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate
  • 框架中使用ORM原则,导致配置过于复杂
  • 不适于复杂关系的数据表维护。如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。
  • 批量数据处理时有弱势。对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点。

Mybatis

为了解决Hibernate的不足,一个半自动映射的框架MyBatis应运而生
mybatis是一个java持久层框架,它封装少、高性能·可优化、维护简单等优点成为了目前java移动互联网网站服务的首选持久层框架,它特别适合分布式和大数据网络数据库编程
之所以称它为半自动,是因为它需要手工匹配提供POJO、SQL和映射关系,而全表映射的Hibernate只需要提供POJO和映射关系便可

历史
Mybaits的前身是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了 google code 并且改名为Mybatis,2013年11月迁移到Github,目前mybaits是由Github维护的

优点

  • 半自动的执行方式,除sql外操作由框架完成,方便快捷
  • 手工定制sql,实现sql与java代码分离,灵活性高,方便维护
  • 只需要sql进行操作,不需要学习额外的内容
  • 轻量级的框架,执行速度快

缺点
hibernate只适用于场景不太复杂,要求性能不太苛刻的时候
mybatis拥有动态列,动态表名,存储过程支持,同时提供了简易的缓存、日志、级联,但是它的缺陷是需要你提供映射规则和sql,所以它的开发工作量比Hibernate略大一些

请关注我的订阅号

订阅号.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容