spring管理jdbc事务的Demo代码
发布网友
发布时间:2022-04-07 20:36
我来回答
共2个回答
热心网友
时间:2022-04-07 22:06
我提供一个实例:
数据库是MYSQL , 数据源是C3P0 ,
-----------
1) 建表语句 :
----------------
DROP TABLE IF EXISTS book ;
CREATE TABLE book(
id int(11) NOT NULL auto_increment COMMENT 'primary key',
name varchar(60) default NULL COMMENT 'book name',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='my book table';
----------------
注意了,在MYSql 中 表的引擎一定要用InnoDB ,如果用MyISAM 的话,是不支持事务的。
2) JAVA Bean
Book.java
-------------------
package com.spring.demo.bean;
import java.io.Serializable;
public class Book implements Serializable {
public Book(){}
public Book(String name){
this.name = name;
}
/**
* ID
*/
private Integer id ;
/**
* 书名
*/
private String name ;
// getter and setter
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;
}
}
-------------------
3)Book.xml 配置
---------------------
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"">
<sqlMap namespace="Book" >
<typeAlias alias="book" type="com.spring.demo.bean.Book"/>
<resultMap id="result_map_book" class="book" >
<result property="id" column="id" javaType="integer"/>
<result property="name" column="name" javaType="string"/>
</resultMap>
<insert id="insertBook" parameterClass="book">
insert book(name) values(#name#)
</insert>
<update id="updateBook" parameterClass="book">
update book set name=#name# where id=#id#
</update>
<delete id="deleteBook" parameterClass="int">
delete from book where id=#value#
</delete>
<select id="selectBookById" parameterClass="int" resultMap="result_map_book">
select id , name from book where id=#value#
</select>
<select id="selectBookByName" parameterClass="string" resultMap="result_map_book">
select id , name from book where name like #value#
</select>
</sqlMap>
---------------------
4)spring 的 applicationContext.xml
---------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "">
<beans>
<!-- 引入参数配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>jdbc.properties</value>
</list>
</property>
</bean>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass"><value>$</value></property>
<property name="jdbcUrl"><value>$</value></property>
<property name="user"><value>$</value></property>
<property name="password"><value>$</value></property>
<property name="initialPoolSize"><value>$</value></property>
<property name="minPoolSize"><value>$</value></property>
<property name="maxPoolSize"><value>$</value></property>
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<!-- 事务代理*的配置 -->
<bean id="baseTransactionProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- ibatis sqlMapClient 配置 -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:sqlMapConfig.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!-- 配置 -->
<bean id="ibatis_BookDao" class="com.spring.demo..Ibatis_BookDao">
<property name="sqlMapClient" >
<ref bean="sqlMapClient"/>
</property>
</bean>
<!-- 添加了事务的管理类 -->
<bean id="ibatis_BookManager" parent="baseTransactionProxy">
<property name="target">
<bean class="com.spring.demo.manager.Ibatis_BookManager">
<property name="">
<ref bean="ibatis_BookDao"/>
</property>
</bean>
</property>
</bean>
</beans>
---------------
5) 数据源参数配置文件:jdbc.properties
:
------------
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springdemo?useUnicode=true&characterEncoding=utf-8
jdbc.user=root
jdbc.password=root
jdbc.initialPoolSize=1
jdbc.minPoolSize=1
jdbc.maxPoolSize=10
------------
6) IBATIS 的初始化配置 sqlMapConfig.xml
------------
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"">
<sqlMapConfig>
<settings useStatementNamespaces="true" />
<sqlMap resource="com/spring/demo/bean/Book.xml"/>
</sqlMapConfig>
------------
配置完毕,下面是DAO 和 测试方法:
Ibatis_BookDao.java
----------------
package com.spring.demo.;
import java.util.List;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import com.spring.demo.bean.Book;
public class Ibatis_BookDao extends SqlMapClientDaoSupport {
/**
* 添加一本书
* @param book
*/
public void insertBook(Book book){
this.getSqlMapClientTemplate().insert("Book.insertBook", book);
}
/**
* 修改一本书
* @param book
*/
public void updateBook(Book book){
this.getSqlMapClientTemplate().update("Book.updateBook", book);
}
/**
* 根据ID来删除一本书
* @param id
*/
public void deleteBook(Integer id){
this.getSqlMapClientTemplate().delete("Book.deleteBook", id);
}
/**
* 根据ID来查询书对象
* @param id
* @return
*/
public Book selectBookById(Integer id){
return (Book)this.getSqlMapClientTemplate().queryForObject("Book.selectBookById", id);
}
/**
* 根据书名来查询相关*录列表
* @param name
* @return
*/
public List selectBookByName(String name){
return this.getSqlMapClientTemplate().queryForList("Book.selectBookByName", "%"+name+"%" );
}
}
----------------
Ibatis_BookManager.java
-------------------
package com.spring.demo.manager;
import java.util.List;
import com.spring.demo.bean.Book;
import com.spring.demo..Ibatis_BookDao;
public class Ibatis_BookManager {
private Ibatis_BookDao = null ;
/**
* 批量添加书本,如果列表长度超过3,就抛出异常
* @param books
*/
public void insertBooks(List books){
for(int i=0 ; i<books.size() ;i++){
if(i>2){
System.out.println("列表太长,中断事务");
throw new RuntimeException("中断事务异常,当列表长度大于3的时候故意抛出,看看事务是否回滚");
}
Book book = (Book)books.get(i);
.insertBook(book);
}
}
/**
* 添加一本书
* @param book
*/
public void insertBook(Book book){
this..insertBook(book);
}
/**
* 修改一本书
* @param book
*/
public void updateBook(Book book){
this..updateBook(book);
}
/**
* 根据ID来删除一本书
* @param id
*/
public void deleteBook(Integer id){
this..deleteBook(id);
}
/**
* 根据ID来查询书对象
* @param id
* @return
*/
public Book selectBookById(Integer id){
return this..selectBookById(id);
}
/**
* 根据书名来查询相关*录列表
* @param name
* @return
*/
public List selectBookByName(String name){
return this..selectBookByName(name);
}
// getter and setter //
public Ibatis_BookDao getDao() {
return ;
}
public void setDao(Ibatis_BookDao ) {
this. = ;
}
-------------------
测试类:
IbatisDemo.java
------------------
package com.spring.demo;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.demo.bean.Book;
import com.spring.demo.manager.Ibatis_BookManager;
import com.spring.demo.manager.Jdbc_BookManager;
public class IbatisDemo {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml") ;
Ibatis_BookManager manager = (Ibatis_BookManager)context.getBean("ibatis_BookManager");
List books = new ArrayList();
books.add(new Book("book_10"));
books.add(new Book("book_11"));
books.add(new Book("book_12"));
books.add(new Book("book_13"));
manager.insertBooks(books);
System.out.println("OK");
}
}
------------------
说明:MYSQL 的事务完整性我是测试过的。
之前有个朋友吧数据库换成 SQL SERVER 的时候事务完整性就出现问题。
这个问题有待研究。
追问你用的是ibatis,虽然不是我想要的,但是我没有验证你说的mysql支持事务的问题,我回去验证一下,如果是这样的话,谢谢了。
-------------------------
回去试验了,不是这的事
热心网友
时间:2022-04-07 23:24
应用了jdbc.properties文件 ,我自己测试,没有问题,而且是spring配置式事务的。 需要JAR包 spring.jar c3p0.jar mysql.jar cglib.jar asm.jar antlr.追问能不能回答的具体点,谢谢了
spring-data-jdbc的基础使用(一)
运行demo,通过默认方法执行基本操作。当默认方法无法满足需求时,我们可以通过关键字来编写查询方法,无需手动编写SQL语句,支持复合查询等特性。此外,还支持@Query注解自定义查询。在需要进行修改或删除操作时,添加@Modifying注解,简化SQL语句的编写。引入生命周期的事件机制,利用ApplicationListener监听操作,...
Spring系列之spring中编程式事务怎么用的?
代码中会用到JdbcTemplate,对这个不理解的可以看一下:JdbcTemplate使用详解@Testpublic void test1() throws Exception {//定义一个数据源org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.set...
Spring针对事务处理提供哪两种事务编程模式。
Spring提供两种方式的编程式事务管理,分别是:使用TransactionTemplate和直接使用PlatformTransactionManager。1.TransactionTempale采用和其他Spring模板,如JdbcTempalte和HibernateTemplate一样的方法。它使用回调方法,把应用程序从处理取得和释放资源中解脱出来。如同其他模板,TransactionTemplate是线程安全的。代码片段...
Spring6 的JdbcTemplate的JDBC模板类的详细使用说明
配置 spring.xml 文件,引入 JdbcTemplate 类,并注入 DataSource 数据源,用于连接数据库。自定义数据源类,实现 javax.sql.DataSource 接口,重写 getConnection 方法,用于获取数据库连接。将数据源配置到 JdbcTemplate 中。通过 JdbcTemplate 可以实现增删改查数据库的基本操作。例如,使用 update 方法插...
jdbctemplate在哪个包
使用JdbcTemplate可以大大减少数据库操作的复杂性,并且避免手动编写繁琐的代码。通过JdbcTemplate,开发者可以更方便地进行数据库查询、更新、插入和删除等操作。此外,JdbcTemplate还提供了异常处理和事务管理的功能,提高了数据库操作的可靠性和安全性。因此,在Spring框架中,当需要进行数据库操作时,通常会...
spring事务的特性?
当具体的数据库操作中有一个发生异常,那么整个事务就回滚,所有的增删改操作都将无效。而spring配置式事务要达到的效果是:1,对指定的类的方法添加事务,2,配置管理,不需要每个数据库造作都像上面一样写那么多代码,3,spring的配置式事务可以吧多个操作数据库的方法配置在一个事务中,这样灵活性更加...
spring配置jdbc事务管理不起作用
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>1234 修改spring-mybatis.xml <!-- 配置事务管理器 --> <bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property...
java spring+hibernate+dorado框架 如何对事务进行管理
用Spring的事务管理, 在你的Spring 的配置文件中注入TxManager <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> 然后用AOP 处理你的事务 或者直接用annotation 在配置文件中加入 <tx:...
Spring JdbcTemplate事务管理器内存泄漏问题,怎么解决
Spring JdbcTemplate事务管理器内存泄漏问题,怎么解决 <bean id="mysqlTransactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributes"> <props> <prop key="find*...
spring 两个数据源 怎么配事务
然后定义JTA事务如下:<bean id="transactionManager-xa"class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value="java:/TransactionManager" /> </bean> 通过声明式事务模板(代理),指定目标类的特定方法采用JTA事务:<bean class="org.spring...