有关mysql和java的动态查询的自我学习总结
/这里创建了集合实例的理由是这里用到的DPHelper用了反射,用这个集合来存储你要查询的条件的值,比如平常不是where empno=?//最后list里存的是(empno,ename,dname,begindate,enddate,index,pageHelper.getShowData());System.out.println("请输入你要查看的页数,最多可查看" + pageHelper
动态查询(实际上就是用 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);
}
}
}
希望能帮到大家
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)