一、JDBC
Java Data Base Connectivity :Java数据库连接
由SUN公司提出的一系列规范 -- 只定义了接口的规范,具体实现是交给各个数据库厂商去实现的,JDBC是一种典型的桥接模式
(1) 如何使用JDBC规范进行编程实现对数据库的CRUD(create、read、update、delete)操作
A:注册数据库驱动和信息(以MySql数据为例)
加载数据库驱动
Class.forName("com.mysql.jdbc.Driver")
加载数据库连接信息
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/3306/test",username,pwd)
B:操作conn,构建Statement(PrepareStatement)对象
说明:
PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。
Statement不会初始化,没有预处理,每次都是从0 开始执行SQl
PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement("insert into user(name,age) values(?,?)");
C:通过Statement执行SQL语句
增删改:
int ret = pstmt.executeUpdate();
if(ret > 0){
//SQL语句执行成功
}
查询:
ResultSet rs = pstmt.executeQuery();
while(rs.next){
//操作rs数据集,将数据映射成Java Pojo对象
}
D:最后用完后,关闭conn
conn.close();
(2) JDBC弊端
1、需要编写大量demo,demo复用性不够好,需要自己封装Dao层达到代码的复用
2、数据集到pojo对象的映射关系太过拘泥,需要自己进行适配,工作量大
二、ORM
对象关系映射:英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping)
其取代了JDBC,并对其进行了封装(简化工作量,使得数据到对象的映射关系更为简单)
用于实现面向对象编程语言里不同类型系统的数据之间的转换,简单明了的说就是:
通过编程,操作pojo对象,加上映射关系,即可达到操作数据库的效果,反之,则是将数据库操作的数据映射成pojo对象
三、Hibernate
(1) 什么是Hibernate?
百度百科:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
简单点就是:Hibernate是一个开源的、轻量级的实现了ORM(对象关系映射)技术的全自动的数据持久层框架
(2) Hibernate发展史
2001年:Hibernate第一个版本发布
2002年:人们开始关注Hibernate
2003年:Hibernate开发团队进入JBoss公司,成为该公司的子项目
2004年:Hibernate成为持久化框架的标准
2005年:JBOSS发布Hibernate3
2006年:RedHat公司收购JBOSS
2011年:Hibernate4发布
至今 :Hibernate5+
四、Mybatis
(1)什么是Mybatis?
百度百科:MyBatis本是Apache的一个开源项目iBatis, 2010年这个项目由Apache Oftware Foundation 迁移到了Google Code,并且改名为MyBatis 。2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
简介:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
(2)功能架构
五、Mybatis和Hibernate的区别
都是数据持久层框架,都实现了对象关系映射,那么,二者各自有什么优势和缺点呢?
相同点
- 通过SessionFactoryBuider由XML配置文件生成SessionFactory
- 然后由SessionFactory 生成Session
- 最后由Session来开启执行事务(Transaction)和SQL语句
- 其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的
- Hibernate和MyBatis都支持JDBC和JTA事务处理。
SQL语句生成?
(1)Hibernate是全自动的ORM框架,拥有完整的JavaBean对象与数据库的映射结构来自动生成SQL语句
(2)Mybaits是半自动的ORM框架,在查询关联对象或关联集合对象时,需要手动编写SQL来完成,而且这一块的工作量较大
小结:Hibernate是全自动的ORM,MyBatis是半自动的ORM
数据库移植性?
(1)Hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、mysql等)之间的耦合性,因此,数据库迁移考虑的问题较少(性能高)
(2)由于Mybaits是半自动的ORM框架,其大量充斥着我们自己写的SQL语句,而不同的数据库之间的SQL写法存在着差异,因此,数据库移植考虑的问题会比较多(性能低)
小结:在数据库移植性上Hibernate要高于Mybatis
SQL优化?
(1)Hibernate由于要我们编写的SQL比较少,而大多数的数据上的优化都是从SQL入手的,因此,在SQL语句优化上,Hibernate要稍微复杂点,虽然其有HQL,但是功能不及SQL强大,
(2)Mybatis大部分的SQL都是写在XML里或者通过注解实现的,因此,可以直接对SQL语句进行优化,
小结:在原生SQL优化上,Mybatis要比Hibernate更加灵活些
配套设施?
(1)Hibernate日志系统非常健全,涉及广泛,包括:SQL记录、关系异常、优化警告、缓存提示、脏数据警告等,其有更好的二级缓存机制,也可以使用第三方缓存
(2)Mybaits相比就简陋的多了,日志出了基本记录功能外,其他功能相对薄弱,二级缓存机制不佳,也支持第三方缓存
补充:
Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。
MyBatis使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,就要避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。
注:一级缓存指本地缓存,默认会开启,不受控制
小结:Hibernate比Mybaits拥有更完善的日志系统且二级缓存机制要优于Mybaits
学习成本?
(1)Hibernate配置更为复杂,更注重细节,要想学精,花费的时间和精力较高
(2)Mybatis框架简单,SQL配置更为灵活,写起来也是随心所欲,基本上会写SQL的童鞋都可以很快的入手
小结:Mybaits更加小巧,灵活,相比较Hibernate来说,更容易上手,更容易实现快速开发
Spring集成?
通过对比,我还是推荐大家使用Spring+Spring MVC +Mybaits的框架进行Java Web项目的开发,或者使用比较流行的Spring Boot框架集成Mybatis进行几乎零配置(XML模板定制的配置方式改为在类中进行编写代码加注解的方式实现XML零配置,)的Web应用程序的快速、高效的开发,其中Mybatis框架中我推荐使用其通用Mapper(单表操作效率非常高,而且一句SQL都不用写,且XML映射文件也不用配置)进行快速Dao层开发
有时间,我会更一个标准的由Spring Boot + Mybaits 框架开发的的后端项目的系列教程,其中涵盖了:
1、如何在IDEA中进行Spring Boot项目的快速搭建
2、如何在项目中对依赖的Jar包进行Maven管理
3、如何集成Mybaits框架
4、如何利用Mybaits框架实现ORM--->编写业务模型和实体模型以及配置对象之间的映射关系(XML)
5、如何利用实体模型进行DAO层的开发,比如,如何通过配置XML映射,编写SQL模板实现实体模型的批量插入和更新
6、如何根据查询过滤器fiter进行SQL的定制来实现业务模型的分页查询(实体模型转业务模型+PageHelper分页插件)....etc