zoukankan      html  css  js  c++  java
  • Java_处理关系字段

    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;

      

  • 相关阅读:
    flask 基础
    新的项目部署
    linux (01) linux基础
    linux (04) linux安装mysql
    linux (06) redis安装
    linux (09) nginx反向代理,负载均衡
    linux (08) nginx入门详解
    linux (07) redis详解
    linux(05) 编译安装py3
    spring-boot war包部署(二)
  • 原文地址:https://www.cnblogs.com/lonske/p/8932822.html
Copyright © 2011-2022 走看看