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

    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

     

  • 相关阅读:
    UVALIVE 2686 Stargates
    Codeforces 274 Div2
    选择、插入、希尔排序
    一些C++的语法
    Ubuntu18.04格式化U盘为NTFS的方法
    move_base Warning: Invalid argument "/map" passed to canTransform argument target_frame的解决方法
    错误: ‘shared_ptr’ in namespace ‘std’ does not name a type的解决方法。
    Ubuntu18.04环境下melodic安装gmapping
    RLException: XXX is neither a launch file in package XXX nor is XXX a launch file name问题解决
    ”dpkg: 处理归档 /var/cache/apt/archives/XXXXXX(--unpack)时出错“的解决方法
  • 原文地址:https://www.cnblogs.com/shan1393/p/9196782.html
Copyright © 2011-2022 走看看