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. 网页中显示xml,直接显示xml格式的文件

    第一种方法 使用<pre></pre>包围代码(在浏览器中测试不行啊,但是在富编辑器中又可以,怪):使用<xmp></xmp>包围代码(官方不推荐,但是 ...

  2. c的详细学习(7)指针学习(一)

    指针是c语言的一个重要概念,指针类型是c语言最有特色的数据类型: *利用指针编写的程序可使调用函数共享变量或数据结构,实现双向数据通信: *可以实现内存空间的动态存储分配:可以提高程序的编译效率和执行 ...

  3. MySQL的进程状态

    通过show processlist查看MySQL的进程状态,在State列上面的状态有如下这些: Analyzing线程对MyISAM 表的统计信息做分析(例如, ANALYZE TABLE ).c ...

  4. poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】

    题目地址:http://poj.org/problem?id=3264 Sample Input 6 3 1 7 3 4 2 5 1 5 4 6 2 2 Sample Output 6 3 0分析:标 ...

  5. Codeforces Round #250 (Div. 2) D. The Child and Zoo 并查集

    D. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  6. SpringMVC的优点

    SpringMVC的优点 清晰的角色划分:控制器(controller).验证器(validator).命令对象(command obect).表单对象(form object).模型对象(model ...

  7. python 特征选择 绘图 + mine

    demo代码: # _*_coding:UTF-8_*_ import numpy as np import sys import pandas as pd from pandas import Se ...

  8. codeforces 632C C. The Smallest String Concatenation(sort)

    C. The Smallest String Concatenation time limit per test 3 seconds memory limit per test 256 megabyt ...

  9. C++ vector容器删除操作

    1.vector::pop_back() 删除vector的最后一个元素,vector的大小减一,删了的元素被销毁. 2.vector::erase() iterator erase (iterato ...

  10. 【LeetCode】012. Integer to Roman

    Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...