前言

说起Mybatis,相信大家都不会感到陌生,它是一款优秀的持久层框架,应用于java后端开发中,为客户端程序提供访问数据库的接口。

我们都知道,JDBC是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。这也就是Mybatis所具备的功能,那既然已经有了JDBC了,为什么还要用Mybatis呢?

原因很简单,因为单纯使用JDBC进行开发会出现效率低下、耗费资源及影响程序拓展性等问题。

JDBC基本用法及问题分析

首先来看一下使用JDBC对数据库进行访问的一段代码:

  1. 1 import java.sql.*;
  2. 2
  3. 3 public class JDBCTest {
  4. 4
  5. 5 public static final String URL = "jdbc:mysql://localhost:3306/mybatis_study?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
  6. 6 public static final String USER = "root";
  7. 7 public static final String PASSWORD = "root";
  8. 8
  9. 9 public static void main(String[] args) throws Exception {
  10. 10 Connection connection = null;
  11. 11 PreparedStatement preparedStatement = null;
  12. 12 ResultSet resultSet = null;
  13. 13 User user = new User();
  14. 14
  15. 15 try {
  16. 16 // 加载数据库驱动
  17. 17 /* 注意事项:
  18. 18 1、这里需要提前找好mysql驱动的jar包,复制到项目库中,或者直接通过maven导入。
  19. 19 2、注意jar包版本要与本机的mysql一致。
  20. 20 没有做到以上两点必然会报错。*/
  21. 21 Class.forName("com.mysql.cj.jdbc.Driver");
  22. 22 // 获取数据库连接
  23. 23 connection = DriverManager.getConnection(URL, USER, PASSWORD);
  24. 24 // 定义sql语句
  25. 25 String selectSql = "select * from user where username = ?";
  26. 26 // 获取预处理statement
  27. 27 preparedStatement = connection.prepareStatement(selectSql);
  28. 28 // 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
  29. 29 preparedStatement.setString(1, "hardy");
  30. 30 // 向数据库发出sql执行查询,查询出结果集
  31. 31 resultSet = preparedStatement.executeQuery();
  32. 32 // 遍历查询结果集
  33. 33 while (resultSet.next()) {
  34. 34 int id = resultSet.getInt("id");
  35. 35 String username = resultSet.getString("username");
  36. 36 // 封装User
  37. 37 user.setId(id);
  38. 38 user.setUsername(username);
  39. 39 }
  40. 40 System.out.println(user);
  41. 41
  42. 42 } catch (Exception e) {
  43. 43 e.printStackTrace();
  44. 44 } finally {
  45. 45 // 释放资源
  46. 46 if (resultSet != null) {
  47. 47 try {
  48. 48 resultSet.close();
  49. 49 } catch (SQLException e) {
  50. 50 e.printStackTrace();
  51. 51 }
  52. 52 }
  53. 53
  54. 54 if (preparedStatement != null) {
  55. 55 try {
  56. 56 preparedStatement.close();
  57. 57 } catch (SQLException e) {
  58. 58 e.printStackTrace();
  59. 59 }
  60. 60 }
  61. 61
  62. 62 if (connection != null) {
  63. 63 try {
  64. 64 connection.close();
  65. 65 } catch (SQLException e) {
  66. 66 e.printStackTrace();
  67. 67 }
  68. 68 }
  69. 69 }
  70. 70 }
  71. 71 }

代码运行结果:

观察上述代码,不难发现以下问题:

  1. 数据库配置信息存在硬编码问题。(当我们从mysql数据库切换到oracle数据库时,代码中的数据驱动信息和数据库连接信息都需要修改。)
  2. 需要频繁创建和释放数据库连接。
  3. sql语句、设置参数及获取结果集参数均存在硬编码问题。(不同数据库的sql语法,参数及结果集参数均有所不同)
  4. 需要手动封装返回结果集。

为什么要用Mybatis?

针对JDBC存在的问题,来解释一下为什么要使用Mybatis:

  1. Mybatis使用配置文件加载数据库配置信息,很好地解决了硬编码问题。
  2. 对于创建和释放数据库连接等步骤,Mybatis直接使用连接池进行解决。
  3. 针对“sql语句、设置参数及获取结果集参数均存在硬编码”的问题,Mybatis也使用配置文件解决了该问题。(这里一般不和数据库配置信息在同一个配置文件中进行配置,因为数据库配置信息在一个项目中只配置一次,但sql语句等经常会发生变化)。
  4. 对于结果集的封装操作,Mybatis使用反射和内省进行解决。

以上几点说明了用Mybatis的好处,不过Mybatis其实也只是对JDBC进行了封装,说到底原理还是和JDBC一样,只是Mybatis用起来更加高效率。

Mybatis学习之自定义持久层框架(一) 为什么要用框架而不直接用JDBC?的更多相关文章

  1. Mybatis学习之自定义持久层框架(七) 自定义持久层框架优化

    前言 接上文,这里只是出于强迫症,凭借着半年前的笔记来把之前没写完的文章写完,这里是最后一篇了. 前面自定义的持久层框架存在的问题 Dao层若使用实现类,会存在代码重复,整个操作的过程模版重复(加载配 ...

  2. Mybatis学习之自定义持久层框架(三) 自定义持久层框架:读取并解析配置文件

    前言 前两篇文章分别讲解了JDBC和Mybatis的基本知识,以及自定义持久层框架的设计思路,从这篇文章开始,我们正式来实现一个持久层框架. 新建一个项目 首先我们新建一个maven项目,将其命名为I ...

  3. Mybatis学习之自定义持久层框架(二) 自定义持久层框架设计思路

    前言 上一篇文章讲到了JDBC的基本用法及其问题所在,并提出了使用Mybatis的好处,那么今天这篇文章就来说一下该如何设计一个类似Mybatis这样的持久层框架(暂时只讲思路,具体的代码编写工作从下 ...

  4. Mybatis学习之自定义持久层框架(六) 自定义持久层框架:完善CRUD方法并进行测试

    前言 没想到会等到半年以后才来写这篇文章,我已经不记得当初自己想要在这篇文章中写什么了,还好有一些零散的笔记留着,就对照着上一篇文章及零散的笔记,把内容给补充完吧. 完善CRUD方法 完善Defaul ...

  5. Mybatis学习之自定义持久层框架(五) 自定义持久层框架:封装CRUD操作

    前言 上一篇文章我们完成了生产sqlSession的工作,与数据库的连接和创建会话的工作都已完成,今天我们可以来决定会话的内容了. 封装CRUD操作 首先我们需要创建一个SqlSession接口类,在 ...

  6. Mybatis学习之自定义持久层框架(四) 自定义持久层框架:生产sqlSession

    前言 上一回我们完成了数据库配置文件的读取和解析工作,有了这些准备工作,我们就可以与数据库创建连接和会话了,所谓sqlSession就是数据库的会话,一切增删查改操作都是在与数据库的会话中完成,下面我 ...

  7. Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架

    目录 任务一:自定义持久层框架 1.1 JDBC回顾及问题分析 1.2 自定义持久层框架思路分析 1.3 IPersistence_Test编写 1.3.1 XXXMapper.xml详解 1.3.2 ...

  8. 【笔记】拉勾Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架

    以下笔记是我看完视频之后总结整理的,部分较为基础的知识点也做了补充,如有问题欢迎沟通. 目录 任务一:自定义持久层框架 1.1 JDBC回顾及问题分析 1.2 自定义持久层框架思路分析 1.3 IPe ...

  9. MyBatis(四):自定义持久层框架优化

    本文所有代码已上传至码云:https://gitee.com/rangers-sun/mybatis 修改IUserDao.UserMapper.xml package com.rangers; im ...

随机推荐

  1. python常见错误和异常

    1.BaseExeception 所有异常的基类 2.SystemEixt 解释器请求退出 3.KeyboardInterrupt 用户中断执行 4.Exception 常规错误的基类 5.StopI ...

  2. JVM之基础概念(运行时数据区域、TLAB、逃逸分析、分层编译)

    运行时数据区域 JDK8 之前的内存布局 JDK8 之后的 JVM 内存布局 JDK8 之前,Hotspot 中方法区的实现是永久代(Perm),JDK8 开始使用元空间(Metaspace),以前永 ...

  3. Apache JMeter 5.4.1 Build Development

                    1. 说明 经过漫长的等待终于将开发环境搭建成功了!网络慢真的是伤不起!grade,确实要比maven简洁.....嗯!真香! 2. 工具准备 JDK1.8+ 这... ...

  4. 搞懂 ZooKeeper 集群的数据同步

    本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...

  5. 【linux】驱动-9-设备树插件

    目录 前言 9. Linux设备树插件 9.1 格式 9.2 设备树插件的编译和加载 9.2.1 单独使用dtc工具编译 9.2.2 内核dtc工具编译设备树插件 9.2.3 加载设备树插件 9.2. ...

  6. Recoil 中多级数据联动及数据重置的合理做法

    前情回顾 书接上回,前面引出了在数据存在级联的情况下,各下拉框之间的默认值及值变化的处理.简单回顾一下: 场景是: 地域下拉决定可选的可用区 默认选中第一个地域,通过设置 atom 的 default ...

  7. 周爱民带你深入剖析JavaScript核心原理

    作为前端工程师必备技能,JavaScript 的重要性不言而喻.虽然易上手,但却有着诸多复杂微妙的机制,想要真正掌握绝非易事. 专栏面向JavaScript语言的实际应用者与深度爱好者,以讲述Java ...

  8. Leedcode算法专题训练(分治法)

    归并排序就是一个用分治法的经典例子,这里我用它来举例描述一下上面的步骤: 1.归并排序首先把原问题拆分成2个规模更小的子问题. 2.递归地求解子问题,当子问题规模足够小时,可以一下子解决它.在这个例子 ...

  9. 跟我一起学Go系列:从写测试用例开始仗剑走天涯

    从入门到深入 Go 我们已经走了很长的路,当你想启动多个测试类的时候你是不是想启动多个 main 方法,但是 Go 限制了在同一个 package 下只能有一个 main,所以这条路你是走不通的.那我 ...

  10. 【NCRE】三级网络技术 选择题易错点记录(1)

    部分易错点 连接到一个集线器的多个节点不能同时发送数据帧 嵌入式安装插座用来连接双绞线 异步串行端口 PPP 同步串行端口 PPP/HPLC 对于频繁改变位置并使用DHCP获取IP地址的DNS客户端, ...