日期:2014-05-16 浏览次数:20659 次
由于工作需要,数据交互层需要用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; }
?
总结:虽然只做了查询,但不难看出,增删改的操作,及其他的方法的设置,参数的使用上基本上都大同小异。
?
?