jdbc は親クラスをカプセル化してコードの重複を減らします

1. レビュー

1. jdbc -- クエリ機能。
2. sql インジェクションのセキュリティ問題の解決
   (1) ドライバのロード: Class.forName("mysql driver name"); 
   (2) 接続オブジェクトの取得: Connection conn=DriverManager.getConnection(url,u,pass) ; 
   (3 ) SQL ステートメントを実行するオブジェクトを取得します: 
      PreparedStatement ps=conn.prepareStatement(sql);//SQL をプリコンパイルします
   (4) 
      ps.setXXX(index,value) をプレースホルダーに割り当てます; //index: インデックスを示しますプレースホルダーの . value: 
   SQL ステートメントを実行するためのプレースホルダー (5) の値を表します。
       ps.executeUpdate();//追加、削除、変更の sql ResultSet を実行します rs=ps.executeQuery 
       ( 
       );//クエリの sql を実行します
   (6) ResultSet の内容をトラバースします。)){ //判定ポインタ移動可否、移動可の場合はレコードの次行へ移動
            rs.getXXX("列名"); //現在行の指定列の値を取得する。
       }

2. テキスト

1. クエリの結果を対応するエンティティにカプセル化します。
2. 各テーブルの操作を対応するクラスにカプセル化します。
3. 抽象操作クラスの共通の親クラス。

3. クエリの結果を対応するエンティティにカプセル化します。

注: ここではクエリ結果をコンソールに直接出力していますが、実際の開発ではクエリ結果をブラウザの Web ページに表示する必要があり、その効果は次のようになります。

 クエリ結果をカプセル化する方法。

1. データベース内の各テーブルを、エンティティ クラスと呼ばれるクラスにカプセル化します。
2. テーブルの列をエンティティ クラスの属性としてカプセル化します。
3. テーブル内の各レコードは、エンティティ クラスのオブジェクトにカプセル化されます。
4. テーブル内の複数のレコードがコレクション ArrayList にカプセル化されます。

public class User {
    プライベート int id; 
    プライベート文字列名; 
    プライベート文字列パスワード; 

    public User() { 
    } 

    @Override 
    public String toString() { 
        return "User{" + 
                "id=" + id + 
                ", name='" + name + '\'' + 
                ", password='" + password + '\'' + 
                '}'; 
    } 

    public int getId() { 
        ID を返します。
    } 

    public void setId(int id) { 
        this.id = id; 
    } 

    public String getName() {
        名前を返します。

        this.name = 名前; 
    } 

    public String getPassword() {
        パスワードを返します。
    } 

    public void setPassword(String password) { 
        this.password = パスワード; 
    } 

    public User(int id, String name, String password) { 
        this.id = id; 
        this.name = 名前; 
        this.password = パスワード; 
    } 
}

@Test

    public void testSelect() throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai";
        String user = "root";
        String password = "root";
        Connection connection = DriverManager.getConnection(url, user, password);
        String sql = "select * from tb_dept"; //因为这里没有占位符 所以可以不用为占位符赋值
        PreparedStatement ps= connection.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
​
        List<Dept> list = new ArrayList<>(); //集合存放数据库表中所有记录
        while (rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            //创建一个实体类对象 存储表中的一条记录。
            Dept d = new Dept();
            d.setId(id);
            d.setName(name);
​
            list.add(d);
        }
        System.out.println(list); //正常再开发中应该把该对象list返回给前端。
    }
    @Test
    public void testSelectOne() throws Exception{
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai";
        String user = "root";
        String password = "root";
        Connection connection = DriverManager.getConnection(url, user, password);
        String sql = "select * from tb_dept where id=?"; //这里根据id查询的结果一定是一条记录。因为id是主键。
        PreparedStatement ps= connection.prepareStatement(sql);
        ps.setInt(1,9);
​
        ResultSet rs = ps.executeQuery();
        Dept d=null;//声明部门实体类对象。
        while (rs.next()){
            d =  new Dept(); //因为进入该语句表示从数据库中查询到相应的记录了。
            int id = rs.getInt("id");
            String name = rs.getString("name");
            d.setId(id);
            d.setName(name);
        }
​
        System.out.println(d); //以后可以把d返回给前端调用者
​
    }

クエリの結果が複数のレコードである場合は、ArrayList を使用して複数のレコードを格納し、各アイテムは引き続きエンティティ クラス オブジェクトを使用します。

クエリの結果が 1 つの項目であると判断された場合は、エンティティ クラスを直接使用します。

4. 各テーブルの操作を対応するクラスにカプセル化します。

思考: すべてのテーブル操作を 1 つのクラスに記述すると、このクラスのコードはますます重くなり、後のメンテナンスに不便になります. エンタープライズを実際に開発するときは、各テーブルで操作します.対応する操作クラス。

接尾辞は Dao -----Data access Object data access object layer

tb_dept は、tb_dept テーブルの追加、削除、変更、およびチェックのすべての操作を含む操作クラス DeptDao に対応します。

tb_student は、StudentDao


パッケージ com.ykq.dao; 
import
com.ykq.entity.Dept; 
import
java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql. ResultSet ; 
import java.util.ArrayList; 
import java.util.List; 
/
** 
 * @program: jdbc03 
 * @description: 
 * @author: Yan 
 Keqi2 * @create: 2022-05-06 14:56 
 * // Special tb_dept テーブルを操作するクラス。
 **/ 
public class DeptDao { 
private        
    String driverName="com.mysql.cj.jdbc.Driver"; 
    private String url="jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai";
    private String user="root"; 
    private String password="root"; 
//  id に従って部門情報を照会
    public Dept findOne(int id) throws Exception{ 
        Class.forName(driverName); 
        Connection connection = DriverManager.getConnection(url , user, password); 
        String sql = "select * from tb_dept where id=?"; //id に基づくクエリの結果はレコードである必要があります。id が主キーだからです。
        PreparedStatement ps= connection.prepareStatement(sql); 
        ps.setInt(1,id); 
ResultSet
        rs = ps.executeQuery(); 
        Dept d=null;//部門エンティティ クラス オブジェクトを宣言します。
        while (rs.next()){ 
            d = new Dept(); //このステートメントを入力することは、対応するレコードがデータベースからクエリされたことを意味するためです。
            d.setId(rs.getInt("id"));
  
            d.setName(rs.getString("name")); 
        } 
        return d; 
    }  
//
    クエリ操作 -- すべてをクエリ
    public List<Dept> findAll() throws Exception{ 
        List<Dept> list=new ArrayList<>(); 
        Class.forName(driverName); 
        Connection connection = DriverManager.getConnection(url,user,password); 
        String sql= "select * from tb_dept"; 
        PreparedStatement ps=connection.prepareStatement(sql); 
        ResultSet rs = ps.executeQuery(); 
while
        (rs.next( )){ 
            //エンティティ クラス オブジェクト ストレージ テーブルにレコードを作成します。
            Dept d = new Dept(); 
            d.setId(rs.getInt("id")); 
            d.setName(rs.getString(") 
            list.add(d); 
        } 
        return list; 
    } 
//
    操作を追加 - パラメータを渡しますか 
    public void insertDept(Dept dept) throws Exception{ //フロントエンドの入力部門情報を対応するエンティティ クラスにカプセル化します。
        Class.forName(driverName); 
        Connection connection = DriverManager.getConnection(url,user,password); 
        String sql = "tb_dept 値に挿入 (null,?)"; 
        PreparedStatement ps = connection.prepareStatement(sql); 
        ps.setObject( 1,dept.getName()); 
        ps.executeUpdate(); 
    } 
//
    削除操作 -- ID に従って削除
    public void delete(int id)throws Exception{ 
        Class.forName(driverName); 
        Connection connection = DriverManager.getConnection ( URL、ユーザー、パスワード);
        String sql = "id=? の tb_dept から削除"; 
        PreparedStatement ps = connection.prepareStatement(sql); 
        ps.setObject(1,id); 
        ps.executeUpdate(); 
    } 
}

5. try-catch-finally を使用して例外を処理する

//クエリ操作 -- すべてのクエリ
    public List<Dept> findAll() { 
        List<Dept> list = new ArrayList<>(); 
        try { 
            Class.forName(driverName); 
            connection = DriverManager.getConnection(url, user, password ); 
            String sql = "select * from tb_dept"; 
            ps = connection.prepareStatement(sql); 
            rs = ps.executeQuery(); 
            while (rs.next()) { 
                //エンティティ クラス オブジェクト格納テーブルにエントリを作成する記録。
                Dept d = new Dept(); 
                d.setId(rs.getInt("id")); 
                d.setName(rs.getString("name")); 
                list.add(d); 
            }
            exception.printStackTrace(); 
        } 最後に {
            試してください { 
                if(rs!=null){ 
                     rs.close(); 
                } 
                if(ps!=null){ 
                     ps.close(); 
                } 
                if(connection!=null){ 
                     connection.close(); 
                } 
            } catch (SQLException throwables) { 
                throwables.printStackTrace(); 
        リストを返し
            ます
    }

6. dao の public 親クラスを抽出します。

        親クラスを抽出する理由。

各テーブルの操作クラスをカプセル化するため、データベースには多くのテーブルがあり、多くの操作クラスがあり、これらの操作クラスにはいくつかの共通コードがあります.コードの冗長性を減らすために、親クラスが抽出されます。

package com.ykq.dao; 
import
java.sql.*; 
/
** 
 * @program: jdbc03 
 * @description: 
 * @author: Yan 
 Keqi2 * @create: 2022-05-07 14:08 
 * このクラスは親クラス。このクラスには、サブクラスにいくつかのパブリック プロパティとメソッドが含まれています。
 **/ 
public class BaseDao { 
    //public property 
    private String driverName = "com.mysql.cj.jdbc.Driver"; 
    private String url = "jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai" ; 
    private String user = "root"; 
    private String password = "root"; 
    protected PreparedStatement ps = null; // 異なるパッケージの下にある同じパッケージおよびサブクラスの保護されたメンバーは、この修飾子を使用できます
    protected Connection connection = null; 
    protected ResultSet rs =ヌル;
    //接続オブジェクトを取得します。
    public Connection getConn() throws Exception { //例外を処理しますか、それともここで例外をスローしますか。
        Class.forName(driverName); 
        connection = DriverManager.getConnection(url, user, password); 
        return connection; 
    } 
    //リソースを閉じるメソッド。
    public void closeAll(){ 
        try { 
            if(rs!=null){ //空かどうかを判断
                rs.close(); 
            } 
            if(ps!=null){ 
                ps.close(); 
            } 
            if(connection!= null ){ 
                connection.close(); 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        }
    } 
}

 追加、削除、および変更のためのパブリック メソッドを抽出します。

親クラス コード

// 
    public void edit(String sql,Object... params){ 
        try { 
            connection = getConn(); 
            // 偶発的な
            ps = connection.prepareStatement(sql); 
            // 割り当てplaceholder 
            for (int i=0;i<params.length;i++){ 
                ps.setObject(i+1, params[i]); 
            } 
            ps.executeUpdate(); 
        } catch (Exception e) { 
            e.printStackTrace() ; 
        } 最後に { 
            closeAll(); 
        } 
    }
 

 

サブクラス コード

//操作を追加します--パラメータを渡すかどうか
    public void insertDept(Dept dept) { //フロントエンドの入力部門情報を対応するエンティティ クラスにカプセル化します。
        String sql = "insert into tb_dept values(null,?,?)"; 
        edit(sql,dept.getName(),dept.getAddress()); 
    } 
//
    削除操作 -- ID に従って削除
    public void delete( int id) { 
        String sql = "id=? の tb_dept から削除"; 
        edit(sql,id); 
    }
 

テストクラスコード

 EmpDao empDao=new EmpDao();
    @Test
    public void add(){
        Emp emp=new Emp();
        emp.setName("第三方");
        emp.setAddress("df");
        empDao.add(emp);
    }
    @Test
    public void remove(){
        empDao.remove(22);
    }
    @Test
    public void update(){
        Emp emp=new Emp();
        emp.setName("电风扇");
        emp.setAddress("电饭锅 ");
        emp.setId(18);
        empDao.update(emp);
    }
    @Test
    public void query(){
        List<Emp> list= empDao.query();
        for (Emp e:list) {
            System.out.println(e);
        }

    }

おすすめ

転載: blog.csdn.net/ne_123456/article/details/124857222
おすすめ