`
davidxiaozhi
  • 浏览: 241478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring JdbcTemplate 与 事务管理 学习(转)

阅读更多

Spring的JDBC框架能够承担资源管理和异常处理的工作,从而简化我们的JDBC代码,
让我们只需编写从数据库读写数据所必需的代码。Spring把数据访问的样板代码隐藏到模板类之下,
结合Spring的事务管理,可以大大简化我们的代码.

Spring提供了3个模板类:

JdbcTemplate:Spring里最基本的JDBC模板,利用JDBC和简单的索引参数查询提供对数据库的简单访问。
NamedParameterJdbcTemplate:能够在执行查询时把值绑定到SQL里的命名参数,而不是使用索引参数。
SimpleJdbcTemplate:利用Java 5的特性,比如自动装箱、通用(generic)和可变参数列表来简化JDBC模板的使用。
具体使用哪个模板基本上取决于个人喜好。


使用Spring的JdbcTemplate来实现简单的增删改查,首先建立测试数据表person
create table person(
id int not null primary key auto_increment,
name varchar(20) not null
)

导入依赖的jar包,由于测试中数据源使用的是dbcp数据源,需要以下jar包支持:
commons-logging.jar
commons-pool.jar
commons-dbcp.jar
同时还必须导入数据库驱动jar包:mysql-connector-java-3.1.8-bin.jar

建立实体bean
Person.java

Java代码 复制代码
  1. package com.royzhou.jdbc;   
  2.   
  3. public class PersonBean {   
  4.     private int id;   
  5.     private String name;   
  6.   
  7.     public PersonBean() {   
  8.     }   
  9.        
  10.     public PersonBean(String name) {   
  11.         this.name = name;   
  12.     }   
  13.        
  14.     public PersonBean(int id, String name) {   
  15.         this.id = id;   
  16.         this.name = name;   
  17.     }   
  18.         
  19.     public int getId() {   
  20.         return id;   
  21.     }   
  22.   
  23.     public void setId(int id) {   
  24.         this.id = id;   
  25.     }   
  26.   
  27.     public String getName() {   
  28.         return name;   
  29.     }   
  30.   
  31.     public void setName(String name) {   
  32.         this.name = name;   
  33.     }   
  34.        
  35.     public String toString() {   
  36.         return this.id + ":" + this.name;   
  37.     }   
  38. }  
package com.royzhou.jdbc;

public class PersonBean {
	private int id;
	private String name;

	public PersonBean() {
	}
	
	public PersonBean(String name) {
		this.name = name;
	}
	
	public PersonBean(int id, String name) {
		this.id = id;
		this.name = name;
	}
	 
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public String toString() {
		return this.id + ":" + this.name;
	}
}



接口类:
PersonService.java

Java代码 复制代码
  1. package com.royzhou.jdbc;   
  2.   
  3. import java.util.List;   
  4.   
  5. public interface PersonService {   
  6.        
  7.     public void addPerson(PersonBean person);   
  8.        
  9.     public void updatePerson(PersonBean person);   
  10.        
  11.     public void deletePerson(int id);   
  12.        
  13.     public PersonBean queryPerson(int id);   
  14.        
  15.     public List<PersonBean> queryPersons();   
  16. }  
package com.royzhou.jdbc;

import java.util.List;

public interface PersonService {
	
	public void addPerson(PersonBean person);
	
	public void updatePerson(PersonBean person);
	
	public void deletePerson(int id);
	
	public PersonBean queryPerson(int id);
	
	public List<PersonBean> queryPersons();
}



实现类:
PersonServiceImpl.java

Java代码 复制代码
  1. package com.royzhou.jdbc;   
  2.   
  3. import java.util.List;   
  4.   
  5. import javax.sql.DataSource;   
  6. import java.sql.Types;   
  7.   
  8. import org.springframework.jdbc.core.JdbcTemplate;   
  9.   
  10. public class PersonServiceImpl implements PersonService {   
  11.   
  12.     private JdbcTemplate jdbcTemplate;   
  13.        
  14.     /**  
  15.      * 通过Spring容器注入datasource  
  16.      * 实例化JdbcTemplate,该类为主要操作数据库的类  
  17.      * @param ds  
  18.      */  
  19.     public void setDataSource(DataSource ds) {   
  20.         this.jdbcTemplate = new JdbcTemplate(ds);   
  21.     }   
  22.        
  23.     public void addPerson(PersonBean person) {   
  24.         /**  
  25.          * 第一个参数为执行sql  
  26.          * 第二个参数为参数数据  
  27.          * 第三个参数为参数类型  
  28.          */  
  29.         jdbcTemplate.update("insert into person values(null,?)"new Object[]{person.getName()}, new int[]{Types.VARCHAR});   
  30.     }   
  31.   
  32.     public void deletePerson(int id) {   
  33.         jdbcTemplate.update("delete from person where id = ?"new Object[]{id}, new int[]{Types.INTEGER});   
  34.     }   
  35.   
  36.     public PersonBean queryPerson(int id) {   
  37.         /**  
  38.          * new PersonRowMapper()是一个实现RowMapper接口的类,  
  39.          * 执行回调,实现mapRow()方法将rs对象转换成PersonBean对象返回  
  40.          */  
  41.         PersonBean pb = (PersonBean) jdbcTemplate.queryForObject("select id,name from person where id = ?"new Object[]{id}, new PersonRowMapper());   
  42.         return pb;   
  43.     }   
  44.   
  45.     @SuppressWarnings("unchecked")   
  46.     public List<PersonBean> queryPersons() {   
  47.         List<PersonBean> pbs = (List<PersonBean>) jdbcTemplate.query("select id,name from person"new PersonRowMapper());   
  48.         return pbs;   
  49.     }   
  50.   
  51.     public void updatePerson(PersonBean person) {   
  52.         jdbcTemplate.update("update person set name = ? where id = ?"new Object[]{person.getName(), person.getId()}, new int[]{Types.VARCHAR, Types.INTEGER});   
  53.     }   
  54. }  
package com.royzhou.jdbc;

import java.util.List;

import javax.sql.DataSource;
import java.sql.Types;

import org.springframework.jdbc.core.JdbcTemplate;

public class PersonServiceImpl implements PersonService {

	private JdbcTemplate jdbcTemplate;
	
	/**
	 * 通过Spring容器注入datasource
	 * 实例化JdbcTemplate,该类为主要操作数据库的类
	 * @param ds
	 */
	public void setDataSource(DataSource ds) {
		this.jdbcTemplate = new JdbcTemplate(ds);
	}
	
	public void addPerson(PersonBean person) {
		/**
		 * 第一个参数为执行sql
		 * 第二个参数为参数数据
		 * 第三个参数为参数类型
		 */
		jdbcTemplate.update("insert into person values(null,?)", new Object[]{person.getName()}, new int[]{Types.VARCHAR});
	}

	public void deletePerson(int id) {
		jdbcTemplate.update("delete from person where id = ?", new Object[]{id}, new int[]{Types.INTEGER});
	}

	public PersonBean queryPerson(int id) {
		/**
		 * new PersonRowMapper()是一个实现RowMapper接口的类,
		 * 执行回调,实现mapRow()方法将rs对象转换成PersonBean对象返回
		 */
		PersonBean pb = (PersonBean) jdbcTemplate.queryForObject("select id,name from person where id = ?", new Object[]{id}, new PersonRowMapper());
		return pb;
	}

	@SuppressWarnings("unchecked")
	public List<PersonBean> queryPersons() {
		List<PersonBean> pbs = (List<PersonBean>) jdbcTemplate.query("select id,name from person", new PersonRowMapper());
		return pbs;
	}

	public void updatePerson(PersonBean person) {
		jdbcTemplate.update("update person set name = ? where id = ?", new Object[]{person.getName(), person.getId()}, new int[]{Types.VARCHAR, Types.INTEGER});
	}
}



PersonRowMapper.java

Java代码 复制代码
  1. package com.royzhou.jdbc;   
  2.   
  3. import java.sql.ResultSet;   
  4. import java.sql.SQLException;   
  5.   
  6. import org.springframework.jdbc.core.RowMapper;   
  7.   
  8. public class PersonRowMapper implements RowMapper {   
  9.     //默认已经执行rs.next(),可以直接取数据   
  10.     public Object mapRow(ResultSet rs, int index) throws SQLException {   
  11.         PersonBean pb = new PersonBean(rs.getInt("id"),rs.getString("name"));   
  12.         return pb;   
  13.     }   
  14. }  
package com.royzhou.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

public class PersonRowMapper implements RowMapper {
	//默认已经执行rs.next(),可以直接取数据
	public Object mapRow(ResultSet rs, int index) throws SQLException {
		PersonBean pb = new PersonBean(rs.getInt("id"),rs.getString("name"));
		return pb;
	}
}



我们需要在bean.xml中配置DataSource,并且将datasource注入到我们的业务类中

Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:context="http://www.springframework.org/schema/context"    
  5.        xmlns:aop="http://www.springframework.org/schema/aop"  
  6.        xsi:schemaLocation="http://www.springframework.org/schema/beans   
  7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  8.            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd   
  9.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
  10.   
  11.      <context:property-placeholder location="classpath:jdbc.properties"/>  
  12.      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  13.         <property name="driverClassName" value="${driverClassName}"/>  
  14.         <property name="url" value="${url}"/>  
  15.         <property name="username" value="${username}"/>  
  16.         <property name="password" value="${password}"/>  
  17.          <!-- 连接池启动时的初始值 -->  
  18.          <property name="initialSize" value="${initialSize}"/>  
  19.          <!-- 连接池的最大值 -->  
  20.          <property name="maxActive" value="${maxActive}"/>  
  21.          <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
  22.          <property name="maxIdle" value="${maxIdle}"/>  
  23.          <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
  24.          <property name="minIdle" value="${minIdle}"/>  
  25.      </bean>  
  26.        
  27. </beans>  
<?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" 
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

	 <context:property-placeholder location="classpath:jdbc.properties"/>
	 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="${driverClassName}"/>
	    <property name="url" value="${url}"/>
	    <property name="username" value="${username}"/>
	    <property name="password" value="${password}"/>
	     <!-- 连接池启动时的初始值 -->
		 <property name="initialSize" value="${initialSize}"/>
		 <!-- 连接池的最大值 -->
		 <property name="maxActive" value="${maxActive}"/>
		 <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
		 <property name="maxIdle" value="${maxIdle}"/>
		 <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
		 <property name="minIdle" value="${minIdle}"/>
	 </bean>
	
</beans>



jdbc.properties

Java代码 复制代码
  1. driverClassName=org.gjt.mm.mysql.Driver   
  2. url=jdbc:mysql://localhost:3306/royzhou?useUnicode=true&characterEncoding=UTF-8   
  3. username=root   
  4. password=123456  
  5. initialSize=1  
  6. maxActive=500  
  7. maxIdle=2  
  8. minIdle=1  
driverClassName=org.gjt.mm.mysql.Driver
url=jdbc:mysql://localhost:3306/royzhou?useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
initialSize=1
maxActive=500
maxIdle=2
minIdle=1



编写我们的测试类:TestJdbcTemplate.java

Java代码 复制代码
  1. package com.royzhou.jdbc;   
  2.   
  3. import org.springframework.context.ApplicationContext;   
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  5.   
  6. public class TestJdbcTemplate {   
  7.     public static void main(String[] args) {   
  8.         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");   
  9.         PersonService ps = (PersonService)ctx.getBean("personService");   
  10.         ps.addPerson(new PersonBean("royzhou"));   
  11.         PersonBean pb = ps.queryPerson(1);   
  12.         System.out.println(pb);   
  13.         pb.setName("haha");   
  14.         ps.updatePerson(pb);   
  15.         pb = ps.queryPerson(1);   
  16.         System.out.println(pb);   
  17.         ps.deletePerson(1);   
  18.         pb = ps.queryPerson(1);   
  19.         System.out.println(pb);   
  20.     }   
  21. }  
package com.royzhou.jdbc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestJdbcTemplate {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
		PersonService ps = (PersonService)ctx.getBean("personService");
		ps.addPerson(new PersonBean("royzhou"));
		PersonBean pb = ps.queryPerson(1);
		System.out.println(pb);
		pb.setName("haha");
		ps.updatePerson(pb);
		pb = ps.queryPerson(1);
		System.out.println(pb);
		ps.deletePerson(1);
		pb = ps.queryPerson(1);
		System.out.println(pb);
	}
}



上面代码先插入一条记录,然后修改,之后删除,运行之后出现异常,异常信息:
EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

难道Spring的queryForObject在查找不到记录的时候会抛出异常,看了一下Spring的源代码 发现确实如此:

Java代码 复制代码
  1. public Object queryForObject(String sql, Object[] args, int[] argTypes, RowMapper rowMapper) throws DataAccessException {   
  2.         List results = (List) query(sql, args, argTypes, new RowMapperResultSetExtractor(rowMapper, 1));   
  3.         return DataAccessUtils.requiredUniqueResult(results);   
  4.     }   
  5.   
  6.     public Object queryForObject(String sql, Object[] args, RowMapper rowMapper) throws DataAccessException {   
  7.         List results = (List) query(sql, args, new RowMapperResultSetExtractor(rowMapper, 1));   
  8.         return DataAccessUtils.requiredUniqueResult(results);   
  9.     }   
  10.   
  11.     public Object queryForObject(String sql, RowMapper rowMapper) throws DataAccessException {   
  12.         List results = query(sql, rowMapper);   
  13.         return DataAccessUtils.requiredUniqueResult(results);   
  14.     }   
  15.   
  16.     public static Object requiredUniqueResult(Collection results) throws IncorrectResultSizeDataAccessException {   
  17.         int size = (results != null ? results.size() : 0);   
  18.         if (size == 0) {   
  19.             throw new EmptyResultDataAccessException(1); // 问题在这里   
  20.         }   
  21.         if (!CollectionUtils.hasUniqueObject(results)) {   
  22.             throw new IncorrectResultSizeDataAccessException(1, size);   
  23.         }   
  24.         return results.iterator().next();   
  25.     }  
public Object queryForObject(String sql, Object[] args, int[] argTypes, RowMapper rowMapper) throws DataAccessException {
		List results = (List) query(sql, args, argTypes, new RowMapperResultSetExtractor(rowMapper, 1));
		return DataAccessUtils.requiredUniqueResult(results);
	}

	public Object queryForObject(String sql, Object[] args, RowMapper rowMapper) throws DataAccessException {
		List results = (List) query(sql, args, new RowMapperResultSetExtractor(rowMapper, 1));
		return DataAccessUtils.requiredUniqueResult(results);
	}

	public Object queryForObject(String sql, RowMapper rowMapper) throws DataAccessException {
		List results = query(sql, rowMapper);
		return DataAccessUtils.requiredUniqueResult(results);
	}

	public static Object requiredUniqueResult(Collection results) throws IncorrectResultSizeDataAccessException {
		int size = (results != null ? results.size() : 0);
		if (size == 0) {
			throw new EmptyResultDataAccessException(1); // 问题在这里
		}
		if (!CollectionUtils.hasUniqueObject(results)) {
		    throw new IncorrectResultSizeDataAccessException(1, size);
		}
		return results.iterator().next();
	}



发现当查找不到记录是,requiredUniqueResult方法做了判断,抛出异常, 想不明白为什么Spring要在这里做这样的判断,为啥不返回null????

重新修改PersonServiceImple类,把queryPerson方法改为使用列表查询的方式再去根据index取
PersonServiceImpl.java

Java代码 复制代码
  1. package com.royzhou.jdbc;   
  2.   
  3. import java.util.List;   
  4.   
  5. import javax.sql.DataSource;   
  6. import java.sql.Types;   
  7.   
  8. import org.springframework.jdbc.core.JdbcTemplate;   
  9.   
  10. public class PersonServiceImpl implements PersonService {   
  11.   
  12.     private JdbcTemplate jdbcTemplate;   
  13.        
  14.     /**  
  15.      * 通过Spring容器注入datasource  
  16.      * 实例化JdbcTemplate,该类为主要操作数据库的类  
  17.      * @param ds  
  18.      */  
  19.     public void setDataSource(DataSource ds) {   
  20.         this.jdbcTemplate = new JdbcTemplate(ds);   
  21.     }   
  22.        
  23.     public void addPerson(PersonBean person) {   
  24.         /**  
  25.          * 第一个参数为执行sql  
  26.          * 第二个参数为参数数据  
  27.          * 第三个参数为参数类型  
  28.          */  
  29.         jdbcTemplate.update("insert into person values(null,?)"new Object[]{person.getName()}, new int[]{Types.VARCHAR});   
  30.     }   
  31.   
  32.     public void deletePerson(int id) {   
  33.         jdbcTemplate.update("delete from person where id = ?"new Object[]{id}, new int[]{Types.INTEGER});   
  34.     }   
  35.   
  36.     @SuppressWarnings("unchecked")   
  37.     public PersonBean queryPerson(int id) {   
  38.         /**  
  39.          * new PersonRowMapper()是一个实现RowMapper接口的类,  
  40.          * 执行回调,实现mapRow()方法将rs对象转换成PersonBean对象返回  
  41.          */  
  42.         List<PersonBean> pbs = (List<PersonBean>)jdbcTemplate.query("select id,name from person where id = ?"new Object[]{id}, new PersonRowMapper());   
  43.         PersonBean pb = null;   
  44.         if(pbs.size()>0) {   
  45.             pb = pbs.get(0);   
  46.         }   
  47.         return pb;   
  48.     }   
  49.   
  50.     @SuppressWarnings("unchecked")   
  51.     public List<PersonBean> queryPersons() {   
  52.         List<PersonBean> pbs = (List<PersonBean>) jdbcTemplate.query("select id,name from person"new PersonRowMapper());   
  53.         return pbs;   
  54.     }   
  55.   
  56.     public void updatePerson(PersonBean person) {   
  57.         jdbcTemplate.update("update person set name = ? where id = ?"new Object[]{person.getName(), person.getId()}, new int[]{Types.VARCHAR, Types.INTEGER});   
  58.     }   
  59. }  
package com.royzhou.jdbc;

import java.util.List;

import javax.sql.DataSource;
import java.sql.Types;

import org.springframework.jdbc.core.JdbcTemplate;

public class PersonServiceImpl implements PersonService {

	private JdbcTemplate jdbcTemplate;
	
	/**
	 * 通过Spring容器注入datasource
	 * 实例化JdbcTemplate,该类为主要操作数据库的类
	 * @param ds
	 */
	public void setDataSource(DataSource ds) {
		this.jdbcTemplate = new JdbcTemplate(ds);
	}
	
	public void addPerson(PersonBean person) {
		/**
		 * 第一个参数为执行sql
		 * 第二个参数为参数数据
		 * 第三个参数为参数类型
		 */
		jdbcTemplate.update("insert into person values(null,?)", new Object[]{person.getName()}, new int[]{Types.VARCHAR});
	}

	public void deletePerson(int id) {
		jdbcTemplate.update("delete from person where id = ?", new Object[]{id}, new int[]{Types.INTEGER});
	}

	@SuppressWarnings("unchecked")
	public PersonBean queryPerson(int id) {
		/**
		 * new PersonRowMapper()是一个实现RowMapper接口的类,
		 * 执行回调,实现mapRow()方法将rs对象转换成PersonBean对象返回
		 */
		List<PersonBean> pbs = (List<PersonBean>)jdbcTemplate.query("select id,name from person where id = ?", new Object[]{id}, new PersonRowMapper());
		PersonBean pb = null;
		if(pbs.size()>0) {
			pb = pbs.get(0);
		}
		return pb;
	}

	@SuppressWarnings("unchecked")
	public List<PersonBean> queryPersons() {
		List<PersonBean> pbs = (List<PersonBean>) jdbcTemplate.query("select id,name from person", new PersonRowMapper());
		return pbs;
	}

	public void updatePerson(PersonBean person) {
		jdbcTemplate.update("update person set name = ? where id = ?", new Object[]{person.getName(), person.getId()}, new int[]{Types.VARCHAR, Types.INTEGER});
	}
}



再次运行测试类,输出:
1:royzhou
1:haha
null

得到预期的结果.

从上面代码可以看出,使用Spring提供的JDBCTemplate类很大程度减少了我们的代码量,
比起以前我们写JDBC操作,需要先获取Connection,然后是PreparedStatement,再到Result,
使用Spring JDBCTemplate写出来的代码看起来更加简洁,开发效率也比较快.

在数据库的操作中,事务是一个重要的概念,举个例子:

大概每个人都有转账的经历。当我们从A帐户向B帐户转100元后,银行的系统会从A帐户上扣除100而在B帐户上加100,这是一般的正常现象。
但是一旦系统出错了怎么办呢,这里我们假设可能会发生两种情况:
(1)A帐户上少了100元,但是B帐户却没有多100元。
(2)B帐户多了100元钱,但是A帐户上却没有被扣钱。
这种错误一旦发生就等于出了大事,那么再假如一下,你要转账的是1亿呢?
所以上面的两种情况分别是你和银行不愿意看到的,因为谁都不希望出错。那么有没有什么方法保证一旦A帐户上没有被扣钱而B帐户上也没有被加钱;
或者A帐户扣了100元而B帐户准确无误的加上100元呢。也就是说要么转账顺利的成功进行,要么不转账呢?可以,这就是数据库事务机制所要起到的作用和做的事情。

Spring对事务的管理有丰富的支持,Spring提供了编程式配置事务和声明式配置事务:

声明式事务有以下两种方式
一种是使用Annotation注解的方式(官方推荐)
一种是基于Xml的方式

采用任何一种方式我们都需要在我们的bean.xml中添加事务支持:

Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  8.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  9.            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd   
  10.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd   
  11.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  12.   
  13.     <context:property-placeholder location="classpath:jdbc.properties" color: #
    分享到:
    评论

相关推荐

    4.Spring中的JdbcTemplate,Spring中的的事务,

    通过本章节的学习,您应该能够掌握如何使用JdbcTemplate进行基本的数据库操作,以及如何在Spring中配置和使用声明式事务来管理复杂的业务流程。这些技能对于开发基于Spring框架的应用程序至关重要。

    spring-jdbcTemplate实例工程

    Spring JdbcTemplate支持自动和手动的事务管理。在AOP(面向切面编程)的帮助下,可以在方法级别控制事务的开始、提交和回滚。例如,通过@Transactional注解开启事务,当发生异常时,事务会自动回滚。 五、优势与...

    JdbcTemplate的事务控制.docx

    当使用`JdbcTemplate`结合Spring框架时,可以采用与原生JDBC事务控制类似的方法,但在Spring环境中进行管理。以下是一个使用Druid数据库连接池的示例代码: ```java @RequestMapping("/druidData1") public String ...

    基于注解的Spring JdbcTemplate

    本教程将深入探讨如何使用基于注解的Spring JdbcTemplate进行数据库操作,特别适合初学者入门学习。 ### 1. Spring JdbcTemplate简介 Spring JdbcTemplate提供了一个面向对象的接口,用于执行SQL查询、更新和存储...

    配制Spring事务和JdbcTemplate使用

    配制Spring事务和JdbcTemplate使用 配制Spring事务和JdbcTemplate使用

    SpringJdbcTemplate封装工具类

    SpringJdbcTemplate继承自`JdbcAccessor`,包含了事务管理的支持。它可以自动将数据库操作封装在事务中,当出现异常时,会回滚事务,确保数据的一致性。 6. **异常处理** SpringJdbcTemplate将底层JDBC抛出的异常...

    Spring4--3.jdbcTemplate事务

    文件`spring_3_1`、`spring_3`和`spring_3_2`可能包含了Spring框架关于JdbcTemplate和事务管理的更多示例代码和配置信息,学习这些资源有助于深入理解Spring4中如何有效地利用JdbcTemplate进行事务控制。通过实践,...

    Spring JDBCTemplate连接池jar包

    3. `spring-jdbc-5.0.0.RELEASE.jar`:包含Spring对JDBC的支持,包括JDBCTemplate和DataSourceTransactionManager,它们是与数据库交互和管理事务的关键。 4. `spring-tx-5.0.0.RELEASE.jar`:提供了事务管理功能,...

    Spring JdbcTemplate例子

    首先,JdbcTemplate的核心理念是通过预编译的SQL语句和参数绑定来防止SQL注入攻击,同时提供事务管理的支持。它提供了大量方法来执行各种数据库操作,如查询、更新、插入和删除等。 使用Spring JdbcTemplate的第一...

    Spring JdbcTemplate

    它抽象了数据库连接管理、事务控制等复杂过程,使代码更加简洁、易于测试。例如,`queryForList(String sql, Class&lt;T&gt; elementType)`方法用于执行SQL查询并返回一个对象列表,`update(String sql, Object... args)`...

    strut2+spring+springjdbctemplate做的简易登录系统

    Spring则是一个全面的后端框架,提供依赖注入、AOP(面向切面编程)、事务管理等功能;Spring JDBC Template是Spring提供的一个简化数据库操作的工具,它封装了JDBC的繁琐部分,让开发者可以更专注于业务逻辑。 在...

    Spring JdbcTemplate 常用方法整理

    Spring的JdbcTemplate是Spring框架中用于简化数据库操作的工具类,它是基于JDBC但又抽象出了一层,避免了直接与数据库驱动API交互,从而提高了代码的可读性和可维护性。本文将深入探讨Spring JdbcTemplate的常用方法...

    Spring JdbcTemplate查询实例

    Spring JdbcTemplate还提供了事务管理的支持。你可以使用`update`方法执行增删改操作,如果出现异常,Spring会自动回滚事务,保证数据的一致性。 5. **与MyBatis的对比** MyBatis是一个更全面的ORM框架,允许编写...

    注入JdbcTemplate启用事务管理.docx

    在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,特别是在复杂的系统中,确保数据的一致性和完整性至关重要。本文将详细讲解如何通过JdbcTemplate启用事务管理,并探讨事务的传播机制。 首先,我们要...

    spring jdbcTemplate 源码

    Spring JDBCTemplate还提供了事务管理支持。当开启事务时,它会捕获并处理数据库异常,根据异常类型决定回滚还是提交事务。这样,开发者无需手动处理这些细节,提高了代码的可读性和可靠性。 此外,JdbcTemplate对...

    spring的jdbcTemplate小案例

    它还支持事务管理,可以方便地与Spring的其他组件集成,如DataSource和TransactionManager。 在创建一个Spring的JdbcTemplate小案例时,我们需要完成以下几个步骤: 1. **配置DataSource**:首先,我们需要一个...

    Spring 学习 JdbcTemplate,模板模式,回调

    JdbcTemplate支持各种数据库操作,包括查询、更新、插入和删除,同时提供事务管理功能。 **2. 模板模式** 模板模式是一种设计模式,它定义了算法的骨架,允许子类在不改变算法结构的情况下重写特定步骤。在Spring中...

    Spring事务管理Demo

    2. **声明式事务管理**:这是Spring最常用的方式,通过在配置文件或者使用`@Transactional`注解来定义事务边界,使得事务管理与业务逻辑分离,降低了代码的耦合度。`@Transactional`注解可以应用于方法级别,表示该...

    使用Spring JDBCTemplate进行增删改查curd操作

    通过使用JdbcTemplate,开发者可以避免编写大量的重复代码,如手动管理连接、处理结果集等,从而专注于业务逻辑。本文将深入探讨如何利用Spring JdbcTemplate进行CURD(Create、Read、Update、Delete)操作。 1. ...

    Spring JdbcTemplate.batchUpdate 例子

    总之,`Spring JdbcTemplate.batchUpdate`是处理批量数据库操作的强大工具,它可以提高效率,减少与数据库的交互次数。然而,正确地使用它需要对事务管理、异常处理和性能优化有深入的理解。通过合理的配置和良好的...

Global site tag (gtag.js) - Google Analytics