一、介绍JDBC
JDBC全称Java Database Connectivity,是Java语言规范客户端访问数据库的应用程序接口,所面向的数据库类型为关系型数据库。
JDBC的三层架构图:
JDBC 的 API 提供了以下接口和类:
DriverManager :这个类管理一系列数据库驱动程序。匹配连接使用通信子协议从 JAVA 应用程序中请求合适的数据库驱动程序。识别 JDBC 下某个子协议的第一驱动程序将被用于建立数据库连接。
Driver : 这个接口处理与数据库服务器的通信。你将很少直接与驱动程序互动。相反,你使用 DriverManager 中的对象,它管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息。
Connection : 此接口具有接触数据库的所有方法。该连接对象表示通信上下文,即,所有与数据库的通信仅通过这个连接对象进行。
Statement : 使用创建于这个接口的对象将 SQL 语句提交到数据库。除了执行存储过程以外,一些派生的接口也接受参数。
ResultSet : 在你使用语句对象执行 SQL 查询后,这些对象保存从数据获得的数据。它作为一个迭代器,让您可以通过它的数据来移动。
SQLException : 这个类处理发生在数据库应用程序的任何错误。
以下是直接使用JDBC的Java代码:
1 public classJdbcTest {2 public static voidmain(String[] args) {3 //数据库连接
4 Connection connection = null;5 //预编译的Statement,使用预编译的statement的可以提高性能,使用statement操作数据库
6 PreparedStatement preparedStatement = null;7 //结果集
8 ResultSet resultSet = null;9
10 try{11 //加载数据库驱动
12 Class.forName("com.mysql.jdbc.Driver");13 //通过数据驱动管理类获取数据库链接
14 connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatisdata?characterEncoding=utf-8","root","root");15 //定义sql语句,其中?标识占位符
16 String sql = "select * from user where id = ?";17 //获取预处理statement
18 preparedStatement =connection.prepareStatement(sql);19 //设置参数,第一个参数为sql中参数的序号,第二个参数为设置的参数值
20 preparedStatement.setInt(1,1);21 //向数据库发出sql查询,查询出数据集
22 resultSet =preparedStatement.executeQuery();23 //遍历查询结果
24 while(resultSet.next()){25 System.out.println(resultSet.getString("id")+"->"+resultSet.getString("username")+"->"+resultSet.getString("sex"));26 }27 } catch(Exception e) {28 e.printStackTrace();29 } finally{30 //释放资源
31 if(resultSet != null){32 try{33 resultSet.close();34 } catch(SQLException e) {35 e.printStackTrace();36 }37 }38 if(preparedStatement!=null){39 try{40 preparedStatement.close();41 } catch(SQLException e) {42 e.printStackTrace();43 }44 }45 if(connection != null){46 try{47 connection.close();48 } catch(SQLException e) {49 e.printStackTrace();50 }51 }52 }53 }54 }
可以看出JDBC的一些缺点:
1. 每次访问数据库都需要创建数据库连接,最后不需要使用还得释放连接,频繁地连接释放连接会造成系统资源浪费,从而影响系统性能;
2. 需要在Java代码里面编写SQL语句,SQL语句发生改动,需要重新编译Java代码,就种硬编码的方式造成代码不易维护的缺点;
3. Preparedstatement中设置的参数要与占位符在数量上一一对应,而且查询的条件不确定,参数或多或少,这就能引起很多麻烦;
4. ResultSet中遍历结果时,需要对应相应数据库字段,这些字段属于硬编码,也不利于系统的维护。
二、介绍Mybatis
Mybatis的前身是iBATIS,是Clinton Begin在2001年发起的一个开源项目,最初侧重于密码软件的开发,后来发展为一款基于Java的持久层框架。2004年Clinton将iBATIS捐给Apache软件基金会,2010年iBATIS改名Mybatis,算算Mybatis的前后历史也有10多年了。
Mybatis是一款优秀支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。Mybatis可以使用XML或者注解进行配置和映射,通过将参数映射到配置中的SQL,形成最终执行的SQL语句,最终将执行SQL语句的结果映射到Java对象返回。
与其他映射框架不同,Mybatis不是把 Java对象直接和数据库联系起来,而是把 Java对象 与 SQL语句联系起来,把对象传进SQL语句来设置参数。
而 Hibernate这款ORM映射框架是直接将 Java对象和 数据库表字段 联系起来。
Hibernate 优点
Hibernate 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码。
为在数据库中直接储存和检索 Java 对象提供简单的 APIs。
如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML 文件属性。
抽象不熟悉的 SQL 类型,并为我们提供工作中所熟悉的 Java 对象。
Hibernate 不需要应用程序服务器来操作。
操控你数据库中对象复杂的关联。
最小化与访问数据库的智能提取策略。
提供简单的数据询问。
Hibernate的缺点
全表映射带来的不便,比如更新时需要发送所有的字段。
无法根据不同的条件组装不同的SQL。
对多表关联和复杂的sql查询支持较差,需要自己写sql,返回后,需要自己将数据封装为pojo。
不能有效的支持存储过程。
虽然有HQL,但是性能较差,大型互联网系统往往需要优化sql,而hibernate做不到。
Mybatis 优点
易于上手和掌握。
sql写在xml里,便于统一管理和优化。
解除sql与程序代码的耦合。
提供映射标签,支持对象与数据库的orm字段关系映射
提供对象关系映射标签,支持对象关系组建维护
提供xml标签,支持编写动态sql。
Mybatis 缺点
sql工作量很大,尤其是字段多、关联表多时,更是如此。
sql依赖于数据库,导致数据库移植性差。
由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。
DAO层过于简单,对象组装的工作量较大。
不支持级联更新、级联删除。
编写动态sql时,不方便调试,尤其逻辑复杂时。
提供的写动态sql的xml标签功能简单,编写动态sql仍然受限,且可读性低。
若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
参数的数据类型支持不完善。
多参数时,使用不方便,功能不够强大。
缓存使用不当,容易产生脏数据。
Hibernate 与 Myabtis 的共同点
从配置文件(通常是 XML 配置文件中)得到 sessionfactory.
由 sessionfactory 产生 session
在 session 中完成对数据的增删改查和事务提交等.
在用完之后关闭 session 。
在 Java 对象和 数据库之间有做 mapping 的配置文件,也通常是 xml 文件。
Mybatis应用场景:
需求多变的互联网项目,例如电商项目。
Hibernate应用场景:
需求明确、业务固定的项目,例如OA项目、ERP项目等。
总 结:
Hibernate是一个标准的ORM映射框架,程序员无需配置SQL语句,只需要配置好Java对象与数据库的映射文件.hbm.xml,但是对SQL的优化和修改是比较困难的;Mybatis是一个不完整的ORM映射框架,需要程序员编写SQL语句,这很考验程序员的能力,对SQL语句的优化和修改是比较方便的。面对需求量变化比较多的项目来说,选用Myabtis是比较适合的。