spring boot 使用 com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的區別

今天集成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"));
}
相關文章
相關標籤/搜索