Spring JDBC

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);

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值