mybatis-sqlite日期類型對應關系


1.問題

sqlite數據庫

user表,create_time字段,類型DATETIME,設置默認值datetime('now')

mybatis,User實體,createTime類型為java.util.Date

插入一條數據

    @Test
    @Transactional
    @Rollback(false)
    public void insert(){
        User user = new User();
        user.setId("3");
        user.setUsername("user1");
        user.setName("王五");
        user.setAge(18);
        userService.insert(user);
    }

查詢數據

    @Test
    public void get(){
        try{
            List<User> list = userService.get();
            for(User user : list){
                System.err.println(user);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

拋出異常

Caused by: java.text.ParseException: Unparseable date: "2019-12-12 12:08:26" does not match (\p{Nd}++)\Q-\E(\p{Nd}++)\Q-\E(\p{Nd}++)\Q \E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q.\E(\p{Nd}++)
    at org.sqlite.date.FastDateParser.parse(FastDateParser.java:299)
    at org.sqlite.date.FastDateFormat.parse(FastDateFormat.java:490)
    at org.sqlite.jdbc3.JDBC3ResultSet.getTimestamp(JDBC3ResultSet.java:540)
    ... 77 more

2.解決問題

方法1(推薦):將url字符串修改如下

url: jdbc:sqlite:dataserver.pak?date_string_format=yyyy-MM-dd HH:mm:ss

 

方法2:將create_time字段默認值改為strftime('%s','now'),類型改為bigint,java類型改為Long,需要轉Date再做轉換

strftime('%s','now'),從1970年1月1日到現在的秒數

方法3:或者strftime('%Y-%m-%d %H:%M:%f','now')

3.sqlite獲取當前時間

3.1獲取當前時間:

select datetime('now')

結果:2017-04-12 09:47:12

3.2如果需要精確到毫秒,使用:

select strftime('%Y-%m-%d %H:%M:%f','now')

結果:2017-04-12 17:48:35.890

3.3獲取從1970年1月1日到現在的秒數(Unix時間戳):

select strftime('%s','now') 

結果:1491985972

4.原理

sqlite將字符串轉換為Date使用FastDateFormat轉換

等同於下面代碼

    @Test
    public void test() throws ParseException{
        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS");
        Date d = dateFormat.parse("2019-12-12 19:26:55");
        System.err.println(d);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM