JDBC およびデータベース接続プール - 2 つのツール クラス - JDBCUtilsByDruid および BasicDAO

JDBC およびデータベース接続プール - 2 つのツール クラス - JDBCUtilsByDruid および BasicDAO

まとめ記事です。

1. 学習手法の概要

1.1. jdbcの紹介

mysql インタラクションの学習の面では、 JDBC インターフェイスの学習が最初に紹介されましたインポートされた jar パッケージは次のとおりですmysql-connector-java-5.1.37-bin.jar

jdbc を書くアイデアは次のとおりです。

  • ドライバーを登録する
    Driver driver=new Driver();
  • 接続を取得します [ここには 5 つの方法がありますが、次の 5 番目の方法をお勧めします。 ]
    String url="jdbc:mysql://localhost:3306/hsp_db02";
    Properties properties = new Properties();
    //说明 user 和 password 是规定好,后面的值根据实际情况写
    properties.setProperty("user", "root");// 用户
    properties.setProperty("password", "123456"); //密码

    Connection connect=driver.connect(url,properties);
  • SQL 命令を送信し、追加、削除、および変更クエリを実行します [ステートメントは SQL によって挿入されます。PreparedStatement 前処理を使用することをお勧めします]
    String sql = "delete from actor where id = 1";
    //statement 用于执行静态 SQL 语句并返回其生成的结果的对象
    Statement statement = connect.createStatement();//这种方法容易被SQL注入
    int rows = statement.executeUpdate(sql); // 如果是 dml 语句,返回的就是影响行数
    System.out.println(rows > 0 ? "成功" : "失败");
  • 接続を解除します。
statement.close();
connect.close();

接続を取得する 5 番目の方法は、データベース構成情報をプロパティ ファイルに書き込み、FileInpuStream ストリームを通じて構成ファイルを読み取ることです。

画像

		Properties properties = new Properties();
        properties.load(new FileInputStream("src\\jdbc.properties"));//读取配置文件

        String url= properties.getProperty("url");
        String username= properties.getProperty("username");
        String password= properties.getProperty("password");

        Connection conn = DriverManager.getConnection(url, username, password);//通过DriverManager获取连接

1.2. ResultSet[結果セット]

1.1jdbcの導入では、挿入、削除、および変更の関数が示されています。これら 3 つの関数はdml 操作と呼ばれているためです。dml 操作は、操作された行数を返します。レコードまたはテーブル レコードの複数行をクエリする必要がある場合は、 、その後、ResultSet [結果セット]を使用する必要があります。

ここでは、 ResultSet[結果セット]を紹介します。

 @Test
    public void zuoye01() throws ClassNotFoundException, IOException, SQLException {
    
    
        Class.forName("com.mysql.jdbc.Driver");//可写可不写,自动注册驱动类

        //读取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\jdbc.properties"));
        //获取连接
        String url= properties.getProperty("url");
        String username= properties.getProperty("username");
        String password = properties.getProperty("password");

        Connection coon = DriverManager.getConnection(url, username, password);//这里面已经完成了注册Driver驱动类了,所以第一句可写可不写

        //sql
        String sql="select * from news";

        PreparedStatement preparedStatement = coon.prepareStatement(sql);//这里不用statement了,使用PreparedStatement预处理**
        ResultSet resultSet = preparedStatement.executeQuery();//返回**ResultSet[结果集]**
       
        //【!】下面这个返回集操作太麻烦了,后面通过Apache公司的DBUtils工具进行封装,可以看目录
        while (resultSet.next()){
    
    
            int id = resultSet.getInt("id");
            String content = resultSet.getString("content");
            System.out.println(id+"\t"+content);
        }


        //关闭连接
       preparedStatement.close();
       coon.close();
    }

画像

1.3APIの概要

ここに画像の説明を挿入します

2. データベース接続プール

従来の jdbc テクノロジには、データベースに接続するときに次の問題があります。

画像

画像

選択したデータベース接続プールはDruid データベース接続プールで、jar が導入されていますdruid-1.2.8.jar

この Druid データベース接続プールを使用する目的は、データベース接続を取得することですが、次の Druid ベースの JDBCUtils ツール クラスは、この問題を解決します。

private static DataSource ds;
//在静态代码块完成 ds 初始化
static {
    
    
Properties properties = new Properties();
try {
    
    
properties.load(new FileInputStream("src\\druid.properties"));
ds = DruidDataSourceFactory.createDataSource(properties);//通过工厂获取数据库连接池对象
} catch (Exception e) {
    
    
e.printStackTrace();
}
}
//编写 getConnection 方法
public static Connection getConnection() throws SQLException {
    
    
return ds.getConnection();
}


connection = JDBCUtilsByDruid.getConnection();//获取数据库连接的方法变简单了,效率高了。

3. Apache の DBUtils ツール - BasicDAO [重要!

このツールは、ResultSet [結果セット] のカプセル化jdbc のカプセル化の問題を解決するためのもので、DBUtils とデータベース接続プール (Druid) を組み合わせたものです

apache-DBUtils ツール クラス + druid:

画像

画像

BasicDAO.java:

package com.linghu.dao;

import com.linghu.utils.JDBCUtilsByDruid;

import jdk.nashorn.internal.scripts.JD;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * @author 令狐荣豪
 * @version 1.0
 */
public class BasicDAO<T> {
    
    
    private QueryRunner qr=new QueryRunner();

    /**
     * 修改-表-记录的操作。
     * @param sql
     * @param parameters
     * @return
     */
    public int update(String sql,Object... parameters){
    
    
        Connection connection=null;

        try {
    
    
           connection= JDBCUtilsByDruid.getConnection();

            int update = qr.update(connection, sql, parameters);

            return update;

        } catch (SQLException e) {
    
    
            throw new RuntimeException(e);
        } finally {
    
    
            JDBCUtilsByDruid.close(null,null,connection);
        }
    }

    /**
     *查询多行多列的操作,返回多行
     * @param sql
     * @param clazz 传入一个类的Class对象,比如Actor.class[反射机制]
     * @param parameters
     * @return 根据Actor.class返回对应的ArrayList集合
     */
     public List<T> queryMulti(String sql,Class<T> clazz,Object... parameters){
    
    

       Connection connection=null;

         try {
    
    
             connection=JDBCUtilsByDruid.getConnection();
             return qr.query(connection,sql,new BeanListHandler<T>(clazz),parameters);
         } catch (SQLException e) {
    
    
             throw new RuntimeException(e);
         } finally {
    
    
             JDBCUtilsByDruid.close(null,null,connection);
         }

     }

    /**
     * 查询单行多列的操作,返回单行多列
     * @param sql
     * @param clazz
     * @param parameters
     * @return
     */
     public T querySingle(String sql,Class<T> clazz,Object...parameters){
    
    
         Connection connection=null;
         try {
    
    
             connection= JDBCUtilsByDruid.getConnection();
            return qr.query(connection,sql,new BeanHandler<T>(clazz),parameters);
         } catch (SQLException e) {
    
    
             throw new RuntimeException(e);
         } finally {
    
    
             JDBCUtilsByDruid.close(null,null,connection);
         }
     }

    /**
     * 查询单行单列,返回单行单列,返回单值的方法
     * @param sql
     * @param parameters
     * @return 返回单值
     */
     public Object queryScalar(String sql,Object... parameters){
    
    

         Connection connection=null;

         try {
    
    
             connection= JDBCUtilsByDruid.getConnection();
             Object query = qr.query(connection, sql, new ScalarHandler(), parameters);
             return query;
         } catch (SQLException e) {
    
    
             throw new RuntimeException(e);
         } finally {
    
    
             JDBCUtilsByDruid.close(null,null,connection);
         }
     }



}

4. Druid ベースの JDBCUtils ツール クラス - **JDBCUtilsByDruid [重要!

このツール クラスは、 jdbc での接続の確立と解放をカプセル化しますこのツール クラスを使用すると、接続オブジェクト connect をより簡単に取得できるようになります。

画像

ドルイドのプロパティ:

driverClassName=com.mysql.jdbc.Driver
#URL??????URL???travel????????????????????????????
url=jdbc:mysql://localhost:3306/mhl?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
characterEncoding=utf-8
#??mysql??????????
username=root
password=123456
#??????????
initialSize=5
#???????
maxActive=10
#???????????
maxWait=3000
#???????????sql
validationQuery=SELECT 1
#??????
testWhileIdle=true

JDBCUtilsByDruid.java:

package com.linghu.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @Package: com.linghu.utils
 * @ClassName: JDBCUtilsByDruid
 * @Author: linghu
 * @CreateTime: 2023/3/30 16:27
 * @Description: 基于Druid(德鲁伊)的 JDBCUtils 工具类
 */
public class JDBCUtilsByDruid {
    
    


    private static  DataSource dataSource;

    static {
    
    
        Properties properties = new Properties();
        try {
    
    
            properties.load(new FileInputStream("src\\jdbc.properties"));
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

    //方法1:获取德鲁伊连接池的“连接”的getConnection 方法
    public static Connection getConnection() throws SQLException {
    
    
        return dataSource.getConnection();
    }

    //方法2:断开与德鲁伊连接池的"连接"
    public static void close(ResultSet resultSet, Statement statement,Connection connection){
    
    
        try {
    
    
            if(resultSet != null){
    
    
                resultSet.close();
            }
            if (statement != null) {
    
    
                statement.close();
            }
            if (connection != null) {
    
    
                connection.close();
            }
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        }
    }
}

おすすめ

転載: blog.csdn.net/weixin_43891901/article/details/130980037
おすすめ