Spring与Dao部分,是Spring的两大核心技术IOC与AOP的典型的应用体现。
为了避免直接使用JDBC而带来 的复杂且冗长的代码,Spring提供了一个强有力的模板类--jdbcTemplate来简化JDBC操作。并且,数据源DataSource对象与模板jdbcTemplate对象均可以通过Bean的形式定义在配置文件中,充分发挥了依赖注入的威力。
注意:JDBC模板对象是多例的
JdbcTemplate对象是多例的,即系统会为每一个使用模板对象的线程(方法)创建一个jdbcTemplate实例,并且在该线程(方法)结束时,自动释放jdbcTemplate实例。所以在每次使用jdbcTemplate对象时,都需要通过getJdbcTemplate()方法获取。
实例:
流程:
- Dao层继承JdbcDaoSupport,利用其中的jdbcTemplate实例对象,对SQL语句进行操作。
- Service层,使用IOC的依赖注入获取DAO层的实例对象,调用DAO层的实现方法。
- 测试层使用IOC的依赖注入获取Service层的实例对象,调用Service层的实现方法。
- 配置ApplicationContext.xml文件:
注册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<String> 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<Student> 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<Student> {
/**
* 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;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
<!-- 注册配置属性文件信息,方式一 -->
<!--
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"/>
</bean> -->
<!-- 注册配置属性文件信息,方式二 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 注册数据源 : Spring内置连接池-->
<!--
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/springdaotest"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
-->
<!-- 注册数据源 : c3p0连接池
什么时候创建的连接池?什么时候销毁?需要常见多少?需要根据业务逻辑进行配置
-->
<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/springdaotest"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 注册JdbcTemplate -->
<bean id="myJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入数据源 -->
<property name="dataSource" ref="myDataSource"/>
</bean>
<!-- 注册 dao-->
<bean id="StudentDao" class="edu.sdut.dao.StudentDaoImpl">
<!-- 注入jdbcTemplate
这里可以不用注入jdbcTemplate,也就不用注册JdbcTemplate,
可以直接注入数据源:<property name="dataSource" ref="myDataSource"/>
因为jdbcTemplate的源码中已经去判断了,如果jdbcTemplate=null,
就直接注册数据源
-->
<property name="jdbcTemplate" ref="myJdbcTemplate"/>
</bean>
<!-- 注册Service -->
<bean id="studentService" class="edu.sdut.service.StudentServiceImpl">
<!-- 注入dao -->
<property name="dao" ref="StudentDao"/>
</bean>
</beans>