emp和dept表存在如下关系:emp表存在有mgr、deptno字段
自身关联
一对多关联
1.修改Emp.java
private Emp mgr; private Dept deptno ;
2.修改Dept.java
private List<Emp> emps;
3.修改雇员DAO操作
如果现在有了关系匹配问题,就会出现这样的情况:增加数据是需要调用findByID()方法判断用户是否存。而如果把关系的查询交给了findByID()方法,就会产生笛卡尔积问题。而现在对于这样的操作有两种解决方案。
业务加强(此方法不好):在使用findByID方法时查询出雇员的领导编号,与部门编号,而后再业务层中再根据领导编号查询出领导信息以及利用部门编号查询出部门信息,最后将其进行引用的配置。
数据层加强:利用多表查询完成。
范例:扩充IEmpDAO接口的方法
package xxx.dao; import java.util.List; import xxx.vo.Emp; public interface IEmpDAO extends IDAO<Integer, Emp> { /** * 利用多表查询,查询详细信息 * @param id * @return * @throws Exception */ public Emp findByIdDetails(Integer id) throws Exception; public List<Emp> findAllDetails() throws Exception; }
EmpDAOImpl:
package xxx.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; import xxx.dao.IEmpDAO; import xxx.vo.Dept; import xxx.vo.Emp; /* * 要想操作数据层子类,那么一定要在构造方法中传入Connection接口对象 */ public class EmpDAOImpl implements IEmpDAO { private Connection conn; //数据库连接对象 private PreparedStatement pstmt; //数据库操作对象 /* * 实例化数据层子类对象,同时传入一个数据库连接对象 * conn Connection连接对象,如果为null表示数据库没有打开 */ public EmpDAOImpl(Connection conn) { this.conn = conn; } @Override public boolean doCreate(Emp vo) throws Exception { String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal,comm,mgr,deptno) VALUES (?,?,?,?,?,?,?,?)"; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(1, vo.getEmpno()); this.pstmt.setString(2, vo.getEname()); this.pstmt.setString(3, vo.getJob()); this.pstmt.setDate(4, new java.sql.Date(vo.getHiredate().getTime())); this.pstmt.setDouble(5, vo.getSal()); this.pstmt.setDouble(6, vo.getComm()); if(vo.getMgr() != null) { //有领导信息 this.pstmt.setInt(7, vo.getMgr().getEmpno()); } else { this.pstmt.setString(7, null); } if(vo.getDept() != null) { this.pstmt.setInt(8, vo.getDept().getDeptno()); } else { this.pstmt.setString(8, null); } return this.pstmt.executeUpdate() > 0; } @Override public boolean doUpdate(Emp vo) throws Exception { String sql = "UPDATE emp SET ename = ?,job = ?,hiredate = ?,sal = ?,comm = ?,mgr = ?,deptno=? WHERE empno = ?"; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setString(1, vo.getEname()); this.pstmt.setString(2, vo.getJob()); this.pstmt.setDate(3, new java.sql.Date(vo.getHiredate().getTime())); this.pstmt.setDouble(4, vo.getSal()); this.pstmt.setDouble(5, vo.getComm()); if(vo.getMgr() != null) { //有领导信息 this.pstmt.setInt(6, vo.getMgr().getEmpno()); } else { this.pstmt.setString(6, null); } if(vo.getDept() != null) { this.pstmt.setInt(7, vo.getDept().getDeptno()); } else { this.pstmt.setString(7, null); } this.pstmt.setInt(8, vo.getEmpno()); return this.pstmt.executeUpdate() > 0; } @Override public boolean doRemove(Set<Integer> ids) throws Exception { StringBuffer sql = new StringBuffer(); sql.append("DELETE FROM emp WHERE empno IN ("); Iterator<Integer> iter = ids.iterator(); while(iter.hasNext()) { sql.append(iter.next()).append(","); } sql.delete(sql.length() - 1, sql.length());//删除最后的逗号, sql.append(")"); this.pstmt = this.conn.prepareStatement(sql.toString()); return this.pstmt.executeUpdate() == ids.size(); //true是删除成功了 } @Override public Emp findById(Integer id) throws Exception { //根据ID查询 Emp vo = null; String sql = "SELECT empno,ename,job,hiredate,sal,comm FROM emp WHERE empno=?"; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(1, id); ResultSet rs = this.pstmt.executeQuery(); if(rs.next()) { vo = new Emp(); vo.setEmpno(rs.getInt(1)); vo.setEname(rs.getString(2)); vo.setJob(rs.getString(3)); vo.setHiredate(rs.getDate(4)); vo.setSal(rs.getDouble(5)); vo.setComm(rs.getDouble(6)); } return vo; } @Override public List<Emp> findAll() throws Exception { //查询全部 List<Emp> all = new ArrayList<Emp>(); String sql = "SELECT empno,ename,job,hiredate,sal,comm FROM emp "; this.pstmt = this.conn.prepareStatement(sql); ResultSet rs = this.pstmt.executeQuery(); while(rs.next()) { Emp vo = new Emp(); vo = new Emp(); vo.setEmpno(rs.getInt(1)); vo.setEname(rs.getString(2)); vo.setJob(rs.getString(3)); vo.setHiredate(rs.getDate(4)); vo.setSal(rs.getDouble(5)); vo.setComm(rs.getDouble(6)); all.add(vo); } return all; } @Override public List<Emp> findAllSplit(String column, String keyWord, Integer currentPage, Integer lineSize) throws Exception { List<Emp> all = new ArrayList<Emp>(); String sql = "SELECT * FROM (SELECT empno,ename,job,hiredate,sal,comm,ROWNUM rn FROM emp WHERE "+column+" LIKE ? AND ROWNUM <= ?) temp WHERE temp.rn > ? "; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setString(1, "%" + keyWord + "%"); this.pstmt.setInt(2, currentPage * lineSize); this.pstmt.setInt(3, (currentPage - 1) * lineSize); ResultSet rs = this.pstmt.executeQuery(); while(rs.next()) { Emp vo = new Emp(); vo = new Emp(); vo.setEmpno(rs.getInt(1)); vo.setEname(rs.getString(2)); vo.setJob(rs.getString(3)); vo.setHiredate(rs.getDate(4)); vo.setSal(rs.getDouble(5)); vo.setComm(rs.getDouble(6)); all.add(vo); } return all; } @Override public Integer getAllCount(String column, String keyWord) throws Exception { String sql = "SELECT COUNT(*) FROM emp WHERE " + column + " LIKE ? "; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setString(1, "%" + keyWord + "%"); ResultSet rs = this.pstmt.executeQuery(); if(rs.next()) { return rs.getInt(1); } return null; } @Override public Emp findByIdDetails(Integer id) throws Exception { Emp vo = null; String sql = "SELECT e.empno,e.ename,e.job,e.hiredate,e.sal,e.comm,m.empno mno,m.ename mname,d.deptno dno,d.dname dna,d.loc dl FROM emp e,emp m,dept d WHERE empno=? AND e.mgr=m.empno(+) AND e.deptno=d.deptno(+)"; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(1, id); ResultSet rs = this.pstmt.executeQuery(); if(rs.next()) { vo = new Emp(); vo.setEmpno(rs.getInt(1)); vo.setEname(rs.getString(2)); vo.setJob(rs.getString(3)); vo.setHiredate(rs.getDate(4)); vo.setSal(rs.getDouble(5)); vo.setComm(rs.getDouble(6)); Emp mgr = new Emp(); mgr.setEmpno(rs.getInt(7)); mgr.setEname(rs.getString(8)); Dept dept = new Dept(); dept.setDeptno(rs.getInt(9)); dept.setDname(rs.getString(10)); dept.setLoc(rs.getString(11)); vo.setMgr(mgr); vo.setDept(dept); } return vo; } @Override public List<Emp> findAllDetails() throws Exception { List<Emp> all = new ArrayList<Emp>(); String sql = "SELECT e.empno,e.ename,e.job,e.hiredate,e.sal,e.comm,m.empno mno,m.ename mname,d.deptno dno,d.dname dna,d.loc dl FROM emp e,emp m,dept d WHERE e.mgr=m.empno(+) AND e.deptno=d.deptno(+)"; this.pstmt = this.conn.prepareStatement(sql); ResultSet rs = this.pstmt.executeQuery(); while(rs.next()) { Emp vo = new Emp(); vo = new Emp(); vo.setEmpno(rs.getInt(1)); vo.setEname(rs.getString(2)); vo.setJob(rs.getString(3)); vo.setHiredate(rs.getDate(4)); vo.setSal(rs.getDouble(5)); vo.setComm(rs.getDouble(6)); Emp mgr = new Emp(); mgr.setEmpno(rs.getInt(7)); mgr.setEname(rs.getString(8)); Dept dept = new Dept(); dept.setDeptno(rs.getInt(9)); dept.setDname(rs.getString(10)); dept.setLoc(rs.getString(11)); vo.setMgr(mgr); vo.setDept(dept); all.add(vo); } return all; } }
4.修改IEmpService接口定义:
public List<Emp> listDetails() throws Exception; public Emp getDetails(int id) throws Exception;