今天集成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")); }