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 を使用して対応する問題を解決します。
特徴:
高性能
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 サイトの他の関連記事を参照してください。