1. 程式人生 > 其它 >dbutils多表查詢Bean對映問題

dbutils多表查詢Bean對映問題

技術標籤:java封裝資料庫

標題dbutils多表查詢對映類中類

前言: 最近用dbutils做一些小功能的時候發現dbutils雖然可以進行多表查詢 但是查詢到的結果在BeanHandler 和BeanListHandler是無法對映的 但是確實可以把資料查出來,我在網上查了好多 目前也沒有找到解決的辦法 都是比較麻煩的,然後我想到的辦法就是利用MapListHandler進行得到一個map集合 然後利用Beanutils.populate()方法進行對映
beanutils需要用到的jar包commons-beanutils-1.8.3.jar commons-logging-1.1.3.jar


我的類是:

// An highlighted block
public class Dept {
    private Integer did;
    private String dname;

    public Dept() {
    }

    public Integer getDid() {
        return did;
    }

    public void setDid(Integer did) {
        this.did = did;
    }

    public String getDname() {
        return dname;
} public void setDname(String dname) { this.dname = dname; } @Override public String toString() { return "Dept{" + "did=" + did + ", dname='" + dname + '\'' + '}'; } }

Employee類

// An highlighted block
public class Employee1 { private Integer eid; private String ename; private Dept dept; private String regTime; public Employee1() { } public Employee1(Integer eid, String ename, Dept dept, String regTime) { this.eid = eid; this.ename = ename; this.dept = dept; this.regTime = regTime; } public Integer getEid() { return eid; } public void setEid(Integer eid) { this.eid = eid; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public Dept getDept() { return dept; } public void setDept(Dept dept) { this.dept = dept; } public String getRegTime() { return regTime; } public void setRegTime(String regTime) { this.regTime = regTime; } @Override public String toString() { return "Employee1{" + "eid=" + eid + ", ename='" + ename + '\'' + ", dept=" + dept + ", regTime='" + regTime + '\'' + '}'; } }

測試程式碼

// An highlighted block
  @Test
    public void text1() throws SQLException, InvocationTargetException, IllegalAccessException {
        QueryRunner queryRunner=new QueryRunner(new ComboPooledDataSource());
        String sql="select * from employee e left join dept d on e.did=d.did";
        List<Map<String, Object>> query = queryRunner.query(sql, new MapListHandler());//將查詢到的所有資訊每行以key-value的形式裝到map裡 然後把我多個map放到list集合中
        List<Employee1> emps=new ArrayList<>(); //對得到的結果進行處理然後放到集合返回
        for (Map<String, Object> map : query) {//遍歷集合
            Employee1 emp=new Employee1();//把結果集封裝到物件中
            Dept dept=new Dept();
            BeanUtils.populate(dept,map);//把屬於dept物件的屬性封裝  切記 dept和employee屬性名不能重複  如果不能避免請看下面一種情況
            emp.setDept(dept);//把封裝好的dept加到employee類中
            BeanUtils.populate(emp,map);//把屬於employee的物件屬性封裝
            emps.add(emp);//放入集合
        }
        for (Employee1 emp : emps) {
            System.out.println(emp);
        }
    }

結果圖可見對映成功
![](https://img-blog.csdnimg.cn/20210116193339169.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0

如果遇到一對多的查詢 我們一般是在集合當中封裝一個集合類屬性

// An highlighted block

public class Dept1 {
    private Integer did;
    private String dname;
    private List<Employee> empList;

    public Dept1() {
    }

    public Dept1(Integer did, String dname, List<Employee> empList) {
        this.did = did;
        this.dname = dname;
        this.empList = empList;
    }

    public Integer getDid() {
        return did;
    }

    public void setDid(Integer did) {
        this.did = did;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public List<Employee> getEmpList() {
        return empList;
    }

    public void setEmpList(List<Employee> empList) {
        this.empList = empList;
    }

    @Override
    public String toString() {
        return "Dept1{" +
                "did=" + did +
                ", dname='" + dname + '\'' +
                ", empList=" + empList +
                '}';
    }
}

我是把一對多查詢分開然後進行的查詢

// An highlighted block
@Test
    public void text3() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
        String sql="select * from dept";
        List<Dept1> dept1List = queryRunner.query(sql, new BeanListHandler<Dept1>(Dept1.class));//先查到所有的部門
        for (Dept1 dept1 : dept1List) {//然後遍歷所有的部門根據部門id然後遍歷部門的所有員工
            String sql1="select * from employee where did=?";
            List<Employee> query = queryRunner.query(sql1, new BeanListHandler<Employee>(Employee.class), dept1.getDid());
            dept1.setEmpList(query);
        }
        for (Dept1 dept1 : dept1List) {
            System.out.println(dept1);
        }

    }

但是有的時候我們會遇到設計資料庫的人 把dept表的id 叫 id 然後把 employee表的id 也叫id 這樣我們在建立實體類的時候如果在不變通就會無法用我們上面所說的第一種 我是把這兩個id區分開 然後在對他們查詢的時候進行別名 這個別名和實體類的屬性名一樣 這樣我們通過 MapListHandler得到的key-value的key就會是我們起的別名了 然後不會重複的兩個id

// An highlighted block
 @Test
    public void text2() throws SQLException, InvocationTargetException, IllegalAccessException {
        QueryRunner queryRunner=new QueryRunner(new ComboPooledDataSource());
        String sql="select eid id,ename name,did deptId,regTime time from employee";//查詢的時候起別名防止兩個表的id欄位都叫id
        List<Map<String, Object>> query = queryRunner.query(sql, new MapListHandler());
        List<Employee2> emp2s=new ArrayList<>();
        for (Map<String, Object> map : query) {
           Employee2 emp=new Employee2();
           BeanUtils.populate(emp,map);
           emp2s.add(emp);
        }
        for (Employee2 emp2 : emp2s) {
            System.out.println(emp2);
        }
    }

希望能幫到大家 用用的大家多多點贊哦 嘿嘿!!!!