1. 程式人生 > >利用PreparedStatement自動返回主鍵

利用PreparedStatement自動返回主鍵

package day03;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import day01.DBUtil2;
/**
 * PreparedStatement 支援一個方法
 * 可以在執行插入操作後獲取該條語句在資料庫表中產生的記錄中
 * 每個欄位的值, 我們可以獲取該主鍵作為外來鍵插入
 *
 */
public class JDBCDemo3 {
	public static void main(String[] args) {
		try {
			Connection conn = DBUtil2.getConnection();
			String sql = "INSERT INTO dept_wq VALUES "
						+ "(dept_seq.nextval,?,?)";
			/**
			 * 建立PreparedStatement時,可以使用Connection的過載方法
			 * 第二個引數要求我們傳入一個字串陣列,用來指定當通過ps操作後,
			 * 該記錄在表中想獲取的值所在的欄位名
			 */
			PreparedStatement ps = 
					conn.prepareStatement(sql,new String[]{"deptno","dname"});
			ps.setString(1, "ORACLE");
			ps.setString(2, "NANJING");
			int deptno = -1;
			if(ps.executeUpdate() > 0 ){
				/**
				 * 獲取剛剛插入進去的記錄中關注的那幾列的值
				 */
				ResultSet rs = ps.getGeneratedKeys();
				if(rs.next()){
					//獲取deptno的值(int)--現在只關注此列
					deptno = rs.getInt(1);//此處建議使用數字,getInt("deptno")對於不同的資料庫版本可能不支援
					System.out.println("該部門編號:"+deptno);
					//獲取dname的值(String)
					String dname = rs.getString(2);
					System.out.println("該部門名稱:"+dname);
				}
				rs.close();//釋放資源
			}
			
			//將deptno作為外來鍵插入到user表作為外來鍵
			if(deptno > 0){//說明獲取到了該值
				String userSql = "INSERT INTO user_wq (id,name,deptno) VALUES "
							+ "(user_seq.nextval,?,?)";
				ps = conn.prepareStatement(userSql);
				ps.setString(1, "王慶");
				ps.setInt(2, deptno);
				if(ps.executeUpdate() > 0){
					System.out.println("插入user成功");
				}else{
					System.out.println("插入user失敗");
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil2.closeConnection();
		}
	}
}

測試結果如下:

該部門編號:66
該部門名稱:ORACLE
插入user成功