说明:以管理DataSource连接池对象为例。

管理DataSource连接池对象

管理Druid连接池

数据库准备

1
2
3
4
5
6
7
8
9
create database if not exists spring_db character set utf8;
use spring_db;
create table if not exists tbl_account(
id int primary key auto_increment,
name varchar(20),
money double
);
insert into tbl_account values(null,'Tom',1000);
insert into tbl_account values(null,'Jerry',1000);

添加Druid连接池依赖

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>

注意:除了添加以上两个依赖之外,还需添加spring-context依赖。

配置DruidDataSource连接池Bean对象

1
2
3
4
5
6
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spring_db"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>

在测试类中从IOC容器中获取连接池对象并打印

1
2
3
4
5
6
7
public class App {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource dataSource = (DataSource) ctx.getBean("dataSource");
System.out.println(dataSource);
}
}

管理c3p0连接池

添加c3p0连接池依赖

1
2
3
4
5
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>

配置c3p0连接池Bean对象

1
2
3
4
5
6
7
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring_db"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
<property name="maxPoolSize" value="1000"/>
</bean>

注意:同一个Spring容器中不能有两个id=”dataSource”的连接池。

在测试类中从IOC容器中获取连接池对象并打印

1
2
3
4
5
6
7
public class App {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource dataSource = (DataSource) ctx.getBean("dataSource");
System.out.println(dataSource);
}
}

加载properties属性文件

目的:将数据库的连接参数抽取到一个单独的文件中,与Spring配置文件解耦。

基本用法

编写jdbc.properties属性文件

1
2
3
4
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/spring_db
jdbc.username=root
jdbc.password=root

在applicationContext.xml中开启context命名空间,加载jdbc.properties属性文件

content-731

content-732

1
<context:property-placeholder location="jdbc.properties"/>

在配置连接池Bean的地方使用EL表达式获取jdbc.properties属性文件中的值

1
2
3
4
5
6
<bean 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>

配置完成之后,运行之前的获取Druid连接池代码,可以获取到连接池对象就表示配置成功。

配置不加载系统属性

问题

  • 如果属性文件中配置的不是jdbc.username,而是username=root666,那么使用${username}获取到的不是root666,而是计算机的名称。

原因

  • 系统属性的优先级比属性文件中的高,替换了username=root666。

解决

  • 解决1:换一个名称,例如由username改为jdbc.username。

  • 解决2:使用system-properties-mode="NEVER"属性表示不使用系统属性。

1
<context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>

加载properties文件写法

  • 不加载系统属性:
1
<context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>
  • 加载多个properties文件:
1
<context:property-placeholder location="jdbc.properties,msg.properties"/>
  • 加载所有properties文件:
1
<context:property-placeholder location="*.properties"/>
  • 加载properties文件标准格式:
1
<context:property-placeholder location="classpath:*.properties"/>
  • 加载properties文件标准格式:
1
<context:property-placeholder location="classpath*:*.properties"/>