Spring数据库编程及事务管理

Spring 数据库编程

数据库编程是互联网编程的基础。

Spring提供了JDBC模版模式:jdbcTemplates。Spring虽然自带JDBC,但是开发当中往往使用Hibernate和MyBatis。

Spring JDBC模块使用需要进行dataSource进行相关配置。

<beans>
	<!--配置数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriveManger-DataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
	</bean>
    <!--配置JDBC模版-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

使用时,可直接依赖注入然后进行jdbcTemplate的使用。

常用方法:

  1. update
  2. query
@Repository
public TestDaoImpl implements testDao{
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    public void funtion(){
        String sql = "sql语句 以 ? 进行参数指定";
        
        Object param[] = {};
        
        // 增加,修改,删除
        jdbcTemplate.update(sql,param);
        
        // 查询
        RowMapper<T> rowMapper = new BeanPropertyRowMapper<T>(T.class);
        jdbcTemplate.query(sql,rowMapper,param);
    }
}


Spring 事务管理

编程式事务管理

在代码当中 显 式 的 使用beginTransaction、commit、rollback、等与事务相关的方法。

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

都要进行事务管理器的配置等等,了解一下。

声明式事务管理

编程式事务管理往大了的说不适合在多数的事务管理中使用,存在大量的代码冗余。Spring声明式事务管理主要是利用AOP进行实现。

本质上是在方法前后进拦截,开始前进行事务开启,根据执行情况 进行事务执行提交或回滚。

优点在于:无需像编程式事务管理那样在业务逻辑中掺杂事务管理的代码,业务代码不被污染,方便后期维护。

缺点就是事务的控制粒度只能到达方法级,不能像编程式那种达到代码块级别。

Spring 声明式事务管理:

  1. 基于XML
  2. 基于注解@Transactionall

XML配置

<!--指定要扫描的包-->
...
<!--配置数据源-->
...
<!--配置JDBC模版-->
...
<!--配置事务管理器-->
<bean id="txManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置通知声明事务-->
<tx:adivce id="myAdivce" transaction-manger="txManger">
    <tx:attributes>
    	<tx:method name="*"/>
    </tx:attributes>
</tx:adivce>
<!--配置AOP-->
<aop:config>
	<aop:pointcut id="txPointCut" expression="execution()"/>
    <aop:advisor advice-ref="myAdivce" pointcut-ref="txPointCut"/>
</aop:config>

基于注解的方式,@Transactional 可以作用与接口、接口方法、类、类方法。

作用于类上时,该类的public方法都将具有该类型的事务,不建议在接口和接口方法上进行注解使用,因为该注解只有使用基于接口的代理时会生效。

当不想在某个异常下事务处理时

// 不对RuntimeException回滚生效
@Transactional(rollbackFor=RuntimeException.class)

// 所有Exception
@Transactional(rollbackFor=Exception.class)

同时需要在xml配置中进行事务注解的支持

...
<!--配置事务管理器-->
...
<!--开启事务管理器注解-->
<tx:annotation-driven transaction-manger="txManger" />


奖励一下