1、 快递员的条件分页查询-noSession,条件查询

2、 快递员删除(逻辑删除)

3、 基于Apache POI实现批量导入区域数据

a) Jquery OCUpload上传文件插件使用

b) Apache POI读取excel文件数据

1.1 快递员的条件分页查询 --关键 需要将查询条件 和分页条件都绑定到一次请求中

1、 提供工具方法:将表单序列化为json对象

//工具方法:将表单中输入项格式化为json对象 {"input的name":"input的value",}

$.fn.serializeJson=function(){

var serializeObj={};

var array=this.serializeArray();

var str=this.serialize();

$(array).each(function(){

if(serializeObj[this.name]){

if($.isArray(serializeObj[this.name])){

serializeObj[this.name].push(this.value);

}else{

serializeObj[this.name]=[serializeObj[this.name],this.value];

}

}else{

serializeObj[this.name]=this.value;

}

});

return serializeObj;

};

1、 给弹出查询窗口,查询按钮绑定单击事件

1.1.1 服务端完成查询

1、 将页面提交参数获取到,查询数据中符合条件数据

2、 现在Dao继承接口JpaRepository接口,没有根据条件查询,返回分页数据方法。故需要让dao接口继承另外接口

1、 改造action中分页方法

/**

* @Description: 快递员分页查询

*/

@Action("courierAction_pageQuery")

public String pageQuery() throws Exception {

Pageable pageable = new PageRequest(page-1, rows);

//通过模型驱动model将查询条件获取到

Page<Courier> page = courierService.pageQuery(model, pageable);

Map<String, Object> map = new HashMap<>();

map.put("total", page.getTotalElements());

map.put("rows", page.getContent());

//需要将一些不要转json属性排除掉

JsonConfig jsonConfig = new JsonConfig();

jsonConfig.setExcludes(new String[]{"fixedAreas"});

String json = JSONObject.fromObject(map, jsonConfig).toString();

System.out.println(json);

//通过response对象向浏览器响应json

ServletActionContext.getResponse().setContentType("text/json;charset=utf-8");

ServletActionContext.getResponse().getWriter().write(json);

return NONE;

}

2、 Service层中进行条件封装

/**

* @Description: 条件查询(单表查询,多表关联查询)

* @param model :查询条件

* @param pageable :分页需要参数

ORM框架查询:通过查询实体 设置查询条件 最终发出sql: select * from tableName where c1 = ? and|or c2 = ? or c3 like '%'?'%'

*/

public Page<Courier> pageQuery(Courier model, Pageable pageable) {

final String courierNum = model.getCourierNum();

final String company = model.getCompany();

final String type = model.getType();

final Standard standard = model.getStandard();

//Specification对象封装查询条件

Specification<Courier> spec = new Specification<Courier>() {

//predicate查询条件: 等同于 where c1 = ?

//Root:代表Criteria查询的根对象, 相当于sql : from talbeName

//CriteriaQuery接口:代表一个specific的顶层查询对象,它包含着查询的各个部分,比如:select 、from、where、group by、order by等

//CriteriaBuilder接口:用来构建CritiaQuery的构建器对象: 工厂对象:创建Predicate工厂实例

public Predicate toPredicate(Root<Courier> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

List<Predicate> list = new ArrayList<>();

//cb.equal 运算符 使用等于=

//p1:查询根实体中属性 p2:查询条件值

if(StringUtils.isNotBlank(courierNum)){

Predicate p1 = cb.equal(root.get("courierNum").as(String.class), courierNum);

list.add(p1);

}

if(StringUtils.isNotBlank(company)){

Predicate p2 = cb.like(root.get("company").as(String.class), "%"+company+"%");

list.add(p2);

}

if(StringUtils.isNotBlank(type)){

Predicate p3 = cb.equal(root.get("type").as(String.class), type);

list.add(p3);

}

//快递员表跟收派标准表关联查询

if(standard!=null && StringUtils.isNotBlank(standard.getName())){

//创建收派标准关联对象 默认内连接

Join<Object, Object> join = root.join("standard", JoinType.INNER);

Predicate p4 = cb.equal(join.get("name").as(String.class), standard.getName());

list.add(p4);

}

if(list!=null && list.size()==0){

return null;

}

Predicate[] restrictions = new Predicate[list.size()];

//将list集合转为数组

restrictions = list.toArray(restrictions);

//cb.and 相对多个条件 并且 cb.or--或者

return cb.and(restrictions);

}

};

return courierDao.findAll(spec , pageable);

1.1.1 JpaSpecificationExecutor查询接口说明

参数:Criteria查询基本概念

Criteria 查询是以元模型的概念为基础的,元模型是为具体持久化单元的受管实体定义的,这些实体可以是实体类,嵌入类或者映射的父类。

CriteriaQuery接口:代表一个specific的顶层查询对象,它包含着查询的各个部分,比如:select 、from、where、group by、order by等

注意:CriteriaQuery对象只对实体类型或嵌入式类型的Criteria查询起作用

参数:Root接口:代表Criteria查询的根对象,Criteria查询的查询根定义了实体类型,能为将来导航获得想要的结果,它与SQL查询中的FROM子句类似

1:Root实例是类型化的,且定义了查询的FROM子句中能够出现的类型。

2:查询根实例能通过传入一个实体类型给 AbstractQuery.from方法获得。

3:Criteria查询,可以有多个查询根。

4:AbstractQuery是CriteriaQuery 接口的父类,它提供得到查询根的方法。

参数:CriteriaBuilder接口:用来构建CritiaQuery的构建器对象

返回值:Predicate:一个简单或复杂的谓词类型,其实就相当于条件或者是条件组合。

Criteria查询

基本对象的构建

1:通过EntityManager的getCriteriaBuilder或EntityManagerFactory的getCriteriaBuilder方法可以得到CriteriaBuilder对象

2:通过调用CriteriaBuilder的createQuery或createTupleQuery方法可以获得CriteriaQuery的实例

3:通过调用CriteriaQuery的from方法可以获得Root实例

过滤条件

1:过滤条件会被应用到SQL语句的FROM子句中。在criteria 查询中,查询条件通过Predicate或Expression实例应用到CriteriaQuery对象上。

2:这些条件使用 CriteriaQuery .where 方法应用到CriteriaQuery 对象上

3:CriteriaBuilder也作为Predicate实例的工厂,通过调用CriteriaBuilder 的条件方法( equal,notEqual, gt, ge,lt, le,between,like等)创建Predicate对象。

4:复合的Predicate 语句可以使用CriteriaBuilder的and, or andnot 方法构建。

构建简单的Predicate示例:

Predicate p1=cb.like(root.get(“name”).as(String.class), “%”+uqm.getName()+“%”);

Predicate p2=cb.equal(root.get("uuid").as(Integer.class), uqm.getUuid());

Predicate p3=cb.gt(root.get("age").as(Integer.class), uqm.getAge());

构建组合的Predicate示例:

Predicate p = cb.and(p3,cb.or(p1,p2));

当然也可以形如前面动态拼接查询语句的方式,比如:

java代码:

查看复制到剪贴板打印

Specification<UserModel> spec = new Specification<UserModel>() {

public Predicate toPredicate(Root<UserModel> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

List<Predicate> list = new ArrayList<Predicate>();

if(um.getName()!=null && um.getName().trim().length()>0){

list.add(cb.like(root.get("name").as(String.class), "%"+um.getName()+"%"));

}

if(um.getUuid()>0){

list.add(cb.equal(root.get("uuid").as(Integer.class), um.getUuid()));

}

Predicate[] p = new Predicate[list.size()];

return cb.and(list.toArray(p));

}

};

也可以使用CriteriaQuery来得到最后的Predicate,示例如下:

java代码:

查看复制到剪贴板打印

Specification<UserModel> spec = new Specification<UserModel>() {

public Predicate toPredicate(Root<UserModel> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

Predicate p1 = cb.like(root.get("name").as(String.class), "%"+um.getName()+"%");

Predicate p2 = cb.equal(root.get("uuid").as(Integer.class), um.getUuid());

Predicate p3 = cb.gt(root.get("age").as(Integer.class), um.getAge());

//把Predicate应用到CriteriaQuery中去,因为还可以给CriteriaQuery添加其他的功能,比如排序、分组啥的

query.where(cb.and(p3,cb.or(p1,p2)));

//添加排序的功能

query.orderBy(cb.desc(root.get("uuid").as(Integer.class)));

return query.getRestriction();

}

逻辑删除

、页面:调整

function doDelete(){

//判断选中记录数

var rows = $("#grid").datagrid("getSelections");

if(rows.length==0){

$.messager.alert('系统信息',"请至少选中一条记录操作!","warning");

}else{

console.info(rows);

//创建js数组对象

var array = new Array();

//将选中快递员json数组中id获取出来

for(var i=0;i<rows.length;i++){

var id = rows[i].id;

//push() 方法可向数组的末尾添加一个或多个元素

array.push(id);

}

//元素是通过指定的分隔符进行分隔的。

var ids = array.join(",");

//发送请求,将快递员id提交

window.location.href="${pageContext.request.contextPath}/courierAction_delete.action?ids="+ids;

//或者发送ajax请求

}

}

};

1.1 方式二:ajax请求提交

function doDelete(){

//判断选中记录数

var rows = $("#grid").datagrid("getSelections");

if(rows.length>0){

$.messager.confirm('提示信息','是否进行删除!',function(r){

if(r){

// 将删除快递员id获取到

//创建数组

var array = new Array();

for(var i=0;i<rows.length;i++){

var id = rows[i].id;

//向数组中添加数据

array.push(id);

}

//设置数组内容拼接符 默认使用逗号分隔

var ids = array.join(",");

//发送请求:提交快递员的id 删除数据

//方式一:location.href="xxx.action?ids="+ids; 会刷新页面,需要在服务端配置结果视图

//方式二:发送ajax请求,不需要结果视图

$.post("${pageContext.request.contextPath}/courierAction_deleteBatch.action",{“ids”:ids},function(data){

//让datagrid重新加载数据

$("#grid").datagrid("reload");

})

}

})

}else{

$.messager.alert('提示信息','请至少选中一条记录操作!','warning');

}

}

1、 ocUpload使用:

a) 引入js文件

<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.8.3.js"></script>

<script type="text/javascript" src="${pageContext.request.contextPath }/js/ocupload/jquery.ocupload-1.1.2.js"></script>

b) 在页面提供任意的元素 给出id

c) 在页面加载完成后调用uplaod方法:动态修改html元素

 

public static void main(String[] args) throws Exception {

//解析本地磁盘exel文件 后缀名:xls

//文件目录

String pathname = "H:\\北京Java271期_速运快递\\速运快递项目-day04\\资料\\03_区域测试数据\\区域导入测试数据.xls";

//使用POI提供API读取文件

//:excel文件对象

//07版本 XSSFWorkbook

HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(pathname)));

//解析文件中数据

//从文件对象中获取标签页

HSSFSheet sheet = workbook.getSheetAt(0);

//遍历标签页中行

for (Row row : sheet) {

//遍历每一行中单元格中数据

System.out.println();

for (Cell cell : row) {

System.out.print(cell.getStringCellValue()+" ");

}

}

}

1.1.1 在项目中使用POI

//定义变量接收上传文件

private File upload;

//接收文件MIME类型,文件名称

private String uploadContentType;

private String uploadFileName;

public void setUpload(File upload) {

this.upload = upload;

}

public void setUploadContentType(String uploadContentType) {

this.uploadContentType = uploadContentType;

}

public void setUploadFileName(String uploadFileName) {

this.uploadFileName = uploadFileName;

}

/**

* @Description: 通过POI解析excel文件中数据

*/

@Action("areaAction_importXls")

public String importXls() throws Exception {

List<Area> list = new ArrayList<>();

//创建excel文件对象

HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(upload));

//获取标签页

HSSFSheet sheet = workbook.getSheetAt(0);

//遍历标签页获取行

for (Row row : sheet) {

//忽略标题行

if(row.getRowNum()==0){

continue;

}

String id = row.getCell(0).getStringCellValue();

String province = row.getCell(1).getStringCellValue();

String city = row.getCell(2).getStringCellValue();

String district = row.getCell(3).getStringCellValue();

String postcode = row.getCell(4).getStringCellValue();

//创建区域对象

Area area = new Area(id, province, city, district, postcode, null, null);

list.add(area);

}

areaService.save(list);

//释放资源

workbook.close();

//由于提交表单到Iframe中,故配置结果视图也看不到

return NONE;

}

1.1 Pinyin4j

汉字跟拼音转换。

1.1.1 Demo

项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据的更多相关文章

  1. jQuery 自制上传头像插件-附带Demo实例(ajaxfileupload.js第三弹)

    这篇文章主要是对前两篇关于ajaxfileupload.js插件的文章 <ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload. ...

  2. jquery头像上传剪裁插件cropper的前后台demo

    因为一个项目要做一个头像上传的功能,因此选择了使用jquery的头像插件cropper,cropper是一款使用简单且功能强大的图片剪裁jQuery插件,但是在使用的时候,有一个很大的坑需要注意,那就 ...

  3. jquery.ocupload上传文件到指定目录

    首先引入两个js <script type="text/javascript" src="${pageContext.request.contextPath }/r ...

  4. PHPExcel读取excel文件示例

    PHPExcel读取excel文件示例PHPExcel最新版官方下载网址:http://phpexcel.codeplex.com/PHPExcel是一个非常方便生成Excel格式文件的类,官方下载包 ...

  5. asp.net读取excel文件多种方法

    asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件.引用的com组件读取Excel文件.用文件流读取.   方法一:采用OleDB读取Excel文件 把Excel文件 ...

  6. .NET读取Excel文件的三种方法的区别

    ASP.NET读取Excel文件方法一:采用OleDB读取Excel文件: 把Excel文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(strin ...

  7. 使用jxl,poi读取excel文件

    作用:在java后台添加一个方法,读取导入的excel内容,根据需要返回相应的sql语句,以完成对临时表的插入操作. 使用jxl读取excel文件 package com.sixthf.bi.sapp ...

  8. 使用POI读取excel文件内容

    1.前言 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两个工具.这里我们介绍使用POI实现读取excel文档. 2.代码实例: ...

  9. jspsmart(保存文件)+poi(读取excel文件)操作excel文件

    写在前面: 项目环境:jdk1.4+weblogic 需求:能上传excel2003+2007 由于项目不仅需要上传excel2003,还要上传excel2007,故我们抛弃了jxl(只能上传exce ...

随机推荐

  1. Vue mixins extends extend components

    mixins 调用方式: mixins: [mixin1, mixin2] 是对父组件的扩充,包括methods.components.directive等... 触发钩子函数时,先调用mixins的 ...

  2. hd acm1018

    Problem Description In many applications very large integers numbers are required. Some of these app ...

  3. RabbitMQ点对点的模式

    1.点对点模式  一对一模式.  一个生产者投递消息给队列 只能允许有一个消费者进行消费    如果集群的话 会进行均摊消费   服务器配置不一样 均摊就不优了 长连接 不用三次握手之类的 提高传输效 ...

  4. 如何搭建一个GitHub在自己的服务器上?

    摘自:http://blog.csdn.net/yangzhenping/article/details/43937595

  5. POJ 2831 Can We Build This One:次小生成树【N^2预处理】

    题目链接:http://poj.org/problem?id=2831 题意: 给你一个图,每条边有边权. 然后有q组询问(i,x),问你如果将第i条边的边权改为x,这条边是否有可能在新的最小生成树中 ...

  6. php设计模式课程---8、适配器模式是什么

    php设计模式课程---8.适配器模式是什么 一.总结 一句话总结: 充电过程中,手机充电器相对于手机和插座之间就是适配器 1.编程中的适配器是怎么回事? 写一个类(适配器),将传入的数据的格式或者内 ...

  7. delphi数据库的备份及还原

    实例应用1: //备份procedure TF_DataBaseBackUp.Btn_bfClick(Sender: TObject); var i:integer; begin if SaveDia ...

  8. 机器学习(十九)— xgboost初试kaggle

     1.官网下载kaggle数据集Homesite Competition数据集,文件结构大致如下: 2.代码实战 #Parameter grid search with xgboost #featur ...

  9. python_doc 读写docx文件

    python读写word文档有现成的库可以处理,在这里采用了 python-docx. 首先先安装 pip install python-docx #!/usr/bin/env python # -* ...

  10. 机器学习 Generative Learning Algorithm (A)

    引言 前面几讲,我们主要探讨了如何对 p(y|x;θ) (即y 相对于x的条件概率)进行建模的几种学习算法,比如,logistic regression 对 p(y|x;θ) 进行建模的假设函数为 h ...