Spring JDBC

Spring JDBC模块负责数据库资源管理和错误处理。

针对数据库操作,Spring框架提供了JdbcTemplate类,该类是Spring JDBC的核心类。

一、Spring JDBC的配置

Spring JDBC主要由4个包组成:

Spring JDBC_第1张图片

Spring JDBC所需要的jar包:

Spring JDBC_第2张图片 

 Spring对数据库的操作都封装在了这几个包中,想要使用JDBC就需要对其进行配置,在Spring容器中,对JDBC的配置是在applicationContext.xml文件中进行的。



	
	
	
		
		
		
		
		
		
		
		
	
	
	
		
		
	
	
	
	
		
		
	

关于DataSource

DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource称为连接池  数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。

连接池的作用:

先创建一个连接对象,将该连接对象及其内容都放到连接池里面,用的时候去拿,用完了放回到连接池,从而避免了经常打开和关闭连接对象。

dataSource的四个属性:

Spring JDBC_第3张图片

二、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():用于执行插入,更新和删除操作。常用的方法如下图所示:

Spring JDBC_第4张图片

下面通过一个账户管理的案例来演示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


	
		
		
		
	

最后在测试类中测试。

@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():用于执行数据库的查询操作。常用的方法如下图所示:

Spring JDBC_第5张图片

继续用账户管理的案例来演示query()方法的使用:

在AccountDao接口及其实现类中添加以下方法:

//通过id查询
	public Account findAccountById(int id);
	//查询所有账户
	public List findAllAccount(); 
//通过id查询账户数据信息
	@Override
	public Account findAccountById(int id) {
		//定义sql语句
		String sql = "select * from account where id =?";
		//创建一个新的BeanPropertyRowMapper对象
		RowMapper rowmapper = new BeanPropertyRowMapper(Account.class);
		//将id绑定到sql语句中,并通过RowMapper返回一个Object类型的单行记录
		return this.jdbctemplate.queryForObject(sql, rowmapper,id);
	}
	//查询所有账户信息
	@Override
	public List findAllAccount() {
		//定义sql语句
		String sql = "SELECT * FROM ACCOUNT";
		//创建一个新的BeanPropertyRowMapper
		RowMapper rowmapper = new BeanPropertyRowMapper(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 = accountdao.findAllAccount();
		System.out.println(account);

你可能感兴趣的:(sql,数据库,spring)