1 Spring的JDBC模板的介绍
- Spring是EE开发的一站式的框架,有EE开发的每层的解决方案。Spring对持久层也提供了解决方案:ORM模块和JDBC的模板。
- Spring提供了很多的模板用于简化开发:
2 Spring的JDBC模板入门
2.1 创建项目,引入jar包
- spring-jdbc-4.2.4.RELEASE.jar:spring和jdbc整合的jar包
- spring-tx-4.2.4.RELEASE.jar:spring的事务包
- mysql-connector-java-5.1.7-bin.jar:数据库连接池jar包
- spring的基本包(https://blog.csdn.net/W2612888/article/details/85217984)
2.2 创建数据库和表
create database springjdbcdb;
use springjdbcdb;
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
2.3 传统的JDBCTemplate开发简单示例
package com.itykd.spring.jdbc;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class JDBCDemo {
@Test
public void demo() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///springjdbcdb");
dataSource.setUsername("root");
dataSource.setPassword("NULIFENDOU520");
//创建JDBC模板
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("insert into account values(null,?,?)","ykd",10000d);
}
}
- 由以上可知:JDBCTemplate与dataSource之间有依赖关系:JDBCTemplate依赖于dataSource,因此下面介绍另外一种:利用Spring创建
2.4 利用Spring创建连接池和模板开发
- 在配置文件中配置Spring默认的连接池和jdbc模板
<!-- 配置Spring内置的数据库连接池 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///springjdbcdb"/>
<property name="username" value="root"/>
<property name="password" value="NULIFENDOU520"/>
</bean>
<!-- 配置Spring的JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
- 测试类(用到了Spring整合Junit和注解,因此要把对应的包引进去)
package com.itykd.spring.jdbc;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JDBCDemo {
@Resource(name="jdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Test
public void demo() {
jdbcTemplate.update("insert into account values(null,?,?)","kobe",1000d);
}
上述使用的是Spring默认的连接池,也可以换成其他开源你的连接池,比如C3P0和DBCP,具体如下:
3 其他开源连接池的使用
3.1 DBCP的使用
- 引入jar包
com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
com.springsource.org.apache.commons.pool-1.5.3.jar
- 配置DBCP连接池
<!-- 配置DBCP数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///springjdbcdb"/>
<property name="username" value="root"/>
<property name="password" value="NULIFENDOU520"/>
</bean>
<!-- 配置Spring的JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
3.2 C3P0的使用
- 引入jar包
com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar
- 配置C3P0连接池
<!-- 配置C3P0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcurl" value="jdbc:mysql:///springjdbcdb"/>
<property name="user" value="root"/>
<property name="password" value="NULIFENDOU520"/>
</bean>
<!-- 配置Spring的JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
4 在Spring的配置文件中引入属性文件
通常数据库的文件不会直接配置到Spring中,而是会单独管理,这样也易于维护
4.1 定义一个属性文件(jdbc.properties)
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///springjdbcdb
jdbc.username=root
jdbc.password=NULIFENDOU520
4.2 在Spring的配置文件中引入属性文件
-
方式一(通过一个bean标签引入,用的比较少)
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
- 方式二(用context标签引入)
<!-- 通过context标签引入 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
4.3 修改连接池的配置(以C3P0为例)
修改<property>标签中的value属性
<!-- 配置C3P0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcurl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
5 使用JDBC模板进行CRUD操作
5.1 保存
public void insertDemo() {
jdbcTemplate.update("insert into account values(null,?,?)","kobe",1000d);
}
5.2 修改
public void updateDemo() {
jdbcTemplate.update("update account set name=?,money=? where id=?","kobe",5000d,2);
}
5.3 删除
public void deleteDemo() {
jdbcTemplate.update("delete from account where id=?",2);
}
5.4 查询
5.4.1 查询某个属性
public void findDemo() {
//查询id=2的名字
String name = jdbcTemplate.queryForObject("select name from account where id=?", String.class,2);
//统计查询
Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
}
5.4.2 查询返回对象或集合
- 提供一个Account类
package com.itykd.domain;
public class Account {
private Integer id;
private String name;
private Double money;
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setMoney(Double money) {
this.money = money;
}
}
- 实现一个RowMapper接口
package com.itykd.domain;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class MyRowMapper implements RowMapper<Account>{
@Override
public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
Account account = new Account();
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getDouble("money"));
return account;
}
}
- 完成数据封装
public void findObjectDemo() {
List<Account>list=jdbcTemplate.query("select * from account", new MyRowMapper());
System.out.println(list.size());
}