日期:2014-05-16  浏览次数:20640 次

使用spring的jdbcTemplate-----用jdbc模板跟新数据库

1,用语句创建器更新数据库
第一个回调接口是PreparedStatementCreator,实现这个接口来覆盖整个更新过程语句创建任务和参数绑定任务。为了将一个

User对象插入到数据库中,要像下面这样来实现PreparedStatementCreator接口。

public class InsertPreparedStatementCreator implements PreparedStatementCreator{
	private User user;
	
	public InsertPreparedStatementCreator(User user){
		this.user = user;
	}	

	public PreparedStatement createPreparedStatement(Connection conn){
		
		String sql = "insert into user(username,password) values(?,?);
		PreparedStatement ps  = conn.prepareStatement(sql);
		ps.setString(1,user.getUsername());
		ps.setString(2,user.getPassword());
		return ps;
	}
}

?

?


在实现PreparedStatementCreator接口时,会得到数据库连接,它将作为createPreparedStatement()方法的参数,要做的就是

在连接上创建PreparedStatement对象,作为方法的返回值,注意,方法签名中声明抛出了SQLException,这意味着不需要亲自

处理异常。
现在就可以用这个语句创建器来插入数据了。

public class JdbcUserDao implements UserDao{
	
	...........

	public void insert(User user){
		
		JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
		jdbcTemplate.insert(new InsertPreparedStatementCreator(user));
	}
}

?

?

一般来说,如果接口只在一个方法里使用,最好将PreparedStatementCreator接口和其他的回调接口做为内部类来实现,这是

应为可以直接从内部类中存取局部变量和方法参数,而不是将它作为构造参数进行传递,对这些变量和参数的唯一限制是将它

们必须被声明为final的。

public class JdbcUserDao implements UserDao{

	...........

	public void insert(final User user){
	
		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);	
		
		jdbcTemplate.update(new PreparedStatementCreator(Connection conn)throws SQLException{
	
			String sql = "insert into user(username ,password) values (?,?)";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1,user.getUsername());
			ps.setString(2,user.getPassword());
	
			return ps;
		});
	}
}

?

?

2,用语句设值器更新数据库
第二个回调接口是PreparedStatementSetter,顾名思义,它只执行整个过程中的参数绑定任务。

public class JdbcUserDao implements UserDao{
	

	public void insert(final User user){

		String sql ="insert into user vlaues (?,?)";
		JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
		
		jdbcTemplate.update(sql,new PreparedStatementSetter(){
	
			public void setValue(PreparedStatement ps)throws Exception{

				ps.setString(1,user.getUsername());
				ps.setString(2,user.getPassword());
			}
		});
	}
}

?

?

另一个版本的update()模板方法接受sql语句和PreparedStatementSetter对象作为参数,该方法会替换从SQL语句中创建

PreparedStatement对象,使用这个接口,所要做的就是参数绑定到PreparedStatement对象上。

?

3,用SQL语句和参数值更新数据库


最后,最简单的update()方法接受SQL语句和对象数组作为语句参数,它会替换从SQL语句中创建的PreparedStatement对象并绑

定参数,因此,不必覆盖整个更新过程的任何任务。

public JdbcUserDao implements UserDao{

	public void insert(final User user){

		String sql ="insert into user values (?,?)";
		JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);

		jdbcTemplate.update(sql,new Object[]{user.getUsername(),user,getPassword()});
		
	}
}

?

?

前面介绍了三种不同的update()方法,最后一种最简单,因为不必实现任何接口,与之相反,第一种最灵活,可以在执行

PreparedStatement对象之前对它进行任意预处理,

?

4,批处理更新数据库

?

假定我们一次插入一批数据到数据库,如果多次调用insert()方法,速度会非常慢 ,因为SQL语句要重复的编译,因此,最好

在DAO接口上添加一个新的方法,插入已批量用户。

?

public interface UserDao{

	.......

	public void insert(List<User> user);

}

?


JdbcTemplate模板也为批量跟新数据提供了batchUpdate()模板方法,它需要一个sql语句和一个

BatchPreparedStatementSetter对象作为参数,这个 方法中,语句编译一次,执行多次。

public class JdbcUserDao implements UserDao{

	public void inser(final List<User> user){
		
		String sql ="insert into User values(?,?)";
		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

		jdbcTemplate.batchUpdate(sql,new BatchPreparedStatementSetter(){

			public int getBatchSize(){

				return user.size();
			}

			public void setValue(PreparedStatement ps,int i)t