日期:2014-05-16 浏览次数:20715 次
由于工作需要,数据交互层需要用jdbctemplate,于是学习了下,备忘:
?
Name:SpringJdbcTemplate
What:springjdbc封装了繁琐的jdbc直连代码,通过简单的设置,在spring下更好的进行事务管理,它抽象出了一些我们常用的操作方法,使用起来简单而高效。
	Where:在数据库底层拥有复杂的表结构,以及大数据量操作时,使用起来相当的简便,尤其它是与spring相结合,如果开发框架中使用spring,那么jdbctemplate是最好的选择。
	Why:使用起来简单,且高效。
	How:
1、	在spring的配置文件中导包并设置datasource数据源,导包如下:

数据源如下(采用外联jdbc.properties):
?
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<value>classpath:jdbc.properties</value>
		</property>
	</bean>
	
	<bean id="dataSource" destroy-method="close"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
?
2、	 如下书写配置
<!-- jdbc连接,所有dao的bean中spring配置必须继承此bean --> <bean id="jdbcdao" class="org.springframework.jdbc.core.JdbcTemplate" abstract="true"> <property name="dataSource"> <ref local="dataSource"></ref> </property> </bean>
?
?
3、	在dao的bean中继承此bean,如下:
?
<bean id="userDao" class="bin.spring.jdbctemplate.dao.UserDao" parent="jdbcdao"/>?
?
4、	接下来在dao的实现类中让它继承JdbcDaoSupport,便可以使用封装的方法。
	public class UserDao extends JdbcDaoSupport
5、	这里介绍一种多行查询,其中User为模型类,里面4个属性,数据库的表为t_user:
?
	 /** 
	 * 查询多行
	 *
	 * @return
	 */
	 public List<User> getList(){
		String sql = "select * from t_user";
		List<User> list = getJdbcTemplate().query(sql, new RowMapper(){
			//index为查询出数据每列的下标,从0开始
			public Object mapRow(ResultSet rs, int index) throws SQLException {
				User user = new User();
				user.setId(rs.getInt("u_id"));
				user.setName(rs.getString("u_name"));
				user.setPassword(rs.getString("u_password"));
				return user;
			}});
		return list;
	}
?
6、	单列查询:
?
	 /** 
	 * 查询单列
	 *
	 * @param id
	 * @return
	 */
	 public String getUserNameById(final int id){
		String sql = "select t.u_name from t_user t where t.u_id = ?";
		return (String)getJdbcTemplate().query(sql, new PreparedStatementSetter(){
			//PreparedStatementSetter的回调
			public void setValues(PreparedStatement ps) throws SQLException {
				ps.setInt(1, id);
				
			}}, new ResultSetExtractor(){
			//ResultSetExtractor的回调
			public Object extractData(ResultSet rs) throws SQLException,
					DataAccessException {
				if (rs.next()) {
					System.out.println(rs.getString(1));
			        return rs.getString(1);
			    }
				return null;
			}});
	}
?
?
7、 单行查询:
	 /** 
	 * 查询单行
	 *
	 * @param id
	 * @param name
	 * @return
	 */
	 public User getUserById(final int id,final String name){
		String sql = "select * from t_user t where t.u_id = ? and t.u_name = ?";
		final User user = new User();
		getJdbcTemplate().query(sql, new Object[]{id,name}, new RowCallbackHandler(){
			public void processRow(ResultSet rs) throws SQLException {
				user.setId(rs.getInt(1));
				user.setName(rs.getString(2));
				user.setPassword(rs.getString(3));
				
			}});
		return user;
	}
?
总结:虽然只做了查询,但不难看出,增删改的操作,及其他的方法的设置,参数的使用上基本上都大同小异。
?
?