8.spring:事务管理(上):Spring的数据库编程、编程式事务管理

本文内容纲要:8.spring:事务管理(上):Spring的数据库编程、编程式事务管理

Spring的数据库编程

Spring框架提供了JDBC模板模式------>JdbcTemplate

简化了开发,在开发中并不经常是使用

实际开发更多使用的是Hibernate和MyBatis

1).Spring JDBCp配置

如果使用Spring JDBC操作数据库,要有如下的配置:

在xml配置文件

<!-- 配置数据源:可以使用各种数据源如c3p0.... -->

<bean name="dataSource" 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/tx" />

<property name="username" value="root" />

<property name="password" value="1234" />

</bean>

<!-- 配置jdbc模块 -->

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<property name="dataSource" ref="dataSource"></property>

</bean>

配置JDBC模板需要将dataSource注入到jdbcTemplate

有时候也需要将JdbcTemplate注入到相应的Bean中可以使用:

@Autowired

private JdbcTemplate jdbcTemplate ;

2).JdbcTemplate 常用方法

--->public int update(String sql,Object args []):l=可以对数据库进行增加、修改、删除等操作...

--->public List query (String sql,RowMapper rowMapper,Object args[]):该方法执行对数据库的查询...

相关jar:

-logging

-mysql-connector-java-

-aop

-beans

-context

-core

-expression

-jdbc

tx

注:在dao方法中的操作可以使用*@Componment、@Respository、@Service、@controller进行对包扫描,使用@Autowire进行自动注入!*

3).测试:

新建数据库

数据库对应的实体类:

User.java

public class User {

private Integer id;

private String name;

private String pw;

//....

}

tx.xml

<!-- 配置数据源 -->

<bean name="dataSource" 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/tx" />

<property name="username" value="root" />

<property name="password" value="1234" />

</bean>

<!-- 配置jdbc模块 -->

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<property name="dataSource" ref="dataSource"></property>

</bean>

测试:

public ApplicationContext getapp(){

return new

ClassPathXmlApplicationContext("tx.xml");

}

//增删改....

@Test

public void test1(){

JdbcTemplate jdbcTemplate = (JdbcTemplate) getapp().getBean("jdbcTemplate");

System.out.println(jdbcTemplate);

Object a [] = {4,"user4","pwd4"};

Object b [] = {5,"user5","pwd5"};

String sql = "insert into user values(?,?,?)";

//添加用户

jdbcTemplate.update(sql, a);

jdbcTemplate.update(sql, b);

//查询

sql = "select * from user";

RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);

List<User> users = jdbcTemplate.query(sql, rowMapper, null);

for(User user : users){

System.out.println(user);

}

}

编程式事务管理

1).基于底层API的编程式事务管理

基于底层API的编程式事务管理就是根据PlatformTransactionManager、TransactionDefinition和

TransactionStatus几个核心接口,通过编程的方式解决来进行事务处理。

需要在spring的配置文件中:

<!-- 配置数据源 -->

<bean name="dataSource" 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/tx" />

<property name="username" value="root" />

<property name="password" value="1234" />

</bean>

<!-- 配置jdbc模块 -->

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<property name="dataSource" ref="dataSource"></property>

</bean>

<!-- 为数据源添加事物管理 -->

<bean id="dataSourceTransactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"></property>

</bean>

test

//事务管理...

@Test

public void test2(){

JdbcTemplate jdbcTemplate = (JdbcTemplate) getapp().getBean("jdbcTemplate");

//事物管理器

DataSourceTransactionManager tx = (DataSourceTransactionManager) getapp().getBean("dataSourceTransactionManager");

//默认事物定义,隔离级别、传播行为....

TransactionDefinition tf = new DefaultTransactionDefinition();

//开启事物

TransactionStatus ts = tx.getTransaction(tf);

     String res = tx(jdbcTemplate, tx, tf, ts);

System.out.println(res);

}

public String tx(JdbcTemplate jdbcTemplate,DataSourceTransactionManager tx,

TransactionDefinition tf,TransactionStatus ts){

String msg = "执行成功,没有事物回滚!";

try{

Object a [] = {2,"user2","pwd2"};

String sql = "insert into user values(?,?,?)";

//添加用户

//主键重复

jdbcTemplate.update(sql, a);

//提交事务

tx.commit(ts);

}catch(Exception e){

//出现异常,事物回滚

tx.rollback(ts);

msg= "主键重复!!!";

e.printStackTrace();

}

return msg;

}

以上的这种操作会让事物处理的代码散落在业务逻辑代码中,破坏了原有代码的条理性,并且让每一个业务方法都包含了

类似启动事物、提交以及回滚事务的样板式代码。

TransactionTemplate的execute方法有一个TransactionCallback接口类型的参数,该接口定义了doInTransaction方法、通常

以匿名内部类的方式实现TransactionCallback接口,在doInTransaction方法中写业务逻辑代码

public T doInTransaction(TransactionStatus arg0)

TransactionStatus类型参数、可以在方法的任何位置调用该参数方法的setRollbackOnly方法将事务标识为回滚、以执行事务回滚

根据默认规则:

如果在执行回调方法过程中如果抛出未检查异常或者显示调用setRollbackOnly方法,则回滚事物

如果事务执行完成或抛出了checked类型的异常,则提交事务

代码待完成......

本文内容总结:8.spring:事务管理(上):Spring的数据库编程、编程式事务管理

原文链接:https://www.cnblogs.com/Mrchengs/p/10099782.html

以上是 8.spring:事务管理(上):Spring的数据库编程、编程式事务管理 的全部内容, 来源链接: utcz.com/z/362795.html

回到顶部