Spring Boot 2.x使用篇(二)—— 访问数据库

1、搭建演示环境

1.1 创建数据库与数据表

  在MySQL数据库中创建名为spring_boot_chapter5的数据库,在该数据库中创建名为t_user的数据表,建表sql语句如下:

CREATE TABLE `t_user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(60) NOT NULL DEFAULT '',
  `sex` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1',
  `note` varchar(256) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.2 创建相应的POJO

  创建好数据库与数据表之后,需要在项目中创建相应的POJO用来与表对应起来。在com.ccff.springboot.demo.chapter5.pojo包下创建名为User的POJO类,具体代码如下:

package com.ccff.springboot.demo.chapter5.pojo;

import com.ccff.springboot.demo.chapter5.enumration.SexEnum;

/**
 * Created by wangzhefeng01 on 2019/8/7.
 */
public class User {
   
    private Long id = null;
    private String userName = null;
    private SexEnum sex = null;		//性别为枚举类型
    private String note = null;

    public Long getId() {
   
        return id;
    }

    public void setId(Long id) {
   
        this.id = id;
    }

    public String getNote() {
   
        return note;
    }

    public void setNote(String note) {
   
        this.note = note;
    }

    public SexEnum getSex() {
   
        return sex;
    }

    public void setSex(SexEnum sex) {
   
        this.sex = sex;
    }

    public String getUserName() {
   
        return userName;
    }

    public void setUserName(String userName) {
   
        this.userName = userName;
    }
}

  由上面的代码可知,其中性别类型为一个枚举类型。在com.ccff.springboot.demo.chapter5.enumration包下创建名为SexEnum的性别枚举类型,具体代码如下:

package com.ccff.springboot.demo.chapter5.enumration;

/**
 * Created by wangzhefeng01 on 2019/8/7.
 */
public enum SexEnum {
   
    MALE(1,"男"),
    FEMALE(2,"女");

    private Integer id;
    private String value;

    SexEnum(Integer id, String value) {
   
        this.id = id;
        this.value = value;
    }

    public static SexEnum getSexEnumById(Integer id){
   
        for (SexEnum sex : SexEnum.values()) {
   
            if (sex.getId() == id){
   
                return sex;
            }
        }
        return null;
    }

    public Integer getId() {
   
        return id;
    }

    public void setId(Integer id) {
   
        this.id = id;
    }

    public String getValue() {
   
        return value;
    }

    public void setValue(String value) {
   
        this.value = value;
    }
}

2、配置数据源

2.1 默认数据源

  如果要使用Spring Boot访问数据库,无论采用JPA或MyBatis的方式,都需要先完成数据源的配置。

  在Spring Boot中,已经自动默认数据源的配置,但前提是需要在项目中依赖于Spring Boot的spring-boot-starter-data-jpa。在依赖后,它就会默认配置数据源。这些默认的数据源主要是内存数据库,如h2、hqldb和Derby等内存数据,但更多的时候需要配置为我们自己想要的数据源去操作商用数据库,如MySQL,Oracle等。

2.2 配置Spring Boot绑定的Tomcat数据源

  下面以MySQL作为自定义数据源。

  首先,在pom文件中引入对spring-boot-starter-data-jpa和MySQL的依赖,具体依赖如下所示:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

  在引入依赖后,显然还不足以连接我们的数据源,还需要配置数据库的相关信息才能连接到数据库,这里可以配置application.properties配置文件以得到配置数据源的效果。在默认情况下,Spring Boot会使用其绑定的Tomcat的数据源,我们可以进行如下配置:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/spring_boot_chapter5
spring.datasource.username=root
spring.datasource.password=123456

# =========================== 配置Spring Boot绑定的Tomcat数据源 ===========================
# 最大等待连接中的数量,设0为没有限制
spring.datasource.tomcat.max-idle=10
# 最大连接活动数
spring.datasource.tomcat.max-active=50
# 最大等待毫秒数,单位为ms,超过时间会出错误信息
spring.datasource.tomcat.max-wait=10000
# 数据库连接池初始化连接数
spring.datasource.tomcat.initial-size=5
# =========================== 配置Spring Boot绑定的Tomcat数据源 ===========================

  这里需要说明的是,在配置的第一行是对数据库连接的驱动类进行了配置。若将其注释掉还是可以连接数据源的,这是因为Spring Boot会尽可能地去判断数据源是什么类型的,然后根据其默认的情况去匹配驱动类。在它不能匹配的情况下,你可以明确地配置它,这样就不会使用默认的驱动类了。

2.3 配置第三方数据源

  这里我们以DBCP第三方数据源为例。

  首先,在pom文件中加入DBCP的数据源Maven依赖。

<!--引入第三方数据源DBCP依赖-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
</dependency>

  接着,修改application.properties配置文件,在其中配置DBCP2数据源,具体配置如下:

#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/spring_boot_chapter5
spring.datasource.username=root
spring.datasource.password=123456

# =========================== 配置第三方DBCP2数据源 ===========================
# 指定数据库连接池类型
spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
# 最大等待连接中的数量,设0为没有限制
spring.datasource.dbcp2.max-idle=10
# 最大连接活动数
spring.datasource.dbcp2.max-total=50
# 最大等待毫秒数,单位为ms,超过时间会出错误信息
spring.datasource.dbcp2.max-wait-millis=10000
# 数据库连接池初始化连接数
spring.datasource.dbcp2.initial-size=5
# =========================== 配置第三方DBCP2数据源 ===========================

  在上面的配置中,首先通过spring.datasource.type属性指定了数据库连接池的类型,然后再使用spring.datasource.dbcp2.*去配置数据库连接池的属性。这样Spring Boot就会根据这些属性去配置对应的数据库连接池,从而知道使用的是DBCP数据源。
  为了验证是否正确配置了DBCP数据源,在com.ccff.springboot.demo.chapter5.db包下创建名为DataSourceShow的Bean,并让其实现ApplicationContextAware接口的setApplicationContext()方法。依照Spring的生命周期,在其初始化的时候该方法就会被调用,从而获取Spring IoC容器的上下文(applicationContext)。这时通过getBean()方法就可以获取数据库连接池,然后打印出数据库连接池的全限定名,这样就知道它使用的是哪种数据库连接池了。具体代码如下:

package com.ccff.springboot.demo.chapter5.db;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;

/**
 * Created by wangzhefeng01 on 2019/8/7.
 */
@Component
public class DataSourceShow implements ApplicationContextAware {
   
    ApplicationContext applicationContext = null;

    //Spring容器会自动调用该方法,注入Spring IoC容器
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
   
        this.applicationContext = applicationContext;
        DataSource dataSource = applicationContext.getBean(DataSource.class);
        System.out.println("================== Show DataSource start ==================");
        System.out.println(dataSource.getClass().getName());
        System.out.println("================== Show DataSource end ==================");
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值