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

SpringJdbcTemplate 学习查询小结

由于工作需要,数据交互层需要用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;
	}

?

总结:虽然只做了查询,但不难看出,增删改的操作,及其他的方法的设置,参数的使用上基本上都大同小异。

?

?