自定义持久层框架MyORMFramework(一)—JDBC分析和解决思路

2022-11-24 20:58:44 浏览数 (1)

JDBC连接查询数据库

代码语言:javascript复制
package com.zjq.jdbc;

import com.zjq.entity.User;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 通过JDBC连接数据库
 * @author zjq
 * @date 2022/3/14
 */
public class JDBCConnect {

    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 通过驱动管理类获取数据库链接
            connection =
                    DriverManager.getConnection("jdbc:mysql://localhost:3306/my-orm-framework?characterEncoding=utf-8", "root", "root");
            // 定义sql语句?表示占位符
            String sql = "select * from user where username = ?";
            // 获取预处理statement
            preparedStatement = connection.prepareStatement(sql);
            // 设置参数,第⼀个参数为sql语句中参数的序号(从1开始),第⼆个参数为设置的参数值
            preparedStatement.setString(1, "zjq666888");
            // 向数据库发出sql执⾏查询,查询出结果集
            resultSet = preparedStatement.executeQuery();
            List<User> userList = new ArrayList<>(16);
            // 遍历查询结果集
            while (resultSet.next()) {
                User user = new User();
                Long id = resultSet.getLong("id");
                String username = resultSet.getString("username");
                String password = resultSet.getString("password");
                String phone = resultSet.getString("phone");
                // 封装User
                user.setId(id);
                user.setUsername(username);
                user.setPassword(password);
                user.setPhone(phone);
                userList.add(user);
            }
            System.out.println(userList);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

上述所需引入的jar如下:

代码语言:javascript复制
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.17</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
</dependency>

执行后控制台输出如下:

JDBC问题总结

原始jdbc开发存在的问题如下:

  1. 数据库连接创建、释放频繁造成系统资源浪费,从⽽影响系统性能。
  2. SQL语句在代码中硬编码,造成代码不易维护,实际应⽤中SQL变化的可能较⼤,SQL变动需要改变 Java代码。
  3. 使⽤PreparedStatement向占有位符号传参数存在硬编码,因为SQL语句的where条件不⼀定,可能多也可能少,修改SQL还要修改代码,系统不易维护。
  4. 对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成POJO对象解析⽐较⽅便。

问题解决思路

  1. 使⽤数据库连接池初始化连接资源。
  2. 将sql语句抽取到xml配置⽂件中。
  3. 使⽤反射、内省等底层技术,⾃动将实体与表进⾏属性与字段的⾃动映射。

0 人点赞