一、介绍JDBC

JDBC全称Java Database Connectivity,是Java语言规范客户端访问数据库的应用程序接口,所面向的数据库类型为关系型数据库。

JDBC的三层架构图:

JDBC 的 API 提供了以下接口和类:

DriverManager :这个类管理一系列数据库驱动程序。匹配连接使用通信子协议从 JAVA 应用程序中请求合适的数据库驱动程序。识别 JDBC 下某个子协议的第一驱动程序将被用于建立数据库连接。

Driver : 这个接口处理与数据库服务器的通信。你将很少直接与驱动程序互动。相反,你使用 DriverManager 中的对象,它管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息。

Connection : 此接口具有接触数据库的所有方法。该连接对象表示通信上下文,即,所有与数据库的通信仅通过这个连接对象进行。

Statement : 使用创建于这个接口的对象将 SQL 语句提交到数据库。除了执行存储过程以外,一些派生的接口也接受参数。

ResultSet : 在你使用语句对象执行 SQL 查询后,这些对象保存从数据获得的数据。它作为一个迭代器,让您可以通过它的数据来移动。

SQLException : 这个类处理发生在数据库应用程序的任何错误。

以下是直接使用JDBC的Java代码:

 1 public class JdbcTest {
2 public static void main(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是比较适合的。

MyBatis源码分析(一):从JDBC到MyBatis 介绍MyBatis的背景,为什么要用MyBatis的更多相关文章

  1. MyBatis 源码分析系列文章导读

    1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...

  2. MyBatis源码分析-MyBatis初始化流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  3. MyBatis源码分析-SQL语句执行的完整流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  4. MyBatis源码分析(5)——内置DataSource实现

    @(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...

  5. MyBatis源码分析(4)—— Cache构建以及应用

    @(MyBatis)[Cache] MyBatis源码分析--Cache构建以及应用 SqlSession使用缓存流程 如果开启了二级缓存,而Executor会使用CachingExecutor来装饰 ...

  6. 【MyBatis源码分析】select源码分析及小结

    示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...

  7. MyBatis源码分析之环境准备篇

    前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...

  8. Mybatis源码分析-StatementHandler

    承接前文Mybatis源码分析-BaseExecutor,本文则对通过StatementHandler接口完成数据库的CRUD操作作简单的分析 StatementHandler#接口列表 //获取St ...

  9. 【MyBatis源码分析】环境准备

    前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...

  10. MyBatis 源码分析系列文章合集

    1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...

随机推荐

  1. RabbitMQie消息列队整理

    使用方法过程,这儿只做了windows平台教程 先安装Erlang 编程软件,然后设置环境变量,在安装RabbimMQ ,这儿我下载了一个版本不行,后来换了最新版就好了,以后在使用过程 中如果有问题 ...

  2. vue-自定义指令(directive )的使用方法

    前言 在vue项目中我们经常使用到 v-show ,v-if,v-for等内置的指令,除此之外vue还提供了非常方便的自定义指令,供我们对普通的dom元素进行底层的操作.使我们的日常开发变得更加方便快 ...

  3. 使用Java操作Excel表格

    目录 一.配置第三方库 二.使用Apache POI API 1. 打开Excel文件 2. 选择对应的sheet 3. Sheet接口的基本使用 3.1 获取开头行和结束行 3.2 获取Row对象 ...

  4. Orchar Core 创建一个模块化的ASP.NET Core应用程序

    您将构建什么?您将构建一个模块化的ASP.NET Core MVC Web应用程序,类似于Orchard Core附带的示例"Hello World"应用程序.它包括一个Web应用 ...

  5. 告别Kafka Stream,让轻量级流处理更加简单

    一说到数据孤岛,所有技术人都不陌生.在 IT 发展过程中,企业不可避免地搭建了各种业务系统,这些系统独立运行且所产生的数据彼此独立封闭,使得企业难以实现数据共享和融合,并形成了"数据孤岛&q ...

  6. Java基础系列(20)- while循环

    循环结构 while循环 do-循环 for循环 在java5中引入了一种主要用于数组的增强型for循环 while循环 while是最基本的循环,它的结构为 while(布尔表达式){ //循环内容 ...

  7. 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 百篇博客分析OpenHarmony源码 | v61.02

    百篇博客系列篇.本篇为: v61.xx 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  8. P7443-加边【博弈论】

    正题 题目链接:https://www.luogu.com.cn/problem/P7443?contestId=41429 题目大意 \(n\)个点的一棵有根树,两个人从一号点开始进行有向图博弈. ...

  9. JVM堆内存泄露分析

      一.背景 公司有一个中间的系统A可以对接多个后端业务系统B,一个业务系统以一个Namespace代表, Namespace中包含多个FrameChannel(用holder保存),表示A连接到业务 ...

  10. Dapr + .NET Core实战(十三)跨语言开发

    因为基于Dapr的服务架构是不限语言的,我们来看看Dapr的跨语言开发.我们使用golang,python,.NET来实现跨语言的服务调用,拓扑如下 我们继续使用.NET 5的fontend和back ...