JDBC中利用主键返回和Batch插入多条数据

3 向Emp表中插入一个团队成员

向Emp表中插入一个团队成员,该团队的成员信息如图-1所示。

图-1

从图-1可以看出tom为这个团队的管理者,其他三位员工的管理者ID(mgr) 都为1,而1是管理者tom的员工编号(empno)。

要求向Emp表插入以上四个员工的信息。职员marry、terry、jim的管理者ID(mgr)为刚刚插入Emp表的管理者tom的员工编号(empno)的数据。另外,Emp表的主键列empno的数据通过序列emp_seq获得。

DAO:

package homework;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import day01.DBUtil2;

public class TestDAO {
	public boolean update(List<Emp> list){
		Connection conn = null;
		try {
			conn = DBUtil2.getConnection();
			conn.setAutoCommit(false);//手动提交
			String sql = "INSERT INTO emp VALUES (emp_seq.nextval,"
					+ "?,?,?,?,?,?,?)";
			PreparedStatement ps = 
					conn.prepareStatement(sql,new String[]{"empno"});
			for(Emp e : list){
				if(e.getEname().equals("tom")){
					ps.setString(1, e.getEname());
					ps.setString(2, e.getJob());
					ps.setObject(3, e.getMgr());
					ps.setDate(4, e.getHiredate());
					ps.setObject(5, e.getSal());
					ps.setObject(6, e.getComm());
					ps.setObject(7, e.getDeptno());
					break;
				}
			}
			int flag = ps.executeUpdate();
			if(flag == 0){
				ps.close();
				throw new RuntimeException("访问数据库异常");
			}
			//获取该empno
			ResultSet rs = ps.getGeneratedKeys();
			rs.next();
			int empno = rs.getInt(1);
			rs.close();
			//处理剩下的三位员工
			String sql2 = "INSERT INTO emp VALUES (emp_seq.nextval,"
					+ "?,?,?,?,?,?,?)";
			ps = conn.prepareStatement(sql2);
			for(Emp e: list){
				if(!e.getEname().equals("tom")){//不是tom
					ps.setString(1, e.getEname());
					ps.setString(2, e.getJob());
					ps.setObject(3, empno);
					ps.setDate(4, e.getHiredate());
					ps.setObject(5, e.getSal());
					ps.setObject(6, e.getComm());
					ps.setObject(7, e.getDeptno());
					ps.addBatch();
				}
			}
			ps.executeBatch();
			ps.clearBatch();
			ps.close();
			conn.commit();//手动提交
		} catch (SQLException e) {
			e.printStackTrace();
			try {
				conn.rollback();
				System.out.println("回滚");
				return false;
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		} finally {
			DBUtil2.closeConnection();
		}
		return true;
	}
	/**
	 * 注意:ps.setInt(3, empno)或ps.setDouble(3, empno)
	 * 针对传入的参数类型均为基本类型int 或 double,若实体类中该属性为null,
	 * 则在使用prepareStatement时要改为ps.setObject(3, empno);
	 * 否则会报空指针异常
	 */
}
实体类:

package homework;
import java.io.Serializable;
import java.sql.Date;
public class Emp implements Serializable{
	private static final long serialVersionUID = 1L;
	private Integer empno;
	private String ename;
	private String job;
	private Integer mgr;
	private Date hiredate;
	private Double sal;
	private Double comm;
	private Integer deptno;
	public Emp() {
	}
	public Integer getEmpno() {
		return empno;
	}
	public void setEmpno(Integer empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public Integer getMgr() {
		return mgr;
	}
	public void setMgr(Integer mgr) {
		this.mgr = mgr;
	}
	
	public Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	
	public Double getSal() {
		return sal;
	}
	public void setSal(Double sal) {
		this.sal = sal;
	}

	public Double getComm() {
		return comm;
	}
	public void setComm(Double comm) {
		this.comm = comm;
	}
	public Integer getDeptno() {
		return deptno;
	}
	public void setDeptno(Integer deptno) {
		this.deptno = deptno;
	}
	@Override
	public String toString() {
		return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", mgr=" + mgr + ", hiredate=" + hiredate
				+ ", sal=" + sal + ", comm=" + comm + ", deptno=" + deptno + "]";
	}
}
测试类:

package homework;

import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class MyUserService {
	
	@Test
	public void test1(){
		List<Emp> list = new ArrayList<Emp>();
		Emp e1 = new Emp();
		e1.setEname("tom");
		e1.setJob("manager");
		e1.setMgr(7839);
		e1.setHiredate(Date.valueOf("2017-04-01"));
		e1.setSal(5000.0);
		e1.setComm(300.0);
		e1.setDeptno(30);
		
		Emp e2 = new Emp();
		e2.setEname("marry");
		e2.setJob("clerk");
		e2.setHiredate(Date.valueOf("2017-04-02"));
		e2.setSal(3000.0);
		e2.setDeptno(30);
		
		Emp e3 = new Emp();
		e3.setEname("tery");
		e3.setJob("salesman");
		e3.setHiredate(Date.valueOf("2017-04-03"));
		e3.setSal(2500.0);
		e3.setComm(200.0);
		e3.setDeptno(30);
		
		Emp e4 = new Emp();
		e4.setEname("jim");
		e4.setJob("salesman");
		e4.setHiredate(Date.valueOf("2017-04-04"));
		e4.setSal(2500.0);
		e4.setComm(200.0);
		e4.setDeptno(30);
		
		TestDAO dao = new TestDAO();
		list.add(e1);
		list.add(e2);
		list.add(e3);
		list.add(e4);
		
//		for(Emp e : list){
//			System.out.println(e);
//		}
		
		boolean flag = dao.update(list);
		if(flag){
			System.out.println("ok");
		}else{
			System.out.println("false");
		}
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荒--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值