zoukankan      html  css  js  c++  java
  • 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 }

    代码运行结果:

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

    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用起来更加高效率。

    作者:blayn
    出处:https://www.cnblogs.com/blayn/
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
  • 相关阅读:
    [CF603C] Lieges of Legendre
    [CF1070A] Find a Number
    [CF431D] Random Task
    2020牛客暑期多校训练营(第二场)C
    2020牛客暑期多校训练营(第二场)F
    2020牛客暑期多校训练营(第二场)D
    2020牛客暑期多校训练营(第一场)H
    [CF1000E] We Need More Bosses
    Java学习2 (ThreadLocal)
    Java复习1
  • 原文地址:https://www.cnblogs.com/blayn/p/12768268.html
Copyright © 2011-2022 走看看