JFinal之旅——find方法及分页查询

来源:互联网 发布:想搞网络课直播 编辑:程序博客网 时间:2024/05/21 10:39

先说明下项目环境:Maven项目、JDK是1.7、编码是UTF-8、JFinal是3.1版本然后tomcat是8.0
里面的命名规则都在之前的博文有写到,写博文的时候也是重新搭建了一个项目,一步步来实现功能

  • JFinal中的find方法
    说明:一般的分页查询,都是多表查询,但JFinal的find的返回值是List(ps:M对应者模型类),但实际不然。
    /**     * 查询方法!     * find          * 2017年8月5日 下午4:22:48     */    public void find(){        //这里先介绍JFinal中的Find方法!        String sql="SELECT pw_user.username,sys_usertype.usertypename FROM pw_user INNER JOIN sys_usertype ON sys_usertype.usertypeId = pw_user.usertypeId";        List<User> list=User.dao.find(sql);        String userTypeName=list.get(0).get("usertypename");        renderText("结果值:"+list.toString()+"\n 读取到的值:"+userTypeName);    } 

说明:上面的查询语句中的usertypename不是原来User类中的字段,但还是能够从中赋值并读取
结果截图:
这里写图片描述

认识这点是很重要的

  • 创建分页类
    说明:一般分页查询,都会从前台传 2个参数:当前页及页码,但是不免会用到数据总数是否改变等情况,所以这里从前台传过来的参数有这些:当前页、当前页大小、总数据行数、最大页数。但是JFinal的page类又不能设置这些数据,就只能自己创建了实体类Pagination来接收并设置数据:
package com.gx.test.common.util;import java.io.Serializable;/** * 分页页码显示(原分页插件不可设置分页数据) * @title * @filename PaginationSupport.java * @author L-z * @date 2017年8月1日 下午3:11:09 * @version 1.0 */public class Pagination implements Serializable {    private static final long serialVersionUID = 2234283310680151858L;    /** 默认显示页码数 */    public static final int DEFAULT_OFFSET_SIZE = 3;    /** 默认每页行数 */    public static final int DEFAULT_PAGE_SIZE = 20;    /** 显示页码数 */    private int totalPage = DEFAULT_OFFSET_SIZE;    /** 每页行数 */    private int pageSize = DEFAULT_PAGE_SIZE;    /** 记录总数 */    private long totalRow;    /** 当前页码 */    private int pageNumber = 1;    public int getTotalPage() {        return totalPage;    }    public void setTotalPage(int totalPage) {        this.totalPage = totalPage;    }    public int getPageSize() {        return pageSize;    }    public void setPageSize(int pageSize) {        this.pageSize = pageSize;    }    public long getTotalRow() {        return totalRow;    }    public void setTotalRow(long totalRow) {        this.totalRow = totalRow;    }    public int getPageNumber() {        return pageNumber;    }    public void setPageNumber(int pageNumber) {        this.pageNumber = pageNumber;    }    /**     * 第一条数据位置     *      * @return     */    public int getFirstResult() {        return (pageNumber - 1) * pageSize;    }    /**     * 获取总页数     */    public long getPageCount() {        if (totalRow % pageSize == 0)            return totalRow / pageSize;        else            return (totalRow / pageSize) + 1;    }}
  • 接收并设置参数
    说明:查询条件肯定不止分页参数,所有要创建个UserDto来继承Pagination类。
    使用Dto来接收参数有个好处:如果查询条件要增加或修改字段,直接在Dto里修改成员就可以的。
package com.gx.test.pojo.dto;import com.gx.test.common.util.Pagination;/** * 分页查询条件 * @title * @filename UserDto.java * @author L-z * @date 2017年8月2日 上午9:08:00 * @version 1.0 */public class UserDto extends Pagination {    /**     * @title     */    private static final long serialVersionUID = 1952110800486176148L;    /**     * 用户姓名     */    private String userName;    /**     * 用户类别     */    private String userType;    private Integer userId;    public Integer getUserId() {        return userId;    }    public void setUserId(Integer userId) {        this.userId = userId;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getUserType() {        return userType;    }    public void setUserType(String userType) {        this.userType = userType;    }    @Override    public String toString() {        return "UserDto [userName=" + userName + ", userType=" + userType + ", userId=" + userId + "]";    }}

下面是控制器代码

/**     * 分页查询     * pageFind          * 2017年8月5日 下午4:42:43     */    public void pageFind(){        //接收参数        UserDto userDto=super.getBean(UserDto.class);        //手动设置值        userDto.setPageNumber(1);        userDto.setPageSize(10);        //实际上只要调用 serivce中的方法 传userDto参数即可!         //这里我们为了简单 就直接实现serviceImpl中的方法        //暂时不设置查询条件        // sql语句:SELECT pw_user.username,sys_usertype.usertypename FROM pw_user INNER JOIN sys_usertype ON sys_usertype.usertypeId = pw_user.usertypeId";        String from =" FROM pw_user INNER JOIN sys_usertype ON sys_usertype.usertypeId = pw_user.usertypeId ";        String totalRowSql="select count(*)"+from;        String findSql="SELECT pw_user.username,sys_usertype.usertypename  "+from ;        Page<User> page=User.dao.paginateByFullSql(userDto.getPageNumber(), userDto.getPageSize(), totalRowSql, findSql);        renderText("分页数据:\n"+page.toString()+"\n数据集合:"+page.getList().toString());    }

结果截图:
这里写图片描述

  • 结论
    这里主要介绍了JFinal中的find方法的强大,并且可以看到分页查询的方式、思路。这里的分页方法还不够简洁,接下来的一篇博文讲介绍JFinal中的sql管理与动态生成,来实现多表查询及分页。