1. 程式人生 > 實用技巧 >java日期型別物件通過mybatis向資料庫中的存取

java日期型別物件通過mybatis向資料庫中的存取

java日期型別物件通過mybatis向資料庫中的存取

一、資料庫中的日期資料型別

  資料庫中的日期資料型別有四種:date、datetime、timestimp、time。date型別只儲存年月日,不儲存時分秒,datetime和timestimp保 存年月日時分秒,time只儲存時分秒。資料庫欄位值進行比較時,date只比較年月日,datetime和timestimp比較年月日時分秒,time只比較 時分秒。
  datetime、timestimp在資料庫中的儲存結構不一樣,timestimp更節省空間,但對於java物件的存取都是一樣的。

二、java中的四種日期型別:java.util.Date、java.sql.date、timestimp、time。

  (1)java.sql.date、timestimp、time都在java.sql包下,都是java.util.date類的子類。java.sql包下的date顯示年月日, timestimp顯示年月日時分秒,time顯示時分秒,java.sql.date顯示年月日時分秒。
  (2)這四種日期型別內部儲存的都是時間戳。雖然java.sql.date、time值顯示年月日或時分秒,但其內部儲存的都是完整的時間 戳,因此當把java.sql.date、time轉型為java.uitl.Date型別時,還是能顯示完整的年月日時分秒。
  (3)直接System.out.println(java.sql.date)顯示年月日,System.out.println(java.sql.time)顯示時分秒。但是通過
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String str = simpleDateFormat.format(objDate)
  無論objDate是四種類型中的任何型別,返回的str字串都是準確的完整的年月日時分秒。因simpleDateFormat.format()方法的 引數是型別時java.util.Date型別,java.sql.date、timestimp、time會自動轉為java.util.Date型別。

三、資料庫中的四種日期資料型別通過mybatis逆向工程生成的實體類對應屬性的型別都是java.util.Date(不是java.sql.Date)型別。

-----java.util.Date型別的java資料儲存-----

  (1)java.util.Date型別的java資料(如2019-05-08 14:56:23)向資料庫date型別欄位存值時,會忽略掉Date java物件中的時分秒 ,只儲存年月日(2019-05-08),當再從資料庫中讀取date型別欄位值賦值為java的Date物件時,Date物件的值為2019-05-08 00:00:00,時 分秒變成00:00:00,儲存到資料庫之前的原有的時分秒(14:56:23)丟失。
  (2)java.util.Date型別的java資料(如2019-05-08 14:56:23)向資料庫datetime、timestimp型別欄位存值時,其年月日時分秒 都會儲存,再從資料庫中取值賦給Date物件,還是2019-05-08 14:56:23
  (3)java.util.Date型別的java資料(如2019-05-08 14:56:23)向資料庫time型別欄位存值時,會忽略掉年月日,只儲存時分秒 ,當再從資料庫中讀取time型別欄位值賦值為java的Date物件時,Date物件的值為1970-01-01 14:56:23,儲存到資料庫之前的原有的年月日 資訊(2019-05-08)丟失。   

-----java.sql.Date型別的java資料儲存-----

  (1)java.sql.Date型別的java資料向資料庫date型別欄位存值時,因java.sql.Date只會顯示年月日不顯示時分秒,因此只儲存年月 日(如2019-05-08),當再從資料庫中讀取date型別欄位值賦值為java的Date物件時,Date物件的值為2019-05-08。
  (2)java.sql.Date型別的java資料向資料庫datetime、timestimp型別欄位存值時,因java.sql.Date只會顯示年月日不顯示時分 秒(即使物件內部儲存的是時間戳,有時分秒資訊),儲存到資料庫datetime、timestimp型別欄位的值為2019-05-08 00:00:00,再從數 據庫中取值賦給Date(無論是java.util.Date還是java.sql.Date)物件,值為2019-05-08 00:00:00
  (3)java.sql.Date型別的java資料向資料庫time型別欄位存值時,因java.sql.Date只會顯示年月日不顯示時分秒(即使物件內部 儲存的是時間戳,有時分秒資訊),因此會報錯,儲存失敗。

-----java.sql.Time型別的java資料儲存-----

  (1)因time型別只顯示時分秒如:12:12:12,因此向資料庫time欄位儲存時,只儲存時分秒,當在從資料庫取值賦值給Time物件, Time物件如果轉為java.util.Date物件,其年月日資訊丟失,顯示為1970-01-01 12:12:12;
  (2)因time型別只顯示時分秒,當向資料庫date、datetime、timestimp欄位存值時會報錯。

  注:java.sql.Timestimp型別的java資料儲存和java.util.Date的儲存情況一樣

  當從資料庫中讀取資料存入java物件時。java.util.Date儲存讀取的年月日時分秒,java.sql.Date只儲存讀取的年月日,即使讀取的資料庫 欄位是datetime欄位,有時分秒,如果用java.sql.Date接收讀取的資料,還是值存年月日,即使java.sql.Date轉成java.util.Date物件, 時分秒的值還是00:00:00。Time物件只儲存資料庫從讀取的時分秒值,年月日為1970-01-01

四、mybatis的mapper配置檔案中的jdbctype

  jdbctype相當於是一個數據攔截器,當向資料庫存取時,jdbctype在入庫之前起作用,當從獲取庫取資料時,jdbctype在從資料庫 取出數值時候和向java物件賦值之前起攔截作用。

  

 1 <resultMap id="BaseResultMap" type="test.entity.Datetest" >
 2     <id column="id" property="id" jdbcType="INTEGER" />
 3     <result column="datestimp" property="datestimp" jdbcType="TIMESTAMP" />
 4     <result column="datetest" property="datetest" jdbcType="DATE" />
 5     <result column="time" property="time" jdbcType="TIME" />
 6   </resultMap>
 7 
 8 <insert id="insert" parameterType="test.entity.Datetest" >
 9     insert into datetest (id, datestimp, datetest, time)
10         values (#{id,jdbcType=INTEGER}, #{datestimp,jdbcType=TIMESTAMP}, #{datetest,jdbcType=DATE}, #{time,jdbcType=TIME})
11   </insert>

  mybatis逆向工程生產的mapper檔案的jdbctype的設定為:
    (1)date型別欄位對應的jdbctype型別為jdbcType="DATE"。
    (2)datetime和timestimp型別欄位對應的為jdbcType="TIMESTAMP"
    (3)time欄位對應個為jdbcType="TIME"
  注意:只有當java物件為java.util.Date型別時,jdbcType對資料的存取才起作用,對其他的java時間物件,jdbcType沒有作用。  

  jdbcType型別對java.util.Date日期資料向資料庫存取的影響:
  (1)當jdbcType="DATE",當向資料庫存取資料時會過濾掉時分秒。無論資料庫中的欄位是date、datetime、timestimp中的哪一種,最終儲存的都只有年月日,如果欄位型別為datetime、 timestimp,時分秒資訊為00:00:00。如果java物件型別為time或者資料庫欄位型別為time型別,會報錯。當從資料庫中取資料是,無論資料欄位型別為date、datetime、timestimp、time哪一種,最終取到的只有年月日,時分秒 為00:00:00。從time欄位取值存到java的date物件顯示為1970-01-01 00:00:00。
  (2)當jdbcType="TIMESTAMP"時,jdbcType不過濾任何內容,對存取沒影響。
  (3)當jdbcType="TIME"時,當向資料庫存取資料時會過濾掉年月日。向資料庫中存資料,如果資料庫欄位為date、datetime、timestimp會報錯。從資料庫取資料存入java的date物件時,年月日都會變成1970-01-01
  可以不設定jdbcType時,不設定jdbctype相當於少了一層資料攔截。