关于数据库操作多个操作组合的处理

在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博客 ” ,链接:http://blog.itpub.net/22259926/viewspace-660573/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22259926/viewspace-660573/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值