Spring与Dao部分,是Spring的两大核心技术IOC与AOP的典型的应用体现。
为了避免直接使用JDBC而带来 的复杂且冗长的代码,Spring提供了一个强有力的模板类--jdbcTemplate来简化JDBC操作。并且,数据源DataSource对象与模板jdbcTemplate对象均可以通过Bean的形式定义在配置文件中,充分发挥了依赖注入的威力。
注意:JDBC模板对象是多例的
JdbcTemplate对象是多例的,即系统会为每一个使用模板对象的线程(方法)创建一个jdbcTemplate实例,并且在该线程(方法)结束时,自动释放jdbcTemplate实例。所以在每次使用jdbcTemplate对象时,都需要通过getJdbcTemplate()方法获取。
实例:
流程:
注册Service,注入dao <--- 注册Dao,注入jdbcTemplate <---
注册jdbcTemplate,注入dataSource数据源 <--- 注册数据源,注入四要素以及其他的配置信息。
代码实例笔记,以便流程复习
package edu.sdut.dao;
import java.util.List;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import edu.sdut.bean.Student;
public class StudentDaoImpl extends JdbcDaoSupport implements IStudentDao {
@Override
public void insertStudent(Student student) {
// TODO Auto-generated method stub
String sql = "insert into student(name,age) values(?,?)";
this.getJdbcTemplate().update(sql, student.getName(),student.getAge());
}
@Override
public void deleteById(int id) {
// TODO Auto-generated method stub
String sql = "delete from student where id = ?";
this.getJdbcTemplate().update(sql, id);
}
@Override
public void updateStudent(int id) {
// TODO Auto-generated method stub
String sql = "update student set name=?,age=? where id=?";
this.getJdbcTemplate().update(sql, "txg","21",id);
}
@Override
public List selectAllStudentsNames() {
// TODO Auto-generated method stub
String sql = "select name from student";
return this.getJdbcTemplate().queryForList(sql, String.class);
}
@Override
public String selectStudentNameById(int id) {
// TODO Auto-generated method stub
String sql = "select name from student where id = ?";
return this.getJdbcTemplate().queryForObject(sql, String.class,id);
}
/**
* 这了需要借助RowMapper接口,实现对数据的手动封装
*/
@Override
public List selectAllStudents() {
// TODO Auto-generated method stub
String sql = "select * from student";
return this.getJdbcTemplate().query(sql, new StudentRowMapper());
}
@Override
public Student selectStudentById(int id) {
// TODO Auto-generated method stub
String sql = "select * from student where id=?";
return this.getJdbcTemplate().queryForObject(sql, new StudentRowMapper(),id);
}
}
package edu.sdut.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
import edu.sdut.bean.Student;
public class StudentRowMapper implements RowMapper {
/**
* rs:当查询出总的结果集后,框架会遍历这个结果集,
* 每一次遍历的一行数据,都会被存放到这个方法的rs参数中。
* 也就是说,这里的rd代表的是一行数据,并非所有查询结果
* 换个角度来说,只要能执行到这个方法,就说明这里的rs就不会是空的
*/
@Override
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
Student student = new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
return student;
}
}