Spring与JDBC模板(IOC的应用)

Spring与Dao部分,是Spring的两大核心技术IOC与AOP的典型的应用体现。

 

为了避免直接使用JDBC而带来 的复杂且冗长的代码,Spring提供了一个强有力的模板类--jdbcTemplate来简化JDBC操作。并且,数据源DataSource对象与模板jdbcTemplate对象均可以通过Bean的形式定义在配置文件中,充分发挥了依赖注入的威力。

 

注意:JDBC模板对象是多例的

 

JdbcTemplate对象是多例的,即系统会为每一个使用模板对象的线程(方法)创建一个jdbcTemplate实例,并且在该线程(方法)结束时,自动释放jdbcTemplate实例。所以在每次使用jdbcTemplate对象时,都需要通过getJdbcTemplate()方法获取。

 

实例:

 

流程:

 

  1. Dao层继承JdbcDaoSupport,利用其中的jdbcTemplate实例对象,对SQL语句进行操作。
  2. Service层,使用IOC的依赖注入获取DAO层的实例对象,调用DAO层的实现方法。
  3. 测试层使用IOC的依赖注入获取Service层的实例对象,调用Service层的实现方法。
  4. 配置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>

猜你喜欢

转载自blog.csdn.net/txgANG/article/details/81412468