📄 4.26.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 + -