[JDBC] JDBC &&接続プール

目次

JDBCの概要

JDBCの実装手順

JDBCの関連APIの概要

    DriverManager:ドライブ管理オブジェクト

    接続:データベース接続オブジェクト

    ステートメント:SQLオブジェクトを実行します

    ResultSet:結果セットオブジェクト

    PreparedStatement:SQLオブジェクトを実行します

Druid接続プール

ハードコードされた方法:

ツールクラスを抽出し、構成ファイルを使用して接続プールを作成します


JDBCの概要

    JDBC:Javaデータベース接続。その役割は、海外でJavaを介してデータベースを操作することです。基本的に、すべてのリレーショナルデータベースを操作するための一連のルール(インターフェイス)を定義し、各データベースメーカーがこの一連のインターフェイスを実装して提供します。データベースがjarパッケージを駆動し、次にこのインターフェイス(JDBC)を使用して、jarパッケージの実装クラスを駆動するようにプログラムします。

JDBCの実装手順

    JDBCを実装する前に、まず(mysql-connection-java-5.1.37-bin)jarパッケージをインポートしてから、JDBCの6ステップの操作の実行を開始する必要があります。

jarパッケージリンク:

リンク:https 
://pan.baidu.com/s/1LsyTxuoDGrOh2cqNt9UfaQ抽出コード:nfn8

 

  • ドライバーを登録する
  • データベース接続オブジェクト、接続を取得します
  • SQLを定義する
  • SQLステートメントを実行するオブジェクトを取得します。
  • sqlを実行し、返された結果を受け取ります
  • プロセス結果
  • リソースを解放する 

 

ケースコード:

public void testSave() throws Exception {
        //1.注册驱动
        DriverManager.registerDriver(new Driver());
        String url = "jdbc:mysql://localhost:3306/student";
        String username = "root";
        String password = "root";
        //2.获得连接
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.获得语句执行者
        Statement st = connection.createStatement();
        //4.执行语句
        String sql = "INSERT INTO tab_account VALUES(NULL , 'rose' , '1000')";
        int count = st.executeUpdate(sql);
        //5.处理结果
        System.out.println(count);
        //6.释放资源
        st.close();
        connection.close();
    }
}

JDBCの関連APIの概要

    DriverManager:ドライブ管理オブジェクト

効果:

  • ドライバーを登録する

   static void registerDriver(ドライバードライバー):

   指定されたドライバーに登録するDriverManager

  (動的ロードクラス)を使用してコードを記述します:Class.forName( "com.mysql.jdbc.Driver")。

   ソースコードを表示すると、com.mysql.jdbc.Driverクラスに静的コードブロックがあることがわかります。

static{
    try{
        java.sql.DriverManager.registerDriver(new Driver);
    }catch(SQLException e){
        throw new RuntimeException("Can't register driver!");
    }
}

MySQL5の後のドライバーjarパッケージは、ドライバーを登録するステップを省略できます

  • データベース接続を取得する
方法:静的接続getConnection(String url、String user、String password)
パラメータ:
    url:接続のパスを指定します
        構文:jdbc:mysql:// ipアドレス(ドメイン名):ポート番号/データベース名
        詳細:ローカルのmysqlサーバーに接続していて、mysqlサーバーのデフォルトポートが3306の場合、URLは省略できます:jdbc:mysql:// database name
    ユーザー:データベースユーザー名
    パスワード:データベースパスワード

    接続:データベース接続オブジェクト

効果:

  • 実行されたSQLオブジェクトを取得します

ステートメントcreateStatement()

PreparedStatement prepareStatement(String sql)

  • 経営業務

トランザクションの開始:setAutoCommit(boolean autoCommit)は、このメソッドを呼び出してパラメーターをfalseに設定します。つまり、トランザクションを開始します。

トランザクションをコミットします:commit()

トランザクションをロールバックします:rollback()

    ステートメント:SQLオブジェクトを実行します

  • boolean execute(String sql):任意のSQLを実行できます   

  • int executeUpdate(String sql):DML(追加、削除、変更)ステートメントを実行します。戻り値は影響を受ける行数であり、DMLステートメントが正常に実行されたかどうかを判断します。

  • ResultSet executeQuery(String SQL):DQL(クエリ)ステートメントを実行します

    ResultSet:結果セットオブジェクト

  • boolean next():カーソルが1行下に移動して、最後の行の現在の終わり(データがあるかどうか)があるかどうかを判断します。ある場合はfalseを返し、ない場合はtrueを返します。
  • getXxxx(パラメータ):データを取得します
    • Xxx:getInt(int / String)、getString(int / String)などのデータタイプを表します
    • パラメータ
      • intは、1から始まる列の番号を表します。
      • 文字列:列の名前を表します     
  • 注意
    • 使用手順
      • カーソルを1行下に移動します
      • データがあるかどうかを判断する
      • データを取得する

    PreparedStatement:SQLオブジェクトを実行します

{SQLインジェクションを防ぎ、より効率的に}
  • SQLインジェクションの問題:SQLをスプライシングする場合、一部のSQL特殊キーワードが文字列のスプライシングに関与し、セキュリティ上の問題が発生します。
  • SQLインジェクションの問題を解決し、PreparedStatemetオブジェクトを使用して解決します
  • プリコンパイルされたSQL:プレースホルダーとしてのパラメーターの使用?
  • ステップ
    • ドライバjarパッケージmysql-connector-java-5.1.37-bin.jarをインポートします
    • ドライバーを登録する
    • データベース接続オブジェクトConnectionを取得します
    • SQLを定義する
      • 注:SQLパラメーターは?をプレースホルダーとして使用します。----> select * from user where username =?and password =?
    • 割当?
      • メソッド---> setXxx(パラメーター1、パラメーター2)
        • パラメータ1:位置のコーディングは1から始まります
        • パラメータ2 :?の値
    • SQLを実行し、返された結果を受け取ります。パラメーターを渡す必要はありません。
    • プロセス結果
    • リソースを解放する

JDBC初期パッケージケースコード:

構成ファイル:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///student
username=root
password=root
package com.james.Utils;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    static{
        //读取资源文件获取值
        try {
            //1 创建Properties集合类
            Properties properties = new Properties();
            //2 获取src路径下的文件的方式----->classLoader  类加载器
            ClassLoader classLoader=JDBCUtils.class.getClassLoader();
            URL res=classLoader.getResource("jdbc.properties");
            // 获取配置文件路径
            String path=res.getPath();
            //3 加载文件
            properties.load(new FileReader(path));
            //4 获取数据
            url=properties.getProperty("url");
            user=properties.getProperty("user");
         password=properties.getProperty("password");
            //5 注册驱动
         driver=properties.getProperty("driver");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /*
     * 获取连接对象的方法
     * */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

Druid接続プール

    接続プールはデータベースを格納するためのコンテナです。システムが初期化されると、コンテナが作成されます。コンテナは一部の接続オブジェクトに適用されます。ユーザーがデータベースにアクセスすると、接続オブジェクトがコンテナから取得されます。ユーザーがデータベースにアクセスすると、接続オブジェクトはに返されます。コンテナ。

利点:

  • リソースを節約し、サーバーの負荷を軽減します
  • 接続の再利用性と効率的なユーザーアクセスを改善します

ハードコードされた方法:

  • jarパッケージのリンクをインポートします。

https://pan.baidu.com/s/1lHnZJ-uPbEVwOuodV8poHA 

抽出コード:n04c

  • オブジェクトを作成する
  • データベース接続の4つの基本パラメーター(ドライバー、URL、ユーザー名、パスワード)を構成します
  • その他のパラメータ(接続の最大数、アイドル接続の最小数、接続を取得するための最大待機時間)を設定します
  • 接続プールオブジェクトを介して接続を取得します
  • 接続を使用する
  • 接続を呼び出すと、close()は接続を返すことができます
public class DRUIDDemo {
    @Test
    //硬编码,所有的配置都写到java代码中
    public void test1() throws SQLException {
        //1. 创建对象
        DruidDataSource ds = new DruidDataSource();

        //2. 设置数据库连接的4个基本参数(驱动,url,username,password)
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql:///student");
        ds.setUsername("root");
        ds.setPassword("1234");

        //3. 设置其他的参数(最大连接的数量,最小连接空闲数量,获取连接最大等待时间)
        ds.setMaxActive(10);
        ds.setMinIdle(2);
        ds.setMaxWait(2000);

        //获取11个连接 ,会出现重复的连接
        for (int i = 1; i <12 ; i++) {
            //4. 通过连接池对象获取连接
            Connection conn = ds.getConnection();
            //5. 使用连接
            System.out.println(conn);

            if (i%7==0){
                //6. 调用连接close()就可以归还连接
                conn.close();
            }
        }
    }
}

ツールクラスを抽出し、構成ファイルを使用して接続プールを作成します

ツール:

package com.james.b_utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * 连接池的工具类
 * 1.获得连接
 * 2.释放资源(归还连接)
 */
public class DruidUtils {
    //1.准备数据源
    private static DataSource dataSource = null ;

    //2.static静态代码块初始化连接池
    static {
        try {
            //加载流
            InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("db.properties");
            //创建properties
            Properties properties = new Properties();
            //加载数据
            properties.load(is);
            //实例化连接池
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 从池中获得连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

xml構成ファイル(srcフォルダーの下):

#此处的properties 的key不能瞎写
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///student
username=root
password=root
initialSize=3
maxActive=10
maxWait=3000
package com.james.b_utils;
import java.sql.Connection;
import java.sql.SQLException;
public class TestDemo {
    public static void main(String[] args) throws SQLException {
        for(int i = 1 ; i <= 11 ; i++ ){
            Connection connection = DruidUtils.getConnection();
            System.out.println(i+"@@"+connection);
            if(i==5){
                //归还第五个连接
                connection.close();//连接池对close方法都进行重写了
            }
        }
    }
}

 

おすすめ

転載: blog.csdn.net/weixin_43267344/article/details/108795662