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