Spring JDBC模块负责数据库资源管理和错误处理。
针对数据库操作,Spring框架提供了JdbcTemplate类,该类是Spring JDBC的核心类。
一、Spring JDBC的配置
Spring JDBC主要由4个包组成:
Spring JDBC所需要的jar包:
Spring对数据库的操作都封装在了这几个包中,想要使用JDBC就需要对其进行配置,在Spring容器中,对JDBC的配置是在applicationContext.xml文件中进行的。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 1.配置数据源(连接池) -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<!-- 连接数据库的url -->
<property name="url" value="jdbc:mysql://localhost:3306/spring?"></property>
<!-- 连接数据库的用户名 -->
<property name="username" value="root"></property>
<!-- 连接数据库的密码 -->
<property name="password" value="123456"></property>
</bean>
<!-- 2.配置jdbc模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默认必须使用数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 3.配置注入类 -->
<bean id="***" class="***">
<!-- 将jdbcTemplate注入到实例中 -->
<property name="jdbctemplate" ref="jdbcTemplate"></property>
</bean>
</beans>
关于DataSource
DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource称为连接池 数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
连接池的作用:
先创建一个连接对象,将该连接对象及其内容都放到连接池里面,用的时候去拿,用完了放回到连接池,从而避免了经常打开和关闭连接对象。
dataSource的四个属性:
二、Spring JDBC Template 的常用方法
1.execute(String sql): 用于执行sql语句。
用一个创建数据库表的方法来演示该方法:
首先在数据库中创建一个名为spring的数据库。
然后创建一个web项目,并导入相应jar包。
第三步,创建applicationContext.xml配置文件,并进行数据源的配置。
(配置代码和上面的配置模板一样)
最后创建一个JUnit测试类:
package com.haust.jdbc;
import java.util.List;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class JdbcTemplateTest {
/*
* 使用execute()方法建表
* execute(String sql)方法能够完成执行sql语句的功能
*/
@Test
public void run1(){
ApplicationContext applicationcontext = new ClassPathXmlApplicationContext("applicationcontext.xml");
//获取JdbcTemplate实例
JdbcTemplate jdbctemplate =(JdbcTemplate) applicationcontext.getBean("jdbcTemplate");
//使用execute()方法执行SQL语句
jdbctemplate.execute("CREATE TABLE account("+
"id int primary key auto_increment,"+
"username varchar(50),"+
"balance double)");
System.out.println("创建完毕");
}
执行之后,查询数据库中该表已经被创建。
2.update():用于执行插入,更新和删除操作。
update():用于执行插入,更新和删除操作。常用的方法如下图所示:
下面通过一个账户管理的案例来演示update()方法的使用。
首先创建一个Account实体类 。
package com.haust.jdbc;
public class Account {
private Integer id ;
private String username ;
private Double balance ;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
@Override
public String toString() {
return "Account [id=" + id + ", username=" + username + ", balance="
+ balance + "]";
}
}
然后创建AccountDao接口及其实现类AccountDaoImpl。
package com.haust.jdbc;
import java.util.List;
public interface AccountDao {
//添加
public int addAccount(Account account);
//更新
public int updateAccount(Account account);
//删除
public int deleteAccount(int id);
}
package com.haust.jdbc;
import java.util.List;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
public class AccountDaoImpl implements AccountDao {
//声明JdbcTemplate属性及其setter方法
private JdbcTemplate jdbctemplate;
public JdbcTemplate getJdbctemplate() {
return jdbctemplate;
}
public void setJdbctemplate(JdbcTemplate jdbctemplate) {
this.jdbctemplate = jdbctemplate;
}
//添加账户
@Override
public int addAccount(Account account) {
//定义sql
String sql = "INSERT INTO ACCOUNT(username,balance) VALUES(?,?)";
//定义数组来存储sql语句中的参数
Object obj = new Object[]{
account.getId(),
account.getUsername(),
account.getBalance()
};
//执行添加操作,返回的是受sql语句影响的记录条数
int num = jdbctemplate.update(sql,obj);
return num;
}
//更新账户
@Override
public int updateAccount(Account account) {
//定义sql语句
String sql = "update account set username=?,balance=? where id=?";
//定义数组来存储sql语句中的参数
Object obj = new Object[]{
account.getUsername(),
account.getBalance(),
account.getId()
};
//执行更新操作,返回的是受sql语句影响的记录条数
int num = jdbctemplate.update(sql,obj);
return num;
}
//删除账户
@Override
public int deleteAccount(int id) {
//定义sql语句
String sql = "delete from account where id = ?";
//执行删除操作,返回的是受sql语句影响的记录条数
int num = jdbctemplate.update(sql,id);
return num;
}
}
然后在applicationContext.xml文件中创建accountDao的Bean,并注入JdbcTemplate
<!-- 3.定义一个id为accountDao的Bean -->
<bean id="accountdao" class="com.haust.jdbc.AccountDaoImpl">
<!-- 将jdbcTemplate注入到accountDao实例中 -->
<!-- name="jdbctemplate"中的name的值需要和AccountDaoImpl中的JdbcTemplate属性的setter方法的参数保持一致 -->
<property name="jdbctemplate" ref="jdbcTemplate"></property>
</bean>
最后在测试类中测试。
@Test
public void run2(){
ApplicationContext applicationcontext = new ClassPathXmlApplicationContext("applicationcontext.xml");
AccountDao accountdao =(AccountDao) applicationcontext.getBean("accountdao");
//创建account对象,并向account对象中添加数据
Account account = new Account();
account.setUsername("tom");
account.setBalance(100.00);
//执行addAccount方法,并获取返回结果
int num = accountdao.addAccount(account);
if (num >0){
System.out.println("成功插入了"+num+"条数据!");
}else{
System.out.println("插入操作执行失败!");
}
}
@Test
public void run3(){
ApplicationContext applicationcontext = new ClassPathXmlApplicationContext("applicationcontext.xml");
AccountDao accountdao =(AccountDao) applicationcontext.getBean("accountdao");
//创建account对象,并向account对象中添加数据
Account account = new Account();
account.setId(1);
account.setUsername("lisi");
int num = accountdao.updateAccount(account);
if (num >0){
System.out.println("成功修改了"+num+"条数据!");
}else{
System.out.println("修改操作执行失败!");
}
}
@Test
public void run4(){
ApplicationContext applicationcontext = new ClassPathXmlApplicationContext("application-annocation.xml");
AccountDao accountdao =(AccountDao) applicationcontext.getBean("accountdao");
int num = accountdao.deleteAccount(2);
if (num >0){
System.out.println("成功删除了"+num+"条数据!");
}else{
System.out.println("删除操作执行失败!");
}
}
3.query():用于执行数据库查询操作。
query():用于执行数据库的查询操作。常用的方法如下图所示:
继续用账户管理的案例来演示query()方法的使用:
在AccountDao接口及其实现类中添加以下方法:
//通过id查询
public Account findAccountById(int id);
//查询所有账户
public List<Account> findAllAccount();
//通过id查询账户数据信息
@Override
public Account findAccountById(int id) {
//定义sql语句
String sql = "select * from account where id =?";
//创建一个新的BeanPropertyRowMapper对象
RowMapper<Account> rowmapper = new BeanPropertyRowMapper<Account>(Account.class);
//将id绑定到sql语句中,并通过RowMapper返回一个Object类型的单行记录
return this.jdbctemplate.queryForObject(sql, rowmapper,id);
}
//查询所有账户信息
@Override
public List<Account> findAllAccount() {
//定义sql语句
String sql = "SELECT * FROM ACCOUNT";
//创建一个新的BeanPropertyRowMapper
RowMapper<Account> rowmapper = new BeanPropertyRowMapper<Account>(Account.class);
//执行静态的sql查询,并通过RowMapper返回结果
return this.jdbctemplate.query(sql,rowmapper);
}
在测试类中测试该方法:
@Test
public void run5(){
ApplicationContext applicationcontext = new ClassPathXmlApplicationContext("applicationcontext.xml");
AccountDao accountdao =(AccountDao) applicationcontext.getBean("accountdao");
Account account = accountdao.findAccountById(1);
System.out.println(account);
}
@Test
public void run6(){
ApplicationContext applicationcontext = new ClassPathXmlApplicationContext("applicationcontext.xml");
AccountDao accountdao =(AccountDao) applicationcontext.getBean("accountdao");
List<Account> account = accountdao.findAllAccount();
System.out.println(account);