首先贴一个POJO
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TeachIn {
private Integer id; //宣讲会唯一id主键
private String name; //宣讲会名字
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date release_time; //宣讲会时间
private String company_job; //招聘职位
private String profession; //招聘专业
private String xueli; //学历
private String linkman; //联系人
private String phone; //联系人电话
private String company_address; //公司地址
private String email; //联系邮箱
private String about_us; //公司简介
}
在做一个功能的时候:就是根据日期来查询数据库如图:
打开jsp时,数据表格自动渲染数据表格,并且开启分页模式.
封装了一个类并且继承这个TeachIn类
/**
* 自定义查询条件类
*/
@Data
public class TeachInVo extends TeachIn {
//注意page和limit属性要与layui数据表格参数一致
private Integer page; //当前页码
private Integer limit; //每页显示数据
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date time_search; //搜索时间
}
写出一个查询方法
mapper
<mapper namespace="com.xgx.dao.TeachInDAO">
<select id="findAll" resultType="TeachIn">
select *
from teach_in
<where>
<if test="name != null and name != ''">
and name like concat("%",#{name},"%")
</if>
<if test="time_search != null and time_search !=''">
<![CDATA[ and DATE_FORMAT(release_time, '%Y-%m-%d') = DATE_FORMAT(#{time_search}, '%Y-%m-%d') ]]>
</if>
</where>
</select>
</mapper>
conller类
@RequestMapping("/findAllTeachIn")
@ResponseBody
public DataGridViewResult findAllTeachIn(TeachInVo teachInVo){
System.out.println("teachInVo = " + teachInVo);
//设置分页信息(当前页码,每页显示数量)
PageHelper.startPage(teachInVo.getPage(),teachInVo.getLimit());
//调用分页查询列表账单
List<TeachIn> teachInList = teachInService.findAll(teachInVo);
//创建分页对象
PageInfo<TeachIn> pageInfo = new PageInfo<TeachIn>(teachInList);
//将数据表格返回的key保存到Map集合中
DataGridViewResult dataGridViewResult = new DataGridViewResult(pageInfo.getTotal(), pageInfo.getList());
System.out.println("dataGridViewResult = " + dataGridViewResult);
return dataGridViewResult;
}
其中这个dataGridViewResult
此类封装layui数据表格中返回的数据
//此类封装layui数据表格中返回的数据
@Data
@NoArgsConstructor
public class DataGridViewResult {
private Integer code=0;
private String msg="";
private Long count;
private Object data;
/**
* 封装数据表格
* @param count 查询到的总条数
* @param data 结果集
*/
public DataGridViewResult(Long count, Object data) {
this.count = count;
this.data = data;
}
}
jsp代码如下
<%-- 搜索信息开始--%>
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">招聘会名</label>
<div class="layui-input-inline">
<input type="text" name="name" autocomplete="off" class="layui-input" >
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">发布日期</label>
<div class="layui-input-inline">
<input type="text" name="time_search" autocomplete="off" class="layui-input" id="dateA">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn layui-btn-primary" lay-submit lay-filter="doSearch" ><i class="layui-icon"></i> 搜 索</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
</fieldset>
<%-- 搜索信息结束--%>
<%--数据表格开始--%>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
<%--数据表格结束--%>
<script>
layui.use(['form', 'jquery','table','layer','laydate'], function () {
var $ = layui.jquery; //layui的jquery模块
var form = layui.form; //layui的表单模块
var table = layui.table; //layui的数据表格模块
var layer =layui.layer; //layui弹出层模块
var laydate = layui.laydate; //layui的渲染日期模块
//执行一个laydate实例
laydate.render({
elem: '#dateA' //指定元素
// ,type: 'datetime'
});
var tableIns=table.render({
elem: '#currentTableId',
url: '${pageContext.request.contextPath}/instructor/findAllTeachIn',
page:true, //开启分页
toolbar:"#toolbarDemo", //头部工具栏
cols: [[
{type:"checkbox",fixed:"left",width: 80},
{field: 'id', width: 80, title: 'ID', sort: true},
{field: 'name', width: 350, title: '招聘会名'},
{field: 'release_time', width: 150, title: '发布时间'},
{title: "操作",toolbar:'#barDemo'}
]]
});
//监听搜索按钮提交事件
form.on("submit(doSearch)",function (data) {
//自带刷新方法
console.log(data);
console.log(data.field);
tableIns.reload({
where:data.field, //查询条件
page: {
curr:1
}
})
return false; //禁止页面刷新
})
</script>
按理说就可以查到数据.于是开始测试
一开始也查到数据了,
当我模糊查询招聘会名的时候:
如图:
也是可以查到的.
当我查询发布日期时
就遇到了这个报错:
数据接口请求异常:parsererror
于是我F12
查询到这个请求
发现请求正常发送但是响应头是这样的
也没有任何数据显示
Content-Length: 0
说的应该是HTTP头的Content-Length: 0,表示的是返回是内容字节长度为0,即是请求返回包体是空的
于是为了找出这个错误我有查后台打印:
日志报错这个错误
Closing non transactional SqlSession
感觉应该是持久层的问题.于是去查看写的mapper没有发现问题:
于是写了一个测试类:
@Test
public void test9(){
Date date=new Date();
System.out.println("date = " + date);
long l=Date.parse("Mon 21 Feb 2021 13:3:00");
Date day=new Date(l); //day中时间为1997年 1月6号星期一,13:3:00。
System.out.println("day = " + day);
TeachInVo teachInVo=new TeachInVo();
teachInVo.setTime_search(day);
System.out.println("teachInVo = " + teachInVo);
List<TeachIn> all = teachInDAO.findAll(teachInVo);
System.out.println("all = " + all);
}
打印出的即通过如图
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
date = Mon Feb 22 14:32:42 CST 2021
day = Sun Feb 21 13:03:00 CST 2021
teachInVo = TeachInVo(page=null, limit=null, time_search=Sun Feb 21 13:03:00 CST 2021)
DEBUG [main] - Creating a new SqlSession
DEBUG [main] - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5b67bb7e] was not registered for synchronization because synchronization is not active
DEBUG [main] - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5b67bb7e]
发现java.util.Date和数据库中的Datetime/Date所对应
于是查找错误:
在最后一个 Caused by:中
Caused by: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
上网查询发现:
在mybatis 3.3.0中对于时间参数进行比较时引入了一个bug. 如果拿传入的时间类型参数与空字符串 ‘’ 进行对比判断则会引发异常.
所以在使用时间和字符串进行比较的代码,只保留非空判断就正常了。
就是把字段判空字符串删除就行了
修改前
<if test="time_search != null and time_search !=''">
<![CDATA[ and DATE_FORMAT(release_time, '%Y-%m-%d') = DATE_FORMAT(#{time_search}, '%Y-%m-%d') ]]>
</if>
修改后
<if test="time_search != null ">
<![CDATA[ and DATE_FORMAT(release_time, '%Y-%m-%d') = DATE_FORMAT(#{time_search}, '%Y-%m-%d') ]]>
</if>
最后