【j2ee spring】7、spring与数据库的连接的操作事务管理

spring与数据库的连接的操作事务管理1、首先我们的知道spring管理事务的方式有两种

还是一种是以注解的方式

在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。

Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked

如果遇到checked意外就不回滚。1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class) 2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class) 3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

在整个方法运行前就不会开启事务还可以加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样就做成一个只读事务,可以提高效率。

各种属性的意义:

REQUIRED:

业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。

NOT_SUPPORTED:

声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。

REQUIRESNEW:

不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。

MANDATORY:

该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。

SUPPORTS:

该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。

NEVER:

该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。

NESTED:

如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务 拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。

还有一种是基于xml文档的配置方式,等会我们会对他进行相应的说明和使用测试

2、编写程序来进行相应的xml文档配置的方式理解spring的事务管理

首先我们需要的一些类和文档,还有数据库,我这里使用的MySQL

结构图:

我们一个个地写:

Person.java

/** * 功能:实现spring与jdbc的连接 * 时间:2015年3月26日21:09:20 * author:cutter_point */package cn.cutter_point.bean;public class Person {private Integer id;private String name;public Person() {}//默认构造函数public Person(String name){this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

接口PersonService.java

/** * 功能:实现spring与jdbc的连接 * 时间:2015年3月26日21:09:20 * author:cutter_point */package cn.cutter_point.service;import java.util.List;import cn.cutter_point.bean.Person;public interface PersonService {/** * 保存person * @param person */public void save(Person person);/** * 更新person * @param person */public void update(Person person);/** * 根据id获取person * @param personid * @return */public Person getPerson(Integer personid);/** * 获取所有的person * @return */public List<Person> getPersons();/** * 删除指定的person根据id号 * @param personid */public void delete(Integer personid);}

回调函数PersonRowMapper.java

/** * 功能:实现spring与jdbc的连接 * 时间:2015年3月26日21:09:20 * author:cutter_point */package cn.cutter_point.service.impl;import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.jdbc.core.RowMapper;import cn.cutter_point.bean.Person;public class PersonRowMapper implements RowMapper {@Override//这个类在调用的时候外面已经做了//类似if(rs.next)的操作了,所以这里就不用这么做了public Object mapRow(ResultSet rs, int index) throws SQLException {//这里面我们把查询到的结果返回Person person = new Person(rs.getString("name"));person.setId(rs.getInt("id"));return person;}}

事务bean文件PersonServiceBean.java

/** * 功能:实现spring与jdbc的连接 * 时间:2015年3月26日21:09:20 * author:cutter_point */package cn.cutter_point.service.impl;import java.util.List;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;import cn.cutter_point.bean.Person;import cn.cutter_point.service.PersonService;public class PersonServiceBean implements PersonService {//private DataSource dataSource;//这里我们使用spring里面的一个类容器JdbcTemplate jdbcTemplate;public PersonServiceBean() {}/** * 设置数据源 * @param dataSource */public void setDataSource(DataSource dataSource){this.jdbcTemplate = new JdbcTemplate(dataSource);}@Overridepublic void save(Person person) {// TODO Auto-generated method stubjdbcTemplate.update("insert into person(name) values (?)", new Object[]{person.getName()}, new int[]{java.sql.Types.VARCHAR}); }@Overridepublic void update(Person person) {// TODO Auto-generated method stubjdbcTemplate.update("update person set name=? where id = ?", new Object[]{person.getName(), person.getId()},new int[]{java.sql.Types.VARCHAR, java.sql.Types.INTEGER});}@Overridepublic Person getPerson(Integer personid) {// TODO Auto-generated method stubreturn (Person) jdbcTemplate.queryForObject("select * from person where id = ?", new Object[]{personid},new int[]{java.sql.Types.INTEGER}, new PersonRowMapper());}@Override@SuppressWarnings("unchecked")//这个注解的作用是取消未检查的转换时的警告,吧这个警告取消掉public List<Person> getPersons() {return (List<Person>)jdbcTemplate.query("select * from person", new PersonRowMapper());}@Overridepublic void delete(Integer personid) {jdbcTemplate.update("delete from person where id = ?", new Object[]{personid}, new int[]{java.sql.Types.INTEGER});jdbcTemplate.update("delete from personxxx where id = ?", new Object[]{personid}, new int[]{java.sql.Types.INTEGER});}}这里我说明一下里面的一个注解的作用:

@SuppressWarnings人生难免遇风雨,天空晴朗有阴云,别因雨水湿透衣衫而难过,

【j2ee spring】7、spring与数据库的连接的操作事务管理

相关文章:

你感兴趣的文章:

标签云: