springboot + layui ,使用时间作为参数进行数据库的查询。springboot的时间操作真的让我头疼,传递参数和取值看网上说的乱七八糟。等有时间了我要好好整理整理这部分内容。
一、数据库存储为Date,查询值也是Date
这种情况就是,数据库中的日期格式为date,既没有时间。然后我们查询的关键字也是date类型。
前端时间选择页面
<div class="layui-inline layui-show-xs-block">
<input class="layui-input" id="searchtime" name="searchtime" type="text"
placeholder="请选择查询时间" autocomplete="off">
</div>
<div class="layui-inline layui-show-xs-block">
<button class="layui-btn" onclick="instockTimeSearch()">
<i class="layui-icon"></i></button>
</div>
使用的是 layui
,所以要加上layui
组件才能显示时间:
var time; //定义一个全局的time变量,用于接受layui监听的时间值
laydate.render({
elem: '#searchtime'
, showBottom: false
, trigger: 'click'
, done: function (value) { // 获取选取时间后的值
time = value;
}
});
获取时间选择器的值,并进行判断
function instockTimeSearch() {
//console.log(time);
if (typeof(time) === "undefined"){ // 判断时间是否输入,为空的话显示提示
layer.msg('请输入查询时间!', {icon: 5, time: 1000});
} else {
window.location.href = "/usermanage/timeSearch/" + time;
}
}
springboot后台接收日期参数并进行查找
@GetMapping("/timeSearch/{time}")
public String getStockingByTime(Model model,
@PathVariable("time") Date time,
@RequestParam(value = "pn", defaultValue = "1") int pn,
@RequestParam(value = "size", defaultValue = "8") int size){
PageHelper.startPage(pn, size);
List<Stocking> stockingList = stockingService.getStockingByTime(time);
PageInfo<Stocking> page = new PageInfo<>(stockingList);
model.addAttribute("page", page);
return "instock/instock-list";
}
上面代码运行要注意:要在 application.properties文件中添加这样的一句设置:spring.mvc.date-format=yyyy-MM-dd
。否则,控制层函数是不会接收到Date
类型的time
参数的。
二、数据库为Datetime类型,查询值只用日期
这种情况是,数据库存储日期时间,用datetime;但是我们在查询时不想精确到时间,只想根据日期查询。
mapper 文件
<resultMap id="LogMap" type="pinksmile.database.domain.SystemLog">
<result column="id" javaType="Integer" jdbcType="INTEGER" property="id"/>
<result column="username" javaType="String" jdbcType="VARCHAR" property="username"/>
<result column="method" javaType="String" jdbcType="VARCHAR" property="method"/>
<result column="describes" javaType="String" jdbcType="VARCHAR" property="describes"/>
<result column="time" javaType="java.util.Date" jdbcType="TIMESTAMP" property="time"/>
</resultMap>
<select id="getLogByDatetime" resultMap="LogMap">
select * from syslog where DATE_FORMAT(time, '%Y-%m-%d') = #{time}
</select>
这里DATE_FORMAT(time,'%Y-%m-%d')
是将数据库中时间转换为指定格式,这里就相当于提取了日期。
实体类
Dao接口
参数使用的是String
类型
List<SystemLog> getLogByDatetime(String time);
Service层就不用说了
Controller层
@GetMapping("/timeSearchLog/{time}")
public String getLogByTime(Model model,
@PathVariable("time") String time,
@RequestParam(value = "pn", defaultValue = "1") int pn,
@RequestParam(value = "size", defaultValue = "8") int size){
PageHelper.startPage(pn, size);
List<SystemLog> systemLogList = systemlogService.getLogByDatetime(time);
PageInfo<SystemLog> page = new PageInfo<>(systemLogList);
model.addAttribute("page", page);
return "systemlog/systemlog-list";
}
这里是重点,我看网上好多都是转换时间格式,转过来转过去的,很麻烦!这个是我自己试验得出的方法。
我们从前台获取传过来的时间参数,在后台我们用String
类型接收,然后调用接口就不用转换为date
类型的了。直接使用即可。
这里使用String
的原因是,在mapper文件中,我们根据时间查询时使用的参数是String
类型的。
下面把前台传参的部分也贴上,可以更好的参考: