spring boot 使用 com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别

今天集成spring boot 2.1.1构建web应用并且集成jdbc,发现默认用的8.0.13,

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.13</version>
</dependency>

jdbc配置如下:

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

运行项目报错:

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.datasource.xss.driver-class-name=com.mysql.cj.jdbc.Driver

 

总结:

com.mysql.jdbc.Driver 是 mysql-connector-java 5中的,
com.mysql.cj.jdbc.Driver 是 mysql-connector-java 版本6以后的

 

一、jdbc里不配置时区信息,代码里设置日期,配置如下,发现时间有问题

1、代码里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

2、保存
@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;
}

3、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)

8cc6f91c259803ec6e62dc5a28e2f787adf.jpg

通过接口查询,发现用fastjson序列化时返回的是对的:

90deab7aac4815774d87519ccbb880db1f9.jpg

但是用jackson,转后的数据不对:

b68d02ba79c27bba9ee32cc9ecb630c0a0b.jpg

二、jdbc里不配置时区信息,代码里不设置日期,配置如下,发现时间有问题

#1、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

#2、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;
}

#3、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>

 

数据库看结果:

429fdce98719b668c9afa621f65f6500956.jpg

 

fastjson转后的结果如下,不对

d0eb536424d5e79d6590d1961908fcd6a02.jpg

用jackson转后的结果如下,不对:

abeee22c114a7e7341528df3342269faaa5.jpg

 

三、jdbc里配置时区信息,java文件里设置日期

#1、增加时区配置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>

 

d98c0465ba5effafb53586c2a46765956a7.jpg

fastjson转后的结果如下,正确

b6dc9b60b9a6d69f10e1983f5756e4f2d67.jpg

用jackson转后的结果如下,不正确:

9007be5b55708a0b89bf6cf7e476588ac22.jpg

 

四、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>


 

数据库保存如下

99908ed13dbe884b5ff7cf8185b9b501cf5.jpg

 

fastjson转后的结果如下,正确

d335987823afd445ffe4cd93419ddd25f4f.jpg

用jackson转后的结果如下,不正确:

8178fab92daf86b914efc5810577514aba2.jpg

 

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种解决方式:

1、在每个要转的字段上面增加注解属性指定时区

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;
}

2、添加bean,增加一个属性,指定时区

@Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
    return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getTimeZone("GMT+8"));
}

 

转载于:https://my.oschina.net/u/3777515/blog/3004393

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值