首页 > Linux操作系统 > Linux操作系统 > 关于数据库操作多个操作组合的处理
在mysql数据库里建了两个列数相同的表table1(字段为id,xuehao,name,sex).table2(字段为id,age,jiguan,dept),想把两个表合在一起显示在jsp网页上,用了select xuehao,name,sex,age,jiguan,dept from table1 join table2 on table1.id=table2.id;
问题是我现在想给这两个关联表同时添加一行数据,
在mysql中我用命令:insert into table1 values();insert into table2 values();select xuehao,name,sex,age,jiguan,dept from table1 join table2 on table1.id=table2.id;可以达到我想要的效果
我的想法:
嗯,先说说为什么要怎么做吧,感觉从事务层上来解决比较合适。
具体实现有很多方法,
一个实在数据层里面,可以做一个存储过程,
一个实在事务层里面,把这个把着三个sql操作写成一个方法里面
根据返回值true和false来决定。
大概写写,没有调试过
1、存储过程:
DROP PROCEDURE IF EXISTS insertandread
CREATE PROCEDURE insertandread (IN xuehao INT,
in name varchar(40),
........//省略
........//省略
OUT xuehao int,out name varchar(32),...)//省略
BEGIN
insert into table1 values(xuehao,name);
insert into table2 values(...);//参数
select xuehao,name,sex,age,jiguan,dept from table1 join table2 on table1.id=table2.id;
END;
Java输入和读取返回值,大概是下面这样
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, pwd);
cs = conn.prepareCall("{ call insertandread(?,?,?) }");//问号表示参数
CallableStatement cs.setString(1, "10");
...........//省略,这是输入值定义
cs.registerOutParameter(2, Types.VARCHAR);//定义返回值,类型和ID
............
cs.execute();
String name = cs.getString(2);//获得返回值。
这个里面设计的参数比较多,要注意调试,基本就是这个样子,
参考http://hi.baidu.com/icewee/blog/item/dfd9b96f87edfedc81cb4a59.html
可以学学习。
MySql以前看过,现在也算复习下,多多指教
我再想想事务层应该怎么实现比较还好
事务层的实现,
大概写写,
public ResultSet insertandRead(String[] parm1,String[] parm2)
//这里面偷个懒,全部用String
{
ResultSet rs=null;
bool insert1OK=false;
bool insert2OK=false;
con.setAutoCommit(false);//禁止自动提交,
Savepoint sp = con3.setSavepoint();//设置回滚点
.......
try{
PreparedStatement inserttable1 = con.prepareStatement("insert into table1 values(?,?,?,...)");
inserttable1.setString(1, parm1[0]);
inserttable1.execute();
con.commit();//提交
}catch(Exception ex) {
ex.printStackTrace();
insert1OK=true;
try {
conn.rollback(); //操作不成功则回滚
}catch(Exception e) {
e.printStackTrace();
}
对table2添加也是一样,如果不成功就回滚是开始。成功把insert1OK设置为OK。
if(insert1OK==true&& insert2OK==true){
....//执行查询,返回ResultSet
}
return rs;
}
感觉这个代码不是很好,太容易出问题了,而和数据库连接太紧密,
还是应该使用Hibernate这样的持久化层来处理。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22259926/viewspace-660573/ ,如需转载,请注明出处,否则将追究法律责任。