首页 > 其他分享 >spring jdbc 声明式事务

spring jdbc 声明式事务

时间:2023-04-26 19:32:41浏览次数:38  
标签:事务 jdbc spring springframework user org import springjdbc public


Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中申明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。



公共类:

package springjdbc;

public interface IUserDao {
	void insertUser(User user);
}



package springjdbc;

public class User {
	private String username;
	private int age;

	public User(String username, int age) {
		this.username = username;
		this.age = age;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}



xml方式

package springjdbc.transactions.declarative.xml;

import java.sql.Types;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

import springjdbc.IUserDao;
import springjdbc.User;

public class UserDao implements IUserDao {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	public void insertUser(User user) {
		String sql = "insert into tb_user (id, user_name, user_age) values (1, ?, ?)";
		Object[] params = new Object[] { user.getUsername(), user.getAge(), };
		int[] types = new int[] { Types.VARCHAR, Types.INTEGER, };
		jdbcTemplate.update(sql, params, types);
		jdbcTemplate.update(sql, params, types);
	}

}




springjdbc/transactions/declarative/xmlContext.xml:


<?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:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
	<context:annotation-config />
	
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="insert*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>
	<aop:config>
		<aop:pointcut id="userDaoTxPointcut" expression="execution(* springjdbc.IUserDao.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="userDaoTxPointcut" />
	</aop:config>
	 
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL" />
		<property name="username" value="HIBERNATE" />
		<property name="password" value="HIBERNATE" />
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
	</bean>
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<bean id="userDao" class="springjdbc.transactions.declarative.xml.UserDao">
		<property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>

</beans>




测试类:

package springjdbc.transactions.declarative;

import java.util.Random;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import springjdbc.IUserDao;
import springjdbc.User;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("xmlContext.xml")
public class TestXml {
	
	@Autowired
	ApplicationContext context;
	
	@Test
	public void test() throws Exception {
		Random random = new Random();
		IUserDao dao = context.getBean("userDao", IUserDao.class);
		int id = random.nextInt(100);
		User user = new User("user" + id, id);
		dao.insertUser(user);
	}

}




运行test,会报错,没有插入数据。


annotation方式

package springjdbc.transactions.declarative.annotation;

import java.sql.Types;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Transactional;

import springjdbc.IUserDao;
import springjdbc.User;

@Transactional
public class UserDao implements IUserDao {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	public void insertUser(User user) {
		String sql = "insert into tb_user (id, user_name, user_age) values (1, ?, ?)";
		Object[] params = new Object[] { user.getUsername(), user.getAge(), };
		int[] types = new int[] { Types.VARCHAR, Types.INTEGER, };
		jdbcTemplate.update(sql, params, types);
		jdbcTemplate.update(sql, params, types);
	}

}




springjdbc/transactions/declarative/annotationContext.xml:


<?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:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
	<context:annotation-config />
	
	<tx:annotation-driven  transaction-manager="transactionManager"/>
	 
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	 
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL" />
		<property name="username" value="HIBERNATE" />
		<property name="password" value="HIBERNATE" />
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
	</bean>
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<bean id="userDao" class="springjdbc.transactions.declarative.annotation.UserDao">
		<property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>

</beans>




测试类:

package springjdbc.transactions.declarative;

import java.util.Random;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import springjdbc.IUserDao;
import springjdbc.User;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("annotationContext.xml")
public class TestAnnotation {
	
	@Autowired
	ApplicationContext context;
	
	@Test
	public void test() throws Exception {
		Random random = new Random();
		IUserDao dao = context.getBean("userDao", IUserDao.class);
		int id = random.nextInt(100);
		User user = new User("user" + id, id);
		dao.insertUser(user);
	}

}




会报错,数据库里没有插入数据。





标签:事务,jdbc,spring,springframework,user,org,import,springjdbc,public
From: https://blog.51cto.com/u_1002776/6228675

相关文章

  • SpringSecurity从入门到精通:认证成功处理器&认证失败处理器
    认证成功处理器  认证失败处理器  ......
  • C# abp中EfCore执行原生sql和事务操作
    ef自带的方法是没有执行原生sql的,必须在仓储实现类中注入dbContextProvider、然后就可以使用FromSqlRaw查询,ExecuteSqlRawAsync执行新增、修改、删除,efcore方法都是自带事务的,有时候我们想在自己的业务逻辑中嵌入事务,就使用CreateExecutionStrategy创建事务操作:publicclassAcc......
  • java连接jdbc-mssql数据库
    packagecom.swift.erp;importjava.sql.SQLException;importjava.sql.Statement;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;publicclassAPP{//引入sqljdbc.jarpublicstaticvoidmain(String[]args......
  • Django进阶:事务操作、悲观锁和乐观锁
    Django进阶:事务操作、悲观锁和乐观锁参考网址https://zhuanlan.zhihu.com/p/372957129事务处理(transaction)对于Web应用开发至关重要,它可以维护数据库的完整性,使整个系统更加安全。比如用户A通过网络转账给用户B,数据库里A账户中的钱已经扣掉,而B账户在接收过程中服务器......
  • [转]前端传嵌套对象参数给spring mvc
    在使用springmvc开发web应用时,感觉springmvc的controller方法能自动将参数注入到方法的参数对象中,极大的方便了开发。但是,在遇到有嵌套对象的时候,比如订单对象有个属性是用户对象,就不好处理了。一种情况是,传递的参数都是作为post方法的请求体,我们可以用RequestBody注解。但是当条......
  • SpringSecurity从入门到精通:其他权限校验方法&自定义权限校验方法
    其他权限校验方法我们前面都是使用@PreAuthorize注解,然后在在其中使用的是hasAuthority方法进行校验。SpringSecurity还为我们提供了其它方法例如:hasAnyAuthority,hasRole,hasAnyRole等。​这里我们先不急着去介绍这些方法,我们先去理解hasAuthority的原理,然后再去学......
  • 5.spring 中的 bean 是线程安全的吗?
    https://www.mianshigee.com/question/10477vxbhttps://www.zhihu.com/pin/1365332853371297792  ......
  • 4.Spring中IOC创建对象的两种方式和创建时机
    https://blog.csdn.net/jike11231/article/details/116357864 创建时机1:默认的在Spring容器启动的时候2:在getBean的时候创建对象(就是拿到配置文件中的标识符的时候创建对象)在Spring的配置文件bean中有一个属性lazy-init=“default/true/false”(1)如果lazy-init为"default/f......
  • spring heapdump泄露 heapdump_tool.jar
    https://github.com/wyzxxz/heapdump_tool heapdump_tool声明:此工具仅用于企业安全人员自查验证自身企业资产的安全风险,或有合法授权的安全测试,请勿用于其他用途,如有,后果自负。下载地址:https://toolaffix.oss-cn-beijing.aliyuncs.com/wyzxxz/20230425/heapdump_tool.jar+20......
  • SpringSecurity从入门到精通:从数据库查询权限信息&自定义失败处理
    从数据库查询权限信息      记得打开redis      自定义失败处理我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json,这样可以让前端能对响应进行统一的处理。要实现这个功能我们需要知道SpringSecurity......