JFinal之旅——Sql 管理与动态生成实现简洁分页

之前讲到的分页查询还不够完美,接下来说下JFinal中的Sql语句管理,来实现简洁的分页操作。

  • 创建sql文件
    说明:我这里用的方法是只添加一个主sql文件main.sql,main.sql里面引用其他sql文件。
    这里写图片描述

  • main.sql文件内容
    说明:引用同级目录下的user.sql 和 test.sql文件。注意:获取user.sql文件中的sql语句时,需要加上namespace(“user”)中的user

#namespace("user")
    #include("user.sql")
#end
#namespace("test")
    #include("test.sql")
#end
  • 加载main.sql文件
    说明:一样在jfinal的核心配置文件 BaseConfig 类中的 configPlugin 类中
/**
     * 数据库连接
     */
    @Override
    public void configPlugin(Plugins plugins) {
        Prop p=PropKit.use("jdbc.properties");
        //数据库连接
        DruidPlugin dp = new DruidPlugin(p.get("jdbcUrl").trim(), 
        p.get("user").trim(), p.get("password").trim());
        plugins.add(dp);
        ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
        plugins.add(arp);   
        //映射模型
        arp.addMapping("pw_user","userId",User.class);
        System.out.println("------------------------数据库加载成功---------------------------------------");   
        arp.setBaseSqlTemplatePath(PathKit.getRootClassPath()+"/sql");//设置存放sql文件的基础路径
        arp.addSqlTemplate("main.sql");
        System.out.println("-----------------------加载数据库模板成功---------------------------------------");
    }
  • 编写sql语句
    说明:编写user.sql中的sql语句,我们都把复杂的多表查询语句统一放在user.sql表中,方便日后维护、修改。
    这里的查询语句,我先放在test.sql文件中。
#sql("finadPage")
    SELECT
        pw_user.`name`,
        pw_user.username,
        sys_usertype.usertypename
    FROM
        pw_user
        INNER JOIN sys_usertype ON sys_usertype.usertypeId = pw_user.usertypeId
#end
  • 获取sql语句
    这里将演示如何获取sql文件中的sql语句
/**
     * 利用sql动态管理的到sql语句
     * sqlFind      
     * 2017年8月8日 下午9:14:16
     */
    public void sqlFind(){
        //直接输入对应Id  test 对应着 main.sql文件中的namepace中的值 finadPage 对应着test.sql中的sql("finadPage") 
        String sql=Db.getSql("test.finadPage");
        System.out.println("sql语句是:"+sql);
        //直接调用模型的find方法
        List<User> list=User.dao.find(sql);
        renderText(list.toString());
    }

结果截图:
这里写图片描述
当然,浏览器访问也是可以出结果的,这里就不截图了。

  • sql条件语句
    说明:上面演示了获取sql文件中的sql语句,但sql语句还是无参的,接下来就显示有参数的sql语句,主要目的是给sql参数。
    user.sql文件中的内容
#sql("finadUserVo")
    SELECT
        pw_user.`name`,
        pw_user.username,
        sys_usertype.usertypename
    FROM
        pw_user
        INNER JOIN sys_usertype ON sys_usertype.usertypeId = pw_user.usertypeId
    WHERE  pw_user.username  like CONCAT('%',#para(userName),'%')
#end

这里可以看到#para(userName),其实userName就是一个参数

  • 调用sql并赋值参数
    说明:主要用到Db.getSqlPara(“位置”,Map);这个方法的第二个参数需要个map集合,但我们通过前台传过来的参数都保存到了一个类中。所有,接下来就要将UserDto转成map集合。
    当然,首先要导入将class转map的包,在pom.xml中添加包
<!-- 将类转换成ma集合 -->
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.3</version>
    </dependency>

因为所有的Dto类都继承了分页类Pagination,所有转map的方法直接在Pagination写就好了,由于需求,Pagination需要加个泛型T

package com.gx.test.common.util;

import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtilsBean;


/**
 * 分页页码显示(原分页插件不可设置分页数据)
 * @title
 * @filename PaginationSupport.java
 * @author L-z
 * @date 2017年8月1日 下午3:11:09
 * @version 1.0
 */
public class Pagination<T> 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;
    }

    /**转换成map对象*/
    public  Map<String, Object> toMap(T t){
        HashMap<String,Object> params = new HashMap<String, Object>();
        try {
            PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
            PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(t);
            for (int i = 0; i < descriptors.length;i++){
                String name=descriptors[i].getName();
                if (!"class".equals(name)){
                    params.put(name,propertyUtilsBean.getNestedProperty(t,name));
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        return params;
    }
}

接下来就可以将UserDto转成map对象并赋值给sql语句中的参数了

    /**
     * sql语句中的参数赋值
     * sqlPareFind      
     * 2017年8月8日 下午9:30:35
     */
    public void sqlPareFind(){
        //获取参数
        UserDto userDto=super.getBean(UserDto.class);
        //设置参数
        userDto.setPageSize(20);
        userDto.setPageNumber(1);
        userDto.setUserName("a");
        //获取sql语句
        System.out.println("Map对象:"+userDto.toMap(userDto));
        SqlPara sqlPara=Db.getSqlPara("user.finadUserVo",userDto.toMap(userDto));
        Page<User> page=User.dao.paginate(userDto.getPageNumber(), userDto.getPageSize(), sqlPara);
        renderText("sql语句:"+sqlPara.toString()+"\n分页数据:\n"+page.toString()+"\n数据集合:"+page.getList().toString());
    }

代码都是刚写的,我这里转map对象 有些不规范,还有改进的余地。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值