Mybatis学习之自定义持久层框架(一) 为什么要用框架而不直接用JDBC?
前言
说起Mybatis,相信大家都不会感到陌生,它是一款优秀的持久层框架,应用于java后端开发中,为客户端程序提供访问数据库的接口。
我们都知道,JDBC是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。这也就是Mybatis所具备的功能,那既然已经有了JDBC了,为什么还要用Mybatis呢?
原因很简单,因为单纯使用JDBC进行开发会出现效率低下、耗费资源及影响程序拓展性等问题。
JDBC基本用法及问题分析
首先来看一下使用JDBC对数据库进行访问的一段代码:
- 1 import java.sql.*;
- 2
- 3 public class JDBCTest {
- 4
- 5 public static final String URL = "jdbc:mysql://localhost:3306/mybatis_study?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
- 6 public static final String USER = "root";
- 7 public static final String PASSWORD = "root";
- 8
- 9 public static void main(String[] args) throws Exception {
- 10 Connection connection = null;
- 11 PreparedStatement preparedStatement = null;
- 12 ResultSet resultSet = null;
- 13 User user = new User();
- 14
- 15 try {
- 16 // 加载数据库驱动
- 17 /* 注意事项:
- 18 1、这里需要提前找好mysql驱动的jar包,复制到项目库中,或者直接通过maven导入。
- 19 2、注意jar包版本要与本机的mysql一致。
- 20 没有做到以上两点必然会报错。*/
- 21 Class.forName("com.mysql.cj.jdbc.Driver");
- 22 // 获取数据库连接
- 23 connection = DriverManager.getConnection(URL, USER, PASSWORD);
- 24 // 定义sql语句
- 25 String selectSql = "select * from user where username = ?";
- 26 // 获取预处理statement
- 27 preparedStatement = connection.prepareStatement(selectSql);
- 28 // 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
- 29 preparedStatement.setString(1, "hardy");
- 30 // 向数据库发出sql执行查询,查询出结果集
- 31 resultSet = preparedStatement.executeQuery();
- 32 // 遍历查询结果集
- 33 while (resultSet.next()) {
- 34 int id = resultSet.getInt("id");
- 35 String username = resultSet.getString("username");
- 36 // 封装User
- 37 user.setId(id);
- 38 user.setUsername(username);
- 39 }
- 40 System.out.println(user);
- 41
- 42 } catch (Exception e) {
- 43 e.printStackTrace();
- 44 } finally {
- 45 // 释放资源
- 46 if (resultSet != null) {
- 47 try {
- 48 resultSet.close();
- 49 } catch (SQLException e) {
- 50 e.printStackTrace();
- 51 }
- 52 }
- 53
- 54 if (preparedStatement != null) {
- 55 try {
- 56 preparedStatement.close();
- 57 } catch (SQLException e) {
- 58 e.printStackTrace();
- 59 }
- 60 }
- 61
- 62 if (connection != null) {
- 63 try {
- 64 connection.close();
- 65 } catch (SQLException e) {
- 66 e.printStackTrace();
- 67 }
- 68 }
- 69 }
- 70 }
- 71 }
代码运行结果:
观察上述代码,不难发现以下问题:
- 数据库配置信息存在硬编码问题。(当我们从mysql数据库切换到oracle数据库时,代码中的数据驱动信息和数据库连接信息都需要修改。)
- 需要频繁创建和释放数据库连接。
- sql语句、设置参数及获取结果集参数均存在硬编码问题。(不同数据库的sql语法,参数及结果集参数均有所不同)
- 需要手动封装返回结果集。
为什么要用Mybatis?
针对JDBC存在的问题,来解释一下为什么要使用Mybatis:
- Mybatis使用配置文件加载数据库配置信息,很好地解决了硬编码问题。
- 对于创建和释放数据库连接等步骤,Mybatis直接使用连接池进行解决。
- 针对“sql语句、设置参数及获取结果集参数均存在硬编码”的问题,Mybatis也使用配置文件解决了该问题。(这里一般不和数据库配置信息在同一个配置文件中进行配置,因为数据库配置信息在一个项目中只配置一次,但sql语句等经常会发生变化)。
- 对于结果集的封装操作,Mybatis使用反射和内省进行解决。
以上几点说明了用Mybatis的好处,不过Mybatis其实也只是对JDBC进行了封装,说到底原理还是和JDBC一样,只是Mybatis用起来更加高效率。
Mybatis学习之自定义持久层框架(一) 为什么要用框架而不直接用JDBC?的更多相关文章
- Mybatis学习之自定义持久层框架(七) 自定义持久层框架优化
前言 接上文,这里只是出于强迫症,凭借着半年前的笔记来把之前没写完的文章写完,这里是最后一篇了. 前面自定义的持久层框架存在的问题 Dao层若使用实现类,会存在代码重复,整个操作的过程模版重复(加载配 ...
- Mybatis学习之自定义持久层框架(三) 自定义持久层框架:读取并解析配置文件
前言 前两篇文章分别讲解了JDBC和Mybatis的基本知识,以及自定义持久层框架的设计思路,从这篇文章开始,我们正式来实现一个持久层框架. 新建一个项目 首先我们新建一个maven项目,将其命名为I ...
- Mybatis学习之自定义持久层框架(二) 自定义持久层框架设计思路
前言 上一篇文章讲到了JDBC的基本用法及其问题所在,并提出了使用Mybatis的好处,那么今天这篇文章就来说一下该如何设计一个类似Mybatis这样的持久层框架(暂时只讲思路,具体的代码编写工作从下 ...
- Mybatis学习之自定义持久层框架(六) 自定义持久层框架:完善CRUD方法并进行测试
前言 没想到会等到半年以后才来写这篇文章,我已经不记得当初自己想要在这篇文章中写什么了,还好有一些零散的笔记留着,就对照着上一篇文章及零散的笔记,把内容给补充完吧. 完善CRUD方法 完善Defaul ...
- Mybatis学习之自定义持久层框架(五) 自定义持久层框架:封装CRUD操作
前言 上一篇文章我们完成了生产sqlSession的工作,与数据库的连接和创建会话的工作都已完成,今天我们可以来决定会话的内容了. 封装CRUD操作 首先我们需要创建一个SqlSession接口类,在 ...
- Mybatis学习之自定义持久层框架(四) 自定义持久层框架:生产sqlSession
前言 上一回我们完成了数据库配置文件的读取和解析工作,有了这些准备工作,我们就可以与数据库创建连接和会话了,所谓sqlSession就是数据库的会话,一切增删查改操作都是在与数据库的会话中完成,下面我 ...
- Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架
目录 任务一:自定义持久层框架 1.1 JDBC回顾及问题分析 1.2 自定义持久层框架思路分析 1.3 IPersistence_Test编写 1.3.1 XXXMapper.xml详解 1.3.2 ...
- 【笔记】拉勾Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架
以下笔记是我看完视频之后总结整理的,部分较为基础的知识点也做了补充,如有问题欢迎沟通. 目录 任务一:自定义持久层框架 1.1 JDBC回顾及问题分析 1.2 自定义持久层框架思路分析 1.3 IPe ...
- MyBatis(四):自定义持久层框架优化
本文所有代码已上传至码云:https://gitee.com/rangers-sun/mybatis 修改IUserDao.UserMapper.xml package com.rangers; im ...
随机推荐
- python常见错误和异常
1.BaseExeception 所有异常的基类 2.SystemEixt 解释器请求退出 3.KeyboardInterrupt 用户中断执行 4.Exception 常规错误的基类 5.StopI ...
- JVM之基础概念(运行时数据区域、TLAB、逃逸分析、分层编译)
运行时数据区域 JDK8 之前的内存布局 JDK8 之后的 JVM 内存布局 JDK8 之前,Hotspot 中方法区的实现是永久代(Perm),JDK8 开始使用元空间(Metaspace),以前永 ...
- Apache JMeter 5.4.1 Build Development
1. 说明 经过漫长的等待终于将开发环境搭建成功了!网络慢真的是伤不起!grade,确实要比maven简洁.....嗯!真香! 2. 工具准备 JDK1.8+ 这... ...
- 搞懂 ZooKeeper 集群的数据同步
本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...
- 【linux】驱动-9-设备树插件
目录 前言 9. Linux设备树插件 9.1 格式 9.2 设备树插件的编译和加载 9.2.1 单独使用dtc工具编译 9.2.2 内核dtc工具编译设备树插件 9.2.3 加载设备树插件 9.2. ...
- Recoil 中多级数据联动及数据重置的合理做法
前情回顾 书接上回,前面引出了在数据存在级联的情况下,各下拉框之间的默认值及值变化的处理.简单回顾一下: 场景是: 地域下拉决定可选的可用区 默认选中第一个地域,通过设置 atom 的 default ...
- 周爱民带你深入剖析JavaScript核心原理
作为前端工程师必备技能,JavaScript 的重要性不言而喻.虽然易上手,但却有着诸多复杂微妙的机制,想要真正掌握绝非易事. 专栏面向JavaScript语言的实际应用者与深度爱好者,以讲述Java ...
- Leedcode算法专题训练(分治法)
归并排序就是一个用分治法的经典例子,这里我用它来举例描述一下上面的步骤: 1.归并排序首先把原问题拆分成2个规模更小的子问题. 2.递归地求解子问题,当子问题规模足够小时,可以一下子解决它.在这个例子 ...
- 跟我一起学Go系列:从写测试用例开始仗剑走天涯
从入门到深入 Go 我们已经走了很长的路,当你想启动多个测试类的时候你是不是想启动多个 main 方法,但是 Go 限制了在同一个 package 下只能有一个 main,所以这条路你是走不通的.那我 ...
- 【NCRE】三级网络技术 选择题易错点记录(1)
部分易错点 连接到一个集线器的多个节点不能同时发送数据帧 嵌入式安装插座用来连接双绞线 异步串行端口 PPP 同步串行端口 PPP/HPLC 对于频繁改变位置并使用DHCP获取IP地址的DNS客户端, ...