JDBCデータベースおよびオペレーティング文のPreparedStatementおよびCallableStatement差

JDBC APIを使用すると、単純なJavaデータベースで動作させることができます。そして、それ以降のバージョンではJDBC-ODBCブリッジでjava8は破棄されました。異なるデータベースのための公式ウェブサイトに対応するドライバをダウンロードします。

ここで3人の一般的なデータベースドライバ名、ドライバクラス名と対応する接続​​文字列(xはバージョンを表す)であります

データベース ドライバのJAR 特定のドライバクラス名 接続文字列
オラクル ojdbc-x.jar oracle.jdbc.OracleDriver JDBC:オラクル:薄い:@localhost:1521:ORCL
MySQLの MySQLのコネクタ-javaの-x.jar com.mysql.jdbc.Driver JDBCます。mysql:// localhostを:33006 /データベースインスタンス名
SQLサーバー sqljdbc-x.jar com.microsoft.sqlserver.jdbc.SQLServerDriver JDBC:マイクロソフト:のSQLServer:localhostを:1433:データベース名=データベースインスタンス名

JDBCデータベース操作の4つのステップ

  1. 注ぎドライブ、ロード特定のドライバクラス
  2. データベースへの接続を確立
  3. SQLの実行
  4. 結果セット(クエリ結果のセット)

異なるデータベースを操作するためのJDBC APIを介して、ここでのSQLServerの例には、接続文字列を駆動する異なるデータベース差似ています。


import java.sql.*;

/**
 * JDBC操作数据库的四个步骤
 * a.倒入驱动,加载具体的驱动类
 * b.与数据库建立连接
 * c.执行SQL
 * d.处理结果集
 * @author 1
 *
 */
public class JDBCDemo{
	
	private static String URL = "jdbc:sqlserver://127.0.0.1:1433;databaseName=学生数据库";
	private static String user = "sa";
	private static String pwd = "123";
	
	public static void update(String sql){ //增删改
		Statement stmt = null;
		Connection  con = null;
		try {
			//a.倒入驱动,加载具体的驱动类
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			//b.与数据库建立连接
			con = DriverManager.getConnection(URL, user, pwd);
			//c.执行SQL
			stmt = con.createStatement();
			int count = stmt.executeUpdate(sql);  //返回影响的结果集数
			//d.处理结果集
			if(count>0) {
				System.out.println("操作成功,影响了"+count+"行");
			}
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
			System.out.println("无法加载驱动");
		}catch(SQLException e) {
			e.printStackTrace();
			System.out.println("执行SQL失败");
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
			}catch(SQLException e) {
				e.printStackTrace();
				System.out.println("关闭失败");
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		
	}
	
	public static void query(){ //查
		Statement stmt = null;
		Connection  con = null;
		ResultSet rs = null;
		try {
			//a.倒入驱动,加载具体的驱动类
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			//b.与数据库建立连接
			con = DriverManager.getConnection(URL, user, pwd);
			//c.执行SQL
			String sql = "select * from Course";
			stmt = con.createStatement();
			rs = stmt.executeQuery(sql);
			//d.处理结果集
			while(rs.next()) {
				System.out.print(rs.getString("Cno")+" ");
				System.out.print(rs.getString("Cname")+" ");
				System.out.print(rs.getInt("Credit")+" ");
				System.out.println(rs.getInt("Semester"));
			}
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
			System.out.println("无法加载驱动");
		}catch(SQLException e) {
			e.printStackTrace();
			System.out.println("执行SQL失败");
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
			}catch(SQLException e) {
				e.printStackTrace();
				System.out.println("关闭失败");
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		
	}
	public static void main(String[] args) {
		String sql = "update Course set Credit = 4 where Cno='C001'";
		JDBCDemo.update(sql);
		query();
	}
}

声明和のPreparedStatement

声明とPreparedStatementのCRUDのために使用することができます。

ステートメント

ステートメントオブジェクトは、()メソッドのcreateStatement接続オブジェクトによって製造することができます。
createStatement()メソッドプロトタイプ Statement java.sql.Connection.createStatement() throws SQLException

一般的な方法:

  • executeUpdate(SQL);
    データベースの更新(追加と削除)のための
    プロトタイプ:int java.sql.Statement.executeUpdate(String sql) throws SQLException
    すなわち、いくつかの更新されたレコードの影響戻り値int、。
  • executeQuery(SQL)
    データベースクエリ
    関数プロトタイプ:ResultSet java.sql.Statement.executeQuery(String sql) throws SQLException
    戻り値のResultSetタイプ。データベースの結果セットを格納するためのデータテーブルは、現在のカーソル線データにResultSetオブジェクトポイントは、最初にカーソル最初の行の前に配置されている(イテレータと同様)。
    次の行にカーソルを移動し、次の()メソッドによって、そうでない場合は真を返し、何次の行がfalseを返すないがあります。
    することにより、プロパティ値のgetXXX(「プロパティ名」)メソッドを取得します
			rs = stmt.executeQuery(sql);
			//d.处理结果集
			while(rs.next()) {
				System.out.print(rs.getString("Cno")+" ");
				System.out.print(rs.getString("Cname")+" ");
				System.out.print(rs.getInt("Credit")+" ");
				System.out.println(rs.getInt("Semester"));
			}

PreparedStatementの

PreparedStatementのは、拡張ステートメントの
プロトタイプを:public abstract interface java.sql.PreparedStatement extends java.sql.Statement

ステートメントのPreparedStatementように、すべての方法は、より多くのPreparedStatementも設定方法に加えて、使用することができます
ここに画像を挿入説明
のprepareStatement(文字列のSQL)接続オブジェクトによって生成されます。
プロトタイプは:PreparedStatement java.sql.Connection.prepareStatement(String sql) throws SQLException
(注:にビルドのcreateStatement Statementオブジェクト()許可されたパラメータは、SQL、SQLステートメントが前回着信実行である)
のPreparedStatementは、SQLステートメントをコンパイル済みのオブジェクトを表すために使用されるインタフェース。ここでは、通常のプレースホルダが含まれているSQL文です?。SQL文は、プリコンパイルされ、PreparedStatementオブジェクトに格納され、SQL文の実行の効率を向上させることが可能です。

//这里省略了try、catch,模板与上面的大致相同
			//a.倒入驱动,加载具体的驱动类
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			//b.与数据库建立连接
			con = DriverManager.getConnection(URL, user, pwd);
			//c.执行SQL
			String sql = "select Sno,Sname from Student where Sname like ?";  
			pstmt = con.prepareStatement(sql); //预编译
			pstmt.setString(1,"张%");  //查询姓李的学生
			rs = pstmt.executeQuery();
			//d.处理结果集
			while(rs.next()) {
				System.out.print(rs.getString("Sno")+" ");
				System.out.print(rs.getString("Sname")+" ");
				System.out.println();
			}

プレースホルダの設定値を設定する方法は、SQL文のプレースホルダ対応する最初のパラメータが2番目のパラメータの順序(1から始まる)、値が表示されます。

PreparedStatementを比較した利点の声明

プレースホルダを使用) -ライト・コード(文字列連結回避トラブルへの1)簡単に
)プリコンパイルを使用してパフォーマンスを(改善する)2
)安全(防止SQLインジェクション)3
ログイン操作(ステートメント)の場合:たとえば
、ユーザー入力ユーザ名:XXX「または1 = 1 -
パスワード:XXX
でこのクエリ

select count(*from login where uname='name' and upwd ='pwd'

Aに

select count(*from login where uname='XXX' or 1=1 --' and upwd ='XXX'

-注釈を付けされた後
または1 = 1、それは本当に成功した着陸を決してすることができます。
PreparedStatementを使用している場合、ユーザ入力は全体として扱われますが、入力のリスクをエスケープするので、安全です。

CallableStatementの

CallableStatementの呼び出しプロセスまたは保存機能の節約
のCallableStatementのprepareCall接続オブジェクト(文字列のSQL)の方法によって製造。

注:ここでは、SQL形式の要件は
、SQL = {コール保存プロシージャ名(パラメータリスト)}:手順を保存するための
ストレージ機能について:SQL = {?=コール・ストレージ・関数名(パラメータリスト)}
いくつかのプレースホルダを使用するには、いくつかのパラメータがありますか?代替

パラメータ値のsetXXX(インデックス値)を設定する
のregisterOutParameterによって(インデックスのSQLType)が出力パラメータタイプ設定
コールを実行した後()
のgetXXXによって()を出力パラメータを受信します。

例:少年たちの数の部門のための貯蓄の学校システムの統計では男の子の数用P3プロセス、システムの入力パラメータ、出力パラメータ

ALTER PROCEDURE p3 @dept VARCHAR(10),@number INT OUTPUT
AS
SELECT @number = COUNT(Sno) FROM Student WHERE Sdept = @dept AND Ssex = '男'
//a.倒入驱动,加载具体的驱动类
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			//b.与数据库建立连接
			con = DriverManager.getConnection(URL, user, pwd);
			//获取CallableStatement对象
			cstmt = con.prepareCall("{call p3(?,?)}");
			
			//为参数赋值
			cstmt.setString(1, "计算机系");
			
			//设置输出结果的数据类型
			cstmt.registerOutParameter(2, Types.INTEGER);
			//执行
			cstmt.execute();
			//获取输出结果
			int result = cstmt.getInt(2);
			System.out.println(result);
公開された12元の記事 ウォンの賞賛0 ビュー155

おすすめ

転載: blog.csdn.net/qq_43635212/article/details/104211315