前言

说起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 }

代码运行结果:

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

  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. java重写toString()方法

    toString()方法是Object类的方法,调用toString()会返回对象的描述信息. 1)为什么重写toString()方法呢? 如果不重写,直接调用Object类的toString()方法 ...

  2. 归并排序(JAVA语言)

    public class merge { public static void main(String[] args) { // TODO Auto-generated method stub int ...

  3. c++ 反汇编 构造函数和析构函数

    构造函数和析构函数出现的时机 局部对象 109: // 局部对象定义调用构造函数 110: 111: CNumber Number; 00C8A37D 8D 4D EC lea ecx,[Number ...

  4. NetCore的缓存使用详例

    关于我 作者博客|文章首发 缓存基础知识 缓存可以减少生成内容所需的工作,从而显著提高应用程序的性能和可伸缩性. 缓存最适用于不经常更改的 数据,生成 成本很高. 通过缓存,可以比从数据源返回的数据的 ...

  5. windows平台rust安装

    1.安装目录环境变量 RUSTUP_HOME D:\WorkSoftware\Rust\cargo CARGO_HOME D:\WorkSoftware\Rust\rustup 2.安装下载加速环境变 ...

  6. java学习(更新中)

    class Test { public static void main(String[] args) { System.out.println("Hello World!"); ...

  7. 删除文件--rm

    rm file         删除文件 rm -r dir      删除指定文件夹及文件夹下的所有内容 rm -rf dir     强制删除指定文件夹及文件夹下的所有内容

  8. Python数据分析入门(十四):数据分析中常用图

    折线图: 折线图用于显示数据在一个连续的时间间隔或者时间跨度上的变化,它的特点是反映事物随时间或有序类别而变化的趋势.示例图如下: 折线图应用场景: 折线图适合X轴是一个连续递增或递减的,对于没有规律 ...

  9. Dynamics CRM字段安全配置文件

    在实施Dynamics CRM的过程中,有些需求会提到部分字段针对特殊的人员或者团队进行显示.更新以及创建的需求的控制.这里我们就需要用到字段安全性文件这个功能.此功能针对具体实体的字段进行配置可以达 ...

  10. Java性能调优实战,覆盖80%以上调优场景

    Java 性能调优对于每一个奋战在开发一线的技术人来说,随着系统访问量的增加.代码的臃肿,各种性能问题便会层出不穷. 日渐复杂的系统,错综复杂的性能调优,都对Java工程师的技术广度和技术深度提出了更 ...