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只是接口,无法直接拿来用,必须依赖于底层的实现才能使用,这点可以在下图中体现。


4. 从零开始学SpringBoot-JPA_JDBC_Hibernate_Mybatis概念原理篇_第1张图片
1.png
4. 从零开始学SpringBoot-JPA_JDBC_Hibernate_Mybatis概念原理篇_第2张图片
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)


4. 从零开始学SpringBoot-JPA_JDBC_Hibernate_Mybatis概念原理篇_第3张图片
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

你可能感兴趣的:(4. 从零开始学SpringBoot-JPA_JDBC_Hibernate_Mybatis概念原理篇)