之前讲到的分页查询还不够完美,接下来说下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对象 有些不规范,还有改进的余地。