今天集成spring boot 2.1.1構建web應用而且集成jdbc,發現默認用的8.0.13,java
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency>
jdbc配置以下:mysql
spring.datasource.xss.name=db-xss spring.datasource.xss.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.xss.driver-class-name=com.mysql.jdbc.Driver spring.datasource.xss.url=jdbc:mysql://127.0.0.1:3306/xss?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull spring.datasource.xss.username=root spring.datasource.xss.password=123456
運行項目報錯:web
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
按照提示修改:spring
spring.datasource.xss.driver-class-name=com.mysql.cj.jdbc.Driver
總結:sql
com.mysql.jdbc.Driver 是 mysql-connector-java 5中的, com.mysql.cj.jdbc.Driver 是 mysql-connector-java 版本6之後的
1、jdbc裏不配置時區信息,代碼裏設置日期,配置以下,發現時間有問題數據庫
一、代碼裏jdbc配置 spring.datasource.xss.name=db-xss spring.datasource.xss.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.xss.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.xss.url=jdbc:mysql://127.0.0.1:3306/xss?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull spring.datasource.xss.username=root spring.datasource.xss.password=123456 二、保存 @RequestMapping(value = "/save") public Address save() { Address address = new Address(); address.setUserId(16L); address.setAddress("address.16"); // 設置日期 address.setCreateTime(new Date()); addressDao.save(address); return address; } 三、mybaites的寫法 <insert id="save" parameterType="com.moon.xss.module.Address" keyProperty="id" useGeneratedKeys="true"> INSERT INTO address ( user_id, address, create_time ) VALUES ( #{userId}, #{address}, #{createTime} ) </insert>
保存到數據庫的數據以下:(當前電腦時間是14:20,保存到數據庫的時間是00:20)json
經過接口查詢,發現用fastjson序列化時返回的是對的:mybatis
可是用jackson,轉後的數據不對:app
2、jdbc裏不配置時區信息,代碼裏不設置日期,配置以下,發現時間有問題xss
#一、jdbc配置 spring.datasource.xss.name=db-xss spring.datasource.xss.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.xss.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.xss.url=jdbc:mysql://127.0.0.1:3306/xss?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull spring.datasource.xss.username=root spring.datasource.xss.password=123456 #二、save到數據庫 @RequestMapping(value = "/save") public Address save() { Address address = new Address(); address.setUserId(16L); address.setAddress("address.16"); // 這裏不設置日期,在xml裏設置 //address.setCreateTime(new Date()); addressDao.save(address); return address; } #三、mybatis <insert id="save" parameterType="com.moon.xss.module.Address" keyProperty="id" useGeneratedKeys="true"> INSERT INTO address ( user_id, address, create_time ) VALUES ( #{userId}, #{address}, now() ) </insert>
數據庫看結果:
fastjson轉後的結果以下,不對
用jackson轉後的結果以下,不對:
3、jdbc裏配置時區信息,java文件裏設置日期
#一、增長時區配置serverTimezone=Asia/Shanghai spring.datasource.xss.name=db-xss spring.datasource.xss.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.xss.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.xss.url=jdbc:mysql://127.0.0.1:3306/xss?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull spring.datasource.xss.username=root spring.datasource.xss.password=123456 @RequestMapping(value = "/save") public Address save() { Address address = new Address(); address.setUserId(16L); address.setAddress("address.16"); address.setCreateTime(new Date()); addressDao.save(address); return address; } <insert id="save" parameterType="com.moon.xss.module.Address" keyProperty="id" useGeneratedKeys="true"> INSERT INTO address ( user_id, address, create_time ) VALUES ( #{userId}, #{address}, #{createTime} ) </insert>
fastjson轉後的結果以下,正確
用jackson轉後的結果以下,不正確:
4、jdbc裏配置時區信息,java文件裏不設置日期
#設定時區 spring.datasource.xss.name=db-xss spring.datasource.xss.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.xss.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.xss.url=jdbc:mysql://127.0.0.1:3306/xss?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull spring.datasource.xss.username=root spring.datasource.xss.password=123456 #接口 @RequestMapping(value = "/save") public Address save() { Address address = new Address(); address.setUserId(16L); address.setAddress("address.16"); // 不設置日期 //address.setCreateTime(new Date()); addressDao.save(address); return address; } #mybatis <insert id="save" parameterType="com.moon.xss.module.Address" keyProperty="id" useGeneratedKeys="true"> INSERT INTO address ( user_id, address, create_time ) VALUES ( #{userId}, #{address}, now() ) </insert>
數據庫保存以下
fastjson轉後的結果以下,正確
用jackson轉後的結果以下,不正確:
jackson轉後時間不對緣由分析:
import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @Data public class Address { private Long id; private Long userId; private String address; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; } /** * Value that indicates that default {@link java.util.TimeZone} * (from deserialization or serialization context) should be used: * annotation does not define value to use. *<p> * NOTE: default here does NOT mean JVM defaults but Jackson databindings * default, usually UTC, but may be changed on <code>ObjectMapper</code>. */ public final static String DEFAULT_TIMEZONE = "##default";
JsonFormat裏面默認時區是UTC,因此轉化後時間不對
2種解決方式:
一、在每一個要轉的字段上面增長註解屬性指定時區
import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @Data public class Address { private Long id; private Long userId; private String address; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private Date createTime; }
二、添加bean,增長一個屬性,指定時區
@Bean public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getTimeZone("GMT+8")); }