前言
我们知道,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只是接口,无法直接拿来用,必须依赖于底层的实现才能使用,这点可以在下图中体现。
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)
使用案例参考
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略大一些