在 web 开发中,数据源是经常用到的东西,我们的数据最终需要存储到数据库中,而在使用数据库的时候,通常不会直接使用 JDBC 开发,而是引入数据库连接池的概念来优化,因此就会使用到一些第三方的软件,如 Druid、C3P0 等等。
项目使用的 maven 构建,第三方的坐标如下,可到 maven 仓库中寻找自己需要的版本https://mvnrepository.com/
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.2.20version>
dependency>
<dependency>
<groupId>c3p0groupId>
<artifactId>c3p0artifactId>
<version>0.9.1.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.28version>
dependency>
说明:要想正常的使用数据库,还需要导入 MySQL 的驱动 jar 包,但是会存在一个现象:
1)Druid 没有导入 MySQL 驱动 jar 包时也能正常的打印数据库连接池的信息;
2)C3P0 没有导入 MySQL 驱动 jar 包的时候不能正常建立数据库连接池;
3)原因是:Druid 在建立数据库连接池的时候没有加载驱动,而 C3P0 加载了驱动,但是后续想要正常的使用,都需要导入 MySQL 的驱动 jar 包。
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="http://localhost:3306/spring_db"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
bean>
<bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="http://localhost:3306/spring_db"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
<property name="maxPoolSize" value="100"/>
bean>
在 1.1 中,直接在标签中写死参数的名称,是不利于维护的,比较好的做法是,将这些参数提取出来,放在配置文件中,然后在标签中引用配置文件的内容,当需要更改这些信息的时候,我们只需要修改配置文件中的内容,就可以达到所有标签内容同步修改的效果。
(1)bean 对象配置文件
<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:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
bean>
<bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxPoolSize" value="100"/>
bean>
beans>
(2)参数信息文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_db
jdbc.username=root
jdbc.password=root
Spring 的比较重要的理念就是将 bean 对象交给容器管理;因此管理和获取 bean 是一个十分重要的内容。
两种方式,都是基于配置文件的,不同的是两个方法使用的参数不同
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext ctx1 = new FileSystemXmlApplicationContext("C:\\code\\workspace_java\\spring-base\\spring-datasource\\src\\main\\resources\\applicationContext.xml");
1)ClassPathXmlApplicationContext:类路径,相对路径,常用,推荐使用;
2)FileSystemXmlApplicationContext:从当前系统文件目录中获取,绝对路径,不推荐使用,可移植性差;
常用的有三种方式,如下
1)参数是 String 字符串:根据 xml 配置的 id 属性来辨别,但是得到的类型的 Object,需要手动强转;
2)参数是字节码文件:直接传入相应的字节码文件,按类型获取;但是需要注意如果容器中该种类型的 bean 不唯一,则会报错;
3)参数是字符串和字节码文件:相比于第一种,不用强制转换,但是参数会多一个。