动态查询(实际上就是用 StringBuilder 这个类来存储sql语句,通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder,然后根据if判断来在后面用append("")来在原来的基础上修改sql语句)
比如
StringBuilder strb = new StringBuilder("select e.*,d.dname from emp e natural join dept d where 1=1 ");
strb.append(" and empno=? ")括号里面的最前面和最后面记得加空格,为了避免sql语句连在一起出错
在使用了append()方法后, 用str存的sql语句就变成了"select e.*,d.dname from emp e natural join dept d where 1=1  and empno=? "

实例代码解释:

 public ArrayList<EmpDname> getEmpsByEmpDname(QueryEmpDept queryEmpDept, PageHelper pageHelper) throws ClassNotFoundException, SQLException {
        StringBuilder strb = new StringBuilder("select e.*,d.dname from emp e natural join dept d where 1=1 ");//where 1=1就这样得了,主要是为了有where这个语句来判断, and 是用在判断后面的关键字
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        ArrayList list = new ArrayList();//这里创建了集合实例的理由是这里用到的DPHelper用了反射,用这个集合来存储你要查询的条件的值,比如平常不是where empno=?,这个?就需要调用值取填,这里list里放的就是几个你要添加的数据。
        if (queryEmpDept.getEmpno() != nullqueryEmpDept.getEmpno().length()>0) {
            strb.append("and empno=? ");
            list.add(queryEmpDept.getEmpno());//这里添加到list集合里的是给上面?的    
        }
        if (queryEmpDept.getEname() != null&&queryEmpDept.getEname().length()>0) {
            strb.append("and ename like ? ");
            list.add("%" + queryEmpDept.getEname() + "%");//这个比较特殊,这个一般就是用来查你要查的列名的数据中有%你要查的%,比如你要查Eaname中含有M字母的数据。就可以写成%M%,添加到结合里的也是%你要查的%这种格式
        }
        if (queryEmpDept.getDname() != null&&queryEmpDept.getDname()>0) {
            strb.append("and dname = ? ");
            list.add(queryEmpDept.getDname());
        }
        if (queryEmpDept.getBegindate() != null&&queryEmpDept.getBegindate()>0) {
            strb.append(" and ?<=hiredate ");
            list.add(sdf.format(queryEmpDept.getBegindate()));
        }
        if (queryEmpDept.getEnddate() != null&&queryEmpDept.getEnddate()>0) {
            strb.append(" and hiredate<=? ");
            list.add(sdf.format(queryEmpDept.getEnddate()));
        }

        strb.append("limit ?,?"); // (indexPage-1)*showData  limit的后面的问号是显示几条数据,是4就是显示四条。前面的是从第几条数据开始,这里的0就是第一条数据。这是分页的原理
        System.out.println(strb);
        int index = (pageHelper.getIndexPage() - 1) * pageHelper.getShowData();
        list.add(index);
        list.add(pageHelper.getShowData());//最后list里存的是(empno,ename,dname,begindate,enddate,index,pageHelper.getShowData());这个就是自己要输入的值
        return db.selectinfo(strb.toString(), EmpDname.class, list.toArray());//strb.toString()把strb转为字符串,这样就相当于是正常的sql语句了。list.toArray();把集合转为数组,虽然集合底层是数组,但是显示不是,所以还得转为数组。
    }

分页工具类
public class PageHelper {

    private Integer showData = 3;//每页显示几条数据,默认3条
    private Integer countData;//一共有多少条数据参与分页。 要查数据库
    private Integer countPage;// 一共能分多少页
    private Integer indexPage = 1;// 当前是第几页,默认当前是第1页
    private ArrayList<EmpDname> list;//当前页显示的集合数据,要查数据库

    public PageHelper() {
    }

    public PageHelper(Integer showData, Integer countData, Integer countPage, Integer indexPage, ArrayList<EmpDname> list) {
        this.showData = showData;
        this.countData = countData;
        this.countPage = countPage;
        this.indexPage = indexPage;
        this.list = list;
    }

    public Integer getShowData() {
        return showData;
    }

    public void setShowData(Integer showData) {
        this.showData = showData;
    }

    public Integer getCountData() {
        return countData;
    }

    public void setCountData(Integer countData) {
        this.countData = countData;
        //当给总条数赋值后,立刻就知道总页数
        getCountPage();
    }

    public Integer getCountPage() {
        countPage = countData % showData == 0 ?
                countData / showData :
                countData / showData + 1;
        return countPage;
    }

  /*  public void setCountPage(Integer countPage) {
        this.countPage = countPage;
    }*/

    public Integer getIndexPage() {
        return indexPage;
    }

    public void setIndexPage(Integer indexPage) {
        this.indexPage = indexPage;
    }

    public ArrayList<EmpDname> getList() {
        return list;
    }

    public void setList(ArrayList<EmpDname> list) {
        this.list = list;
    }
}

业务层分页代码
public void getEmpsByEmpDname() throws ClassNotFoundException, SQLException, ParseException {
        QueryEmpDept queryEmpDept = getQuery();
        PageHelper pageHelper = new PageHelper();
        pageHelper.setCountData(empDao.selectEmpsSize(queryEmpDept));
        int indexpage = 1;
        while (indexpage > 0 && indexpage <= pageHelper.getCountPage()) {
            System.out.println("===>数据展示如下:");
            System.out.println("===>" + pageHelper.getIndexPage() + "/" + pageHelper.getCountPage());
            ArrayList<EmpDname> empsByEmpDname = empDao.getEmpsByEmpDname(queryEmpDept, pageHelper);
            for (EmpDname e : empsByEmpDname) {
                System.out.println(e);
            }
            System.out.println("请输入你要查看的页数,最多可查看" + pageHelper.getCountPage() + "页:");
            indexpage = input.nextInt();
            if (indexpage > 0 && indexpage <= pageHelper.getCountPage()) {
                pageHelper.setIndexPage(indexpage);
            }
        }


    }

希望能帮到大家
 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐