摘要:使用JDBCTemplate
		
		
				
						 
				
		
		
				对于一个基本的JDBC存取,Connection的取得,Statement的建立,异常处理,Statement的关闭,Connection的关闭这些流程大致在不同的数据库技术上大致是相同的。Spring提供的JdbcTemplate类,被设计为线程安全,当中所提供的一些操作方法封装了类似上面的流程。
		
		
				
						 
				
		
		
				
						 
				
		
		
				
						●     
				
				
						对于UserDAO.java的JdbcTemplate改进
				
		
		
				
						 
				
		
		
				只需要改进相应的方法就可以了,其它的程序与文件不用变动。
		
		
				
						 
				
		
		
				package com.kela.spring.jdbc;
		
		
				
						 
				
		
		
				import java.util.Iterator;
		
		
				import java.util.List;
		
		
				import java.util.Map;
		
		
				
						 
				
		
		
				import javax.sql.DataSource;
		
		
				
						 
				
		
		
				import org.springframework.jdbc.core.JdbcTemplate;
		
		
				
						 
				
		
		
				import com.kela.spring.util.Util;
		
		
				
						 
				
		
		
				public class Test implements IUserDAO {
		
		
				
						    
						
						
				
		
		
				
						    private JdbcTemplate jdbcTemplate;
		
		
				
						 
				
		
		
				
						    public void setDataSource(DataSource dataSource) {
		
		
				
						        jdbcTemplate = new JdbcTemplate(dataSource);
		
		
				
						    }
		
		
				
						 
				
		
		
				
						    public void insert(User user) {
		
		
				
						        String name = user.getName();
		
		
				
						        int age = user.getAge().intValue();
		
		
				
						 
				
		
		
				
						        String sql = "INSERT INTO user (name, age) VALUES ('" + name + "', " + age + ")";
		
		
				
						        //
				转码
		
		
				
						        sql = Util.GBKToISO(sql);
		
		
				
						        
						
						
				
		
		
				
						        jdbcTemplate.update(sql);
		
		
				
						    }
		
		
				
						 
				
		
		
				
						    public User find(Integer id) {
		
		
				
						        
						
						
				
		
		
				
						        String sql = "SELECT * FROM user WHERE id = " + id.intValue();
		
		
				
						        
						
						
				
		
		
				
						        List rs = jdbcTemplate.queryForList(sql);
		
		
				
						        
						
						
				
		
		
				
						        Iterator it = rs.iterator();
		
		
				
						        
						
						
				
		
		
				
						        if(it.hasNext()) {
		
		
				
						            Map userMap = (Map)it.next();
		
		
				
						            Integer i = new Integer(userMap.get("id").toString());
		
		
				
						            String name = Util.getStr(userMap.get("name").toString());//
				转码
		
		
				
						            Integer age  = new Integer(userMap.get("age").toString());
		
		
				
						            
						
						
				
		
		
				
						            User user = new User();
		
		
				
						            user.setId(i);
		
		
				
						            user.setAge(age);
		
		
				
						            user.setName(name);
		
		
				
						            return user;
		
		
				
						        }
		
		
				
						        return null;
		
		
				
						    }
		
		
				}
		
		
				
						 
				
		
		
				
						●     
				
				
						几种JdbcTemplate执行与更新,查询的演示
				
		
		
				
						 
				
		
		
				
						A.  
				
				使用JdbcTemplate的execute()方法执行SQL陈述。
		
		
				jdbcTemploat.execute(sql);
		
		
				
						B.  
				
				如果是Update或insert,使用update()方法。
		
		
				
						 
				
		
		
				… … …
		
		
				使用预编译SQL,
		
		
				public void insert(User user) {
		
		
				
						        final String name = user.getName();
		
		
				
						        final int age = user.getAge().intValue();
		
		
				
						        
						
						
				
		
		
				
						        jdbcTemplate.update(new PreparedStatementCreator() {
		
		
				
						 
				
		
		
				
						            public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
		
		
				
						                String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
		
		
				
						                PreparedStatement ps = conn.prepareStatement(sql);
		
		
				
						                ps.setString(1, name);
		
		
				
						                ps.setInt(2, age);
		
		
				
						                return ps;
		
		
				
						            }
		
		
				
						        }
		
		
				
						        );
		
		
				
						    }
		
		
				
						 
				
		
		
				… … …
		
		
				
						 
				
		
		
				public void insert(User user) {
		
		
				
						        final String name = user.getName();
		
		
				
						        final int age = user.getAge().intValue();
		
		
				
						        
						
						
				
		
		
				
						        String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
		
		
				
						        jdbcTemplate.update(sql, new PreparedStatementSetter() {
		
		
				
						 
				
		
		
				
						            public void setValues(PreparedStatement ps) throws SQLException {
		
		
				
						                ps.setString(1, name);
		
		
				
						                ps.setInt(2, age);
		
		
				
						            }
		
		
				
						        });
		
		
				
						    }
		
		
				
						 
				
		
		
				… … …
		
		
				
						 
				
		
		
				public void insert(User user) {
		
		
				
						    String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
		
		
				
						    jdbcTemplate.update(sql, new Object[] {user.getName(), user.getAge()});
		
		
				}
		
		
				
						 
				
		
		
				… … … 
		
		
				
						 
				
		
		
				
						C.  
				
				使用JdbcTemplate进行查询时,可是使用queryForXXX()等方法。
		
		
				
						 
				
		
		
				//
				返回一个整型
		
		
				jdbcTemplate.queryForInt(“select count
				(*) from user“);
		
		
				
						 
				
		
		
				//
				返回一个查询后的结果对象
		
		
				jdbcTemplate.queryForObject(“select name from user where id = ?”, 
		
		
				new Object[] {id}, 
		
		
				java.lang.String.class);
		
		
				
						 
				
		
		
				//
				返回多笔资料的列表
		
		
				jdbcTemplate.queryForList
				(“select * from user”);
		
		
				
						 
				
		
		
				List
				中包括的事Map对象,每个Map对象代表查询结果的一行记录。