Mybatis、Oracle、前端传值的时间字段遭遇的坑

首先是踩了坑花了2小时的教训才学聪明了,最好的解决方案是 将对象字段和数据库字段都设置 Date类型,这样在mybatis中可以直接比较。

当时由于idea上xml的检测机制问题,字段的重复比对需要添加注释,不然报SQl dialect no configured的error,当然你也可以把IDEA设置中File -> setting 搜索inspections,再搜索sql,找到SQL dialect detection去掉勾就行。建议加注释,规范自己。

 

关于时间的保存基本分为4种

  • 对象字段是 String类型,数据库字段为 Date类型
  • 对象字段是 Date类型,数据库字段为 Date类型
  • 对象字段是 String类型,数据库字段为 varchar2类型
  • 对象字段是 Date类型,数据库字段为 varchar2类型

假设该时间字段名称为 create_date

刚开始我的做法是图方便,对象create_date字段设为 String,数据库create_date字段设为 varchar2

我们通常在前端使用时间插件传入值,这里我用的是jquery datepicker,注意把时间格式设置成 yy-mm-dd,这种格式在后台进行再次转换不会报错,不然 默认的‘mm/dd/yy’的格式会因为格式不匹配,用 simpleFormat.parse方法转换有问题;

这里由于前端传过来的是字符串,是需要后台进行转换成Date类型的

    @ResponseBody
    @PostMapping("/records")
    public Msg findRecords(@RequestParam(value="pn",defaultValue="1") Integer pn,
                           @RequestParam("startdate") String startdate, 
    @RequestParam("enddate") String enddate)  throws  Exception{
        System.out.println("startdate : " + startdate + "enddate :" + enddate);
        PageHelper.startPage(pn,5);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        List list = 
        recordService.getRecordByDate(sdf.parse(startdate),sdf.parse(enddate));
        PageInfo page = new PageInfo(list,5);
        return Msg.success().add("pageInfo", page);
    }

会报 java.text.ParseException: Unparseable date: "04/07/2019" 异常

所以需要前端传时间的参数值是 需要在 前端时间插件 中设置成 常用的时间格式

$(".choosedate").datepicker({dateFormat: "yy-mm-dd"});

将其转换成固定格式的Date类型对象字段就可以直接进行比较了,如果是固定格式的字符串怎么办呢?

  = TO_DATE( #{arg0,jdbcType=DATE}, 'yyyy-mm-dd hh24:mi:ss')]]>
  

用to_date的转换吧,但是如果本身传入的字段就是date类型的话就会报错了

会报 java.sql.SQLDataException: ORA-01861: 文字与格式字符串不匹配 异常

ORACLE官方文档

Propose

TO_DATE converts char of CHARVARCHAR2NCHAR, or NVARCHAR2 data type to a value of DATE data type.

它是将一个 字符串 类型的数据转换成 Date 类型,其他类型的转化会报不匹配的错误 ,平时看的比较多的是 to_date(sysdate,'yyyy-mm-dd') 就以为,to_date函数是将date类型的数据转换指定格式的date了,看来还是得系统的看看官方文档呀。

对了,还有 js给前端时间插件赋值格式的问题


    $(function(){
        var  nowday = new Date().format("yyyy-MM-dd");
        $("#startdate").val(nowday);
        $("#enddate").val(nowday);
    });

    Date.prototype.format =function(format)
    {
        var o = {
            "M+" : this.getMonth()+1, //month
            "d+" : this.getDate(), //day
            "h+" : this.getHours(), //hour
            "m+" : this.getMinutes(), //minute
            "s+" : this.getSeconds(), //second
            "q+" : Math.floor((this.getMonth()+3)/3), //quarter
            "S" : this.getMilliseconds() //millisecond
        }
        if(/(y+)/.test(format)){
            console.log(RegExp.$1.length);
            format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4- RegExp.$1.length));
        }
        for(var k in o){
            if(new RegExp("("+ k +")").test(format)){
                format = format.replace(RegExp.$1,RegExp.$1.length==1? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
            }
        }
        return format;
    }

 

Mybatis、Oracle、前端传值的时间字段遭遇的坑_第1张图片

你可能感兴趣的:(SSM)