⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4.26.txt

📁 java学习的点滴
💻 TXT
字号:
及联插入:
	定义一个表1,有一个主键,定义另一个表2,它也有一个主键,还有一个外键是表1的主键,要向表2插入数据,必须先向表1插入相关的数据,也就是及联插入。

如:  	  建一个表和它的序列,有一个主键
	  CREATE TABLE PK_TABLE(
       	  PID     NUMBER(6),
       	  PNAME   VARCHAR2(10) ,
          CONSTRAINT PK_TABLE_PID_PK PRIMARY KEY (PID)
		);

	  CREATE SEQUENCE PK_TABLE_SEQ     --建议用 表名_SEQ 命名
	  MINVALUE 1                      --最小值
	  MAXVALUE 9999999999999          --最大值
	  START WITH 1                    --开始值
	  INCREMENT BY 1                  --每次增长步长
	  CACHE 20  ;  

----------------------------------------------------

	  建另一个表和它的序列,有一个主键和一个外键
	  CREATE TABLE FK_TABLE(
          FID     NUMBER(6),
       	  PID     NUMBER(6),
       	  FNAME   VARCHAR2(10)  ,
          CONSTRAINT PK_TABLE_FID_PK PRIMARY KEY (FID),
          CONSTRAINT FK_TABLE_PID_FK FOREIGN KEY (PID)
                     REFERENCES PK_TABLE(PID)
		);

	  CREATE SEQUENCE FK_TABLE_SEQ     --建议用 表名_SEQ 命名
	  MINVALUE 1                      --最小值
	  MAXVALUE 9999999999999          --最大值
	  START WITH 1                    --开始值
	  INCREMENT BY 1                  --每次增长步长
	  CACHE 20 ;   
_____________________________________________________________________________________

用java语言来实现:


方法1:在Dao文件夹中,有三个方法,selectByPKSeq() 、insertPK_table(int pk,Connection conn)、insertFK_table()
   在insertFK_table()方法中,先调用selectByPKSeq(),查出主表主键的值,再调用insertPK_table(int pk,Connection conn)
   方法,往主表里插入数据,再往从表里插入数据。
----------------------------------------

/*实现数据库的连接*/
package conn;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConn {

	public static Connection getDBConn()
	{
		Connection conn=null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection("jdbl:oracle:thin:@127.0.0.1:1521:dbl","scott","tiger");
		} catch (Exception e) {
			// TODO 自动生成 catch 块
			System.out.println("数据库连接失败");
			e.printStackTrace();
		}
		return conn;
	}
}


-------------------------------------------

/*实现及联表的插入*/

package dao;

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

import conn.DBConn;

public class JiLianDao {
***************************
	
	/*此方法实现的功能是查询主表中主键的序列号*/
	public int selectByPKSeq()
	{
		Connection conn=null;
		Statement st=null;
		ResultSet rs=null;
		
		
		String sql="select pk_table_seq.nextval as pk from dual";
		
		int pk=0;
		try {
			conn=DBConn.getDBConn();
			/*创建一个 Statement 对象来将 SQL 语句发送到数据库。*/
			st=conn.createStatement();
			/*执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。*/
			rs=st.executeQuery(sql);
			if(rs.next())
			{
				pk=rs.getInt("pk");
			}
		} catch (SQLException e) {
			// TODO 自动生成 catch 块
			System.out.println("查询序列失败");
			e.printStackTrace();
		}finally{
			if(rs!=null){
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO 自动生成 catch 块
					e.printStackTrace();
				}
				}
			if(st!=null){
				try {
					st.close();
				} catch (SQLException e) {
					// TODO 自动生成 catch 块
					e.printStackTrace();
				}
			}
			if(conn!=null){
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO 自动生成 catch 块
					e.printStackTrace();
				}
			}
		}
		return pk;
	} 

****************************	
	/*此方法实现的主表数据的插入,因为是及联插入,此方法要在从表插入数据之前被调用,
	 * 主表的主键要和从表的外键的值相同,而且要用同一个连接,用两个参数表示,
	 * 它不需要返回值。*/
	public void insertPK_table(int pk,Connection conn)
	{
		PreparedStatement pst=null;
		
		String sql="insert into pk_table values(?,?)";
		
		try {
			
			/* 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。*/
			pst=conn.prepareStatement(sql);
			
			pst.setInt(1, pk);
			pst.setString(2, "xiaoben");
			
			/*在此 PreparedStatement 对象中执行 SQL 语句
			 * ,该语句必须是一个 SQL INSERT、UPDATE 或 DELETE 语句;
			 * 或者是一个什么都不返回的 SQL 语句,比如 DDL 语句。*/
			pst.executeUpdate();
			
		} catch (SQLException e) {
			// TODO 自动生成 catch 块
			System.out.println("插入主表失败");
			e.printStackTrace();
		}finally{
			if(pst!=null)
			{
				try {
					pst.close();
				} catch (SQLException e) {
					// TODO 自动生成 catch 块
					e.printStackTrace();
				}
			}
		}
	}
***********************************

	/*此方法实现的是从表的数据插入,注意的是要先查出主表的主键的值,要先往主表插入相关的信息,才能往从表插入
         *数据,要确保主表的主键和从表的外键的值相同*/
	public int insertFK_table()
  	{
		Connection conn=null;
		PreparedStatement pst=null;
		
		int pk=0;
		int flg=0;
		String sql="insert into fk_table values(fk_table_seq.nextval,?,?)";
		
		try {
			conn=DBConn.getDBConn();
			/*设成手动提交*/
			conn.setAutoCommit(false);
			
			/*将查询出主表中的主键的值取出,并赋给变量pk*/
			pk=selectByPKSeq();
			
			/*调用insertPK_table()方法,对主表插入数据*/
			insertPK_table(pk,conn);
			
			/* 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。*/
			pst=conn.prepareStatement(sql);
			pst.setInt(1, pk);
			pst.setString(2, "xiaoyu");
			
			/*在此 PreparedStatement 对象中执行 SQL 语句,并将结果赋给flg,*/
			flg=pst.executeUpdate();
			
			/*不要忘了提交*/
			conn.commit();
		} catch (SQLException e) {
			// TODO 自动生成 catch 块
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO 自动生成 catch 块
				e1.printStackTrace();
			}
			System.out.println("插入从表失败");
			e.printStackTrace();
		}finally{
			try {
				/*设成自动提交*/
				conn.setAutoCommit(true);
			} catch (SQLException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
			}
			try {
				pst.close();
			} catch (SQLException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
			}
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
			}
		}
		/*返回flg,是为了判断操作是否成功,如果不为0,表示操作成功,反之,失败*/
		return flg;
	}
}

------------------------------------------------------------------------------

/*判断及联表的插入是否成功*/

package bo;

import dao.JiLianDao;

public class Business {
	
	public int displayInsert()
	{
		/*创建JiLianDao类的对象,调用insertFK_table()方法,并将返回值赋给flg*/
		JiLianDao jldao=new JiLianDao();
		int flg=jldao.insertFK_table();
		
		/*通过flg的结果,判断操作是否成功*/
		if(flg!=0)
		{
			System.out.println("插入成功");
		}else{
			System.out.println("插入失败");
			
		}
		return flg;
	}

}


----------------------------------------------

测试类

package test;

import bo.Business;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自动生成方法存根
		Business bu=new Business();
		bu.displayInsert();

	}

}


_____________________________________________________________________________________________________________


方法2:
----------------------------------------------
package conn;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConn {

	public static Connection getDBConn()
	{
		Connection conn=null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:dbl","scott","tiger");
		} catch (Exception e) {
			// TODO 自动生成 catch 块
			System.out.println("数据库连接失败");
			e.printStackTrace();
		}
		return conn;
		
	}
}


-----------------------------------------------------

package dao;

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

/*在这个类中有三个方法,它们共用一个数据库连接,所以有相同类型的参数Connection,
 * 因为涉及及联的插入,其中的两个方法要有相同类型的参数,来保证一个表的主键和另
 * 一个表的外键的值要相同。*/
public class JL {
	
	/*查询主表中主键的值*/
	public int selectSEQ(Connection conn)
	{
		Statement st=null;
		ResultSet rs=null;
		
		String sql="select pk_table_seq.nextval as pk from dual";
		int pk=0;
				
		try {
			/*创建一个 Statement 对象来将 SQL 语句发送到数据库。*/
			st=conn.createStatement();
			/*执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。*/
			rs=st.executeQuery(sql);
			if(rs.next())
			{
				/*列名要加""号*/
				pk=rs.getInt("pk");
			}
		} catch (SQLException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
			System.out.println("查询序列失败");
		}finally{
			if(rs!=null){
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO 自动生成 catch 块
					e.printStackTrace();
				}
			}
			if(st!=null){
				try {
					st.close();
				} catch (SQLException e) {
					// TODO 自动生成 catch 块
					e.printStackTrace();
				}
			}
			
		}
		return pk;
	}

	
	/*往主表中插入数据*/
	public void insertPK(int pk,Connection conn)
	{
		PreparedStatement pst=null;
		
		String sql="insert into pk_table values(?,?)";
		
		try {
			/*创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。*/
			pst=conn.prepareStatement(sql);
			pst.setInt(1, pk);
			pst.setString(2, "xiaochuang");
			
			/* 在此 PreparedStatement 对象中执行 SQL 语句*/
			pst.executeUpdate();
		} catch (SQLException e) {
			// TODO 自动生成 catch 块
			System.out.println("插入主表失败");
			e.printStackTrace();
		}finally{
			if(pst!=null)
			{
				try {
					pst.close();
				} catch (SQLException e) {
					// TODO 自动生成 catch 块
					e.printStackTrace();
				}
			}
		}
	}
	
	
	/*往从表里插入数据*/
	public int insertFK(int pk,Connection conn)
	{
		PreparedStatement pst=null;
		String sql="insert into fk_table values(fk_table_seq.nextval,?,?)";
		
		int flg=0;
		
		try {
			/*创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。*/
			pst=conn.prepareStatement(sql);
			pst.setInt(1, pk);
			pst.setString(2, "laogao");
			
			/* 在此 PreparedStatement 对象中执行 SQL 语句*/
			flg=pst.executeUpdate();
		} catch (SQLException e) {
			// TODO 自动生成 catch 块
			System.out.println("插入从表失败");
			e.printStackTrace();
		}finally{
			if(pst!=null){
				try {
					pst.close();
				} catch (SQLException e) {
					// TODO 自动生成 catch 块
					e.printStackTrace();
				}
			}
		}
		/*返回flg的值,是为了判断操作是否成功*/
		return flg;
	}
}


-----------------------------------------------

package bo;

import java.sql.Connection;
import java.sql.SQLException;

import conn.DBConn;
import dao.JL;

public class Busi {

	public void displayInsert() {
		Connection conn = null;
		
		int flg = 0;
		int pk = 0;
		JL jl = new JL();

		try {
			/*连接数据库*/
			conn=DBConn.getDBConn();
			/*设置手动提交*/
			conn.setAutoCommit(false);
			
			/*调用JL类中的方法selectSEQ(conn),将查询出的主表的主键的值赋给pk*/
			pk = jl.selectSEQ(conn);
			
			/*调用JL类中的方法insertPK(pk, conn),往主表插入数据*/
			jl.insertPK(pk, conn);
			
			/*调用JL类中的方法insertFK(pk, conn),往从表里插入数据*/
			flg = jl.insertFK(pk, conn);
			
			/*提交*/
			conn.commit();

		} catch (SQLException e) {
			// TODO 自动生成 catch 块
			try {
				
				/*出现异常,恢复成操作前的样子*/
				conn.rollback();
			} catch (SQLException e1) {
				// TODO 自动生成 catch 块
				e1.printStackTrace();
			}
			System.out.println("插入失败");
			e.printStackTrace();
		} finally {
			try {
				/*设成自动提交*/
				conn.setAutoCommit(true);
			} catch (SQLException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO 自动生成 catch 块
					e.printStackTrace();
				}
			}
		}
		
		/*判断操作是否成功*/

		if(flg!=0){
			System.out.println("插入成功");
		}
		
	}

}
-------------------------------------------------------------

package test;

import bo.Busi;

public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自动生成方法存根

		Busi bu=new Busi();
		bu.displayInsert();
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -