spring框架配置数据源

本文详细介绍了如何在Spring Boot项目中手动创建Druid数据源,包括使用Maven依赖和直接配置属性,以及通过配置文件和Spring Expression Language的应用。重点讨论了不同配置方式的优缺点和遇到的问题,如版本兼容性和系统环境影响。

回顾1
手动创建数据源
在pom.xml中

	<dependency>
          <!--数据库驱动jar包-->
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.6</version>
      </dependency>
      <dependency>
          <!--第三方数据源的规范和实现类-->
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.1.9</version>
      </dependency>

测试

public class DruidDataSourceTest {
    @Test
    public void testDruidDataSource() throws Exception{
        //测试手动创建德鲁伊数据源
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
        druidDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/test");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
        DruidPooledConnection connection = druidDataSource.getConnection();
        System.out.println(connection);
        connection.close();

        //在这里补充一个知识点: 当maven的mysql驱动jar版本是8时, 数据源信息还要有时区信息, 如果是版本5, 就不用
    }
}
1215, 2021 11:48:20 上午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
com.mysql.jdbc.JDBC4Connection@7ba18f1b

回顾2
抽取数据库的配置文件(注意 : 为什么抽取成properties而不是xml, 因为xml解析麻烦了点)
在resources下创建jdbc.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///test
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000

测试

public class DruidDataSourceTest {
    @Test
    public void testDruidDataSource() throws Exception{
        //测试手动创建德鲁伊数据源, 使用配置文件
        ResourceBundle resourceBundle = ResourceBundle.getBundle("jdbc"); //这里的这个方法的参数是配置文件的名称, 简称基名, 加载的是根路径下也即是resources下的配置文件
        //获取配置文件信息
        String driver = resourceBundle.getString("driverClassName");
        String url = resourceBundle.getString("url");
        String username = resourceBundle.getString("username");
        String password = resourceBundle.getString("password");
        String initialSize = resourceBundle.getString("initialSize");
        String maxActive = resourceBundle.getString("maxActive");
        String maxWait = resourceBundle.getString("maxWait");
        //创建数据源对象, 并设置信息
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        druidDataSource.setInitialSize(Integer.parseInt(initialSize));
        druidDataSource.setMaxActive(Integer.parseInt(maxActive));
        druidDataSource.setMaxWait(Integer.parseInt(maxWait));
        DruidPooledConnection connection = druidDataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }


}
1215, 2021 12:12:38 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
com.mysql.jdbc.JDBC4Connection@13c10b87

使用spring框架来配置数据源

(1) 没有抽取配置文件的方式
	<!--配置数据源, 使用的是第三方的规范和接口-->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql:///test"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
public class DruidDataSourceTest {
    @Test
    public void testDruidDataSource() throws Exception{
        //使用spring容器来获取数据源对象
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        DruidDataSource druidDataSource = app.getBean(DruidDataSource.class);
        DruidPooledConnection connection = druidDataSource.getConnection();
        System.out.println(connection);
        connection.close();

    }
}
1215, 2021 12:32:36 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3796751b: startup date [Wed Dec 15 12:32:36 CST 2021]; root of context hierarchy
1215, 2021 12:32:36 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
1215, 2021 12:32:37 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
com.mysql.jdbc.JDBC4Connection@dc7df28

小结 : 当我们对配置的bean进行资源注入时, 一般是使用的set方法, 也就是使用财产标签, name属性的值就是对应具体的类中的set方法名, 最好知道set方法的样子, 不会弄错, 不同的类的set方法有可能不一样.

(2) 抽取配置文件的方式

applicationContext.xml如果想加载jdbc.properties配置文件获取连接信息
首先必须得context命名空间和约束路径
命名空间

xmlns:context="http://www.springframework.org/schema/context"

约束路径

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

合起来就是

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation=
               "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
>

记不住也没事, 其实复制修改就可以

有了context命名空间之后
在applicationContext.xml中加载properties文件


    <!--加载properties文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

现在就加载进去了
使用spring表达式就可以拿到properties中的信息
${key}

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///test
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
	<!--配置数据源-->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${driverClassName}"></property>
        <property name="url" value="${url}"></property>
        <property name="username" value="${username}"></property>
        <property name="password" value="${password}"></property>
    </bean>

大家是不是以为这样就好了
其实有一个bug
这样去测试是有异常的
这里
${username}的读取值为本应为jdbc.properties文件对应的是username的值但实际是系统用户名Administrator(windows系统)

将properties文件的key改变一下就可以了

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///test
jdbc.username=root
jdbc.password=root
public class DruidDataSourceTest {
    @Test
    public void testDruidDataSource() throws Exception{
        //使用spring容器来获取数据源对象
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        //DruidDataSource druidDataSource = app.getBean(DruidDataSource.class);
        DruidDataSource druidDataSource = (DruidDataSource) app.getBean("druidDataSource");
        DruidPooledConnection connection = druidDataSource.getConnection();
        System.out.println(connection);
        connection.close();

    }
}
1215, 2021 2:59:28 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3796751b: startup date [Wed Dec 15 14:59:28 CST 2021]; root of context hierarchy
1215, 2021 2:59:28 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
1215, 2021 2:59:28 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
com.mysql.jdbc.JDBC4Connection@24959ca4

小结 : 也就是说, 以后jdbc的配置文件的键名, 最好写成这样的形式

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值