ホームページ  >  記事  >  データベース  >  ネイティブ JDBC を使用するにはどうすればよいですか?

ネイティブ JDBC を使用するにはどうすればよいですか?

零下一度
零下一度オリジナル
2017-07-03 09:31:18993ブラウズ

JDBC
Java Database Connectivity (Java データベース接続) は、SQL ステートメントを実行するために使用される Java API です。
JDBC は、Java がデータベースにアクセスするための標準仕様であり、Java 言語で記述された一連のインターフェイスとクラスで構成されています。

ドライバー
ドライバーは、2 つのデバイスが通信し、特定の通信データ形式を満たすために、機器プロバイダーがデバイス用のドライバー ソフトウェアを提供するためのものです。ソフトウェアはデバイスとの通信に使用できます。

JDBC仕様 (4つのコアオブジェクトをマスター)
DriverManager: ドライバーの登録に使用されます
Connection: データベースと作成された接続を表します
Statement: データベースのSQL文を操作するオブジェクト
ResultSet: 結果セットまたは仮想テーブル

mysql が提供するドライバーを介して JDBC テクノロジーを使用し、データベースを操作する手順は次のとおりです:
1. ドライバーを登録します
使用しているドライバーを JVM に伝えます (mysql、oracle...)
DriverManager.registerDriver( new com.mysql.jdbc.Driver()); の使用は次の 2 つの理由から推奨されません
> ドライバーが 2 回登録されることになります。
> データベース ドライバー jar に強く依存します
解決策:
Class.forName("com.mysql.jdbc.Driver");
2. データベース接続を取得します
データベースは TCP プログラム サーバーであり、サーバーに接続します ( 3 ウェイ ハンドシェイクを通じて)
は、Java プログラムからデータベース サーバーへの接続パスを確立することと同等です
static Connection getConnection(String url, String user, String password)
指定されたデータベース URL への接続の確立を試みます。
パラメータの説明: url データベースに接続する必要がある場所 (Web アドレス) user ユーザー名 パスワード パスワード
例: getConnection("jdbc:mysql://localhost:3306/day06", "root", "root") ;
URL: SUN 企業とデータベース ベンダー間の契約。
jdbc:mysql://localhost:3306/day06
プロトコル サブプロトコル IP: ポート番号データベース
mysql: jdbc:mysql://localhost:3306/day04 または jdbc:mysql:///day14 (デフォルトのローカル接続)
oracle データベース: jdbc:oracle:thin:@localhost:1521:sid
3. executor オブジェクトを取得します
SQL ステートメントを実行するオブジェクト、その機能は SQL を実行することです
インターフェイスの実装はデータベース ドライバーにあります。データベースとのすべての対話は接続オブジェクトに基づいています。
Statement createStatement(); //SQL文を操作するためのオブジェクトを作成する
4. SQL文を実行して結果セットを取得する
executorオブジェクトを使用してSQL文を実行する
SQL文の結果セットを取得する(add, delete、modify: 整数、有効な行番号クエリを実行します :Return は結果セットです)
一般的なメソッド:
? intexecuteUpdate(String sql); -- ResultSet を実行します。 -select ステートメントを実行します。
? boolean use(String sql); --select が実行されて結果がある場合にのみ true を返し、他のステートメントを実行する場合は false を返します。
5. 結果セットの処理
ResultSet は実際には2 次元のテーブルを指すブール型の next() メソッドを呼び出すことができます。レコードの行が初めて呼び出されるとき、next() メソッドはこの時点でレコードの最初の行の位置を指します。 ResultSet が提供する getXXX(int col) メソッド (0 から始まるインデックスとは異なり、列は 1 Start から始まります) を使用して、指定された列のデータを取得できます:
rs.next();// first row
rs.getInt(1);// 最初の行と最初の列のデータを取得します
共通メソッド:
? Object getObject( int Index) / Object getObject(String name) 任意のオブジェクトを取得します
? Index)/ String getString(String name) 文字列を取得します
? int getInt(int Index)/int getInt(String name) 整数を取得します
? double getDouble(int Index)/ double getDouble(String name) 倍精度浮動小数点を取得します
6. リソースを解放します
IO ストリームと同様、使用後はすべてを閉じる必要があります。クローズする順序は、最初に取得してからクローズし、後で取得して最初にクローズすることです。
JDBC を使用してデータベース コードを追加、削除、変更、クエリするデモ:

  1 public static void main(String[] args) throws Exception {  2         //1.注册驱动  3         Class.forName("com.mysql.jdbc.Driver");  4         //2.获取数据库连接  5         String url = "jdbc:mysql://localhost:3306/mybase4";  6         String user = "root";  7         String password = "root"; 
  8         Connection conn = DriverManager.getConnection(url, user, password);  9         //3.获取执行者对象 10         Statement stat = conn.createStatement(); 11         //调用更新数据的方法 12         //update(stat); 13         //调用删除数据的方法 14         //delete(stat); 15         //调用增加数据的方法 16         //insert(stat); 17         //调用查询数据的方法 18         select(stat); 19         //6.释放资源 20         stat.close(); 21         conn.close(); 22     } 23  24     /* 25      * 使用JDBC技术,查询数据库中表的数据 26      */ 27     private static void select(Statement stat) throws Exception { 28         //拼接sql语句 29         String sql = "SELECT * FROM category"; 30         /* 31          * 4.执行sql语句 32          * 使用Statement中的方法 33          * ResultSet executeQuery(String sql) 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。 
 34          * 返回值ResultSet标准接口的实现类对象,实现类对象由mysql驱动提供,可以使用ResultSet接口接收 35          */ 36         ResultSet rs = stat.executeQuery(sql); 37         System.out.println(rs);//com.mysql.jdbc.JDBC4ResultSet@1acb189 38         /* 39          * 5.处理结果 40          * ResultSet中有一个方法 41          * boolean next() 将光标从当前位置向前移一行。 42          * 如果新的当前行有效,则返回 true;如果不存在下一行,则返回 false 
 43          * 如果有结果集返回true,若果没有结果集返回false 44          * 相当于迭代器中的hasNext方法 45          */ 46         while(rs.next()){ 47             /* 48              * next返回true,有结果集 49              * 取出结果集 50              * 使用ResultSet中的方法getXXX(参数); 51              * 参数: 52              *     int columnIndex:列所在的索引,从1开始 53              *     String columnLabel:列名 54              * 注意: 55              *     如果使用getInt,getDouble指定数据类型的方法,返回值就是对应的数据类型 56              *     如果使用getObject方法返回值是object类型(只是打印可用) 57              * 如果使用getString方法返回值是String类型 58              */ 59             /*int i1 = rs.getInt(1); 60             String s2 = rs.getString(2); 61             System.out.println(i1+"\t"+s2);*/ 62              63             //System.out.println(rs.getObject(1)+"\t"+rs.getObject(2)); 64             System.out.println(rs.getObject("cid")+"\t"+rs.getObject("cname")); 65             //5.释放资源 66             rs.close(); 67         } 68     } 69  70     /* 71      * 使用JDBC技术,对数据库中的表数据进行增加 72      */ 73     private static void insert(Statement stat) throws SQLException { 74         //拼接sql语句 75         String sql = "INSERT INTO category(cname) VALUES('玩具')"; 76         //4.执行sql语句 77         int row = stat.executeUpdate(sql); 78         //5.处理结果 79         if(row>0){ 80             System.out.println("增加数据成功!"); 81         }else{ 82             System.out.println("增加数据失败!"); 83         } 84          85     } 86  87     /* 88      * 使用JDBC技术,对数据库中的表数据进行删除 89      */ 90     private static void delete(Statement stat) throws Exception { 91         //拼接sql语句 92         String sql = "DELETE FROM category WHERE cid=5"; 93         //4.执行sql语句 94         int row = stat.executeUpdate(sql); 95         //5.处理结果 96         if(row>0){ 97             System.out.println("删除数据成功!"); 98         }else{ 99             System.out.println("删除数据失败!");100         }101     }102 103     /*104      * 使用JDBC技术,对数据库中的表数据进行更新105      */106     private static void update(Statement stat) throws Exception {107         //拼接sql语句108         String sql = "UPDATE category SET cname='鞋帽' WHERE cid=6";109         //4.执行sql语句110         int row = stat.executeUpdate(sql);111         //5.处理结果112         if(row>0){113             System.out.println("更新数据成功!");114         }else{115             System.out.println("更新数据失败!");116         }117     }
 1 JDBC工具类 2 “获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。 3 代码演示: 4 public class JDBCUtils { 5      6     //私有构造方法,防止外界创建对象调用方法 7     private JDBCUtils() { 8     } 9     10     //定义Connectionn变量11     private static Connection conn;12     13     //保证代码只执行一次,可以放入静态代码块中14     static{15         try {16             //注册驱动17             Class.forName("com.mysql.jdbc.Driver");18             //获取连接19             String url="jdbc:mysql://127.0.0.1:3306/mybase4";20             String user="root";21             String password = "root";22             conn = DriverManager.getConnection(url, user, password);23         } catch (Exception e) {24             //注意,如果连接数据库失败,停止程序25             throw new RuntimeException(e+"连接数据库失败");26         }27     }28     29     //创建一个静态方法,获取数据库连接对象,并返回30     public static Connection getConnection(){31         return conn;32     }33     34     /*35      * 创建一个静态方法,对资源进行释放36      * ResultSet rs37      * Statement stat38      * Connection conn39      */40     public static void close(ResultSet rs,Statement stat,Connection conn){41         try {42             if(rs!=null){43                 rs.close();44             }45         } catch (SQLException e) {46             e.printStackTrace();47         }48         try {49             if(stat!=null){50                 stat.close();51             }52         } catch (SQLException e) {53             e.printStackTrace();54         }55         try {56             if(conn!=null){57                 conn.close();58             }59         } catch (SQLException e) {60             e.printStackTrace();61         }62     }63 }

SQL インジェクションの問題
SQL インジェクション: ユーザーが入力した内容が SQL ステートメント構文の一部として使用され、元の SQL の本当の意味が変更されます。
ログインケースがあり、SQL ステートメントが次のようになっているとします。
SELECT * FROM user table WHERE NAME = ユーザーが入力したユーザー名 AND PASSWORD = ユーザーが入力したパスワード
この時点で、ユーザーが正しいアカウントを入力すると、番号とパスワードを入力し、情報を照会したら、ユーザーをログインさせます。ただし、ユーザーがアカウント番号 XXX とパスワードを入力すると: a'='a';
現時点では、上記のクエリ ステートメントは常に結果を生成できます。その後、ユーザーは直接ログインに成功します。これは SQL インジェクションの問題です。
この目的のために、PreparedStatement を使用して対応する問題を解決します。

preparedStatement: Statement オブジェクトのサブクラスであるプリコンパイルされたオブジェクト。

特徴:
高性能
SQLステートメントが最初にコンパイルされます
ユーザーが入力したキーワードをフィルターで除外できます。

PreparedStatement 前処理オブジェクト、処理される各 SQL ステートメントの実際のパラメーターはすべてプレースホルダーに置き換える必要がありますか?

String sql = "select * from user where username = ? and password = ?";
PreparedStatement を使用するには、次の 3 つの手順を完了する必要があります:
1. PreparedStatement 前処理オブジェクト コード:
前処理オブジェクトを取得するには、次のものが必要です。文字処理後に使用するアカウントのSQL文を提供します
PreparedStatement psmt = conn.prepareStatement(sql)
2.実際のパラメータを設定します
void setXxx(intindex, Xxx xx) 指定されたパラメータを指定された型の値に設定します
パラメータ 1: 1 から始まる実際のパラメータのシーケンス番号をインデックスします。
パラメータ 2: xxx の実際のパラメータ値、xxx は特定のタイプを表します。
例:
setString(2, "1234") SQL ステートメントの 2 番目の位置にあるプレースホルダーを実際のパラメーター「1234」に置き換えます。
3 SQL ステートメントを実行します。 update delete ステートメント。
ResultSetexecuteQuery(); -- select ステートメントを実行します。
boolean use(); -- select を実行し、true を返します。

以上がネイティブ JDBC を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。