zoukankan      html  css  js  c++  java
  • [Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction

    1.Spring中的数据库支持
    把具有相同功能的代码模板抽取到一个工具类中。
    2.关于jdbc template的应用
    jdbcTemplate模板操作类,把访问jdbc的模板抽取到template中,使用模板类,可以不用管有关连接管理,关闭等细节,只关注核心业务代码,外围事情交给 Spring的模板去处理。
    3.Spring框架关于对数据库的支持
    A、统一的事务平台trasaction Management

    B、提供Dao support,support封装了有关template.
    public class SpringJdbcTemplateBestSupport extends JdbcDaoSupport implements IpersonDao {
    public void save(Person p) {
    //使用spring的jdbc Mapping工具,简化jdbc的调用
    String sql = "insert into person(name,age) values('" + p.getName() + "'," + p.getAge() + ")";
    System.out.println("save:" + sql);
    getJdbcTemplate().update(sql);
    }
    }

    C、提供对jdbc Mapping工具,简化了jdbc的调用 。
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public List<Person> loadAll() {
    return getJdbcTemplate().query("select * from person", new RowMapper() {
    public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
    Person person = new Person();
    person.setId(rs.getLong("id"));
    person.setAge(rs.getInt("age"));
    person.setName(rs.getString("name"));
    return person;
    }
    });
    }

    D、把数据访问异常统一 封装起来。DataAccessException
    E、整合其它ormapping框架


    四、事务处理
    1.事务概述
    atomic(原子性):要么发生,要么都不发生
    consistent(一致性):数据应该不被破坏 两个人同时访问数据库,其中一个人对数据库进行了操作,另一个人看到的数据应当保持刚开始的状态,不受到影响。
    isolate(隔离性):用户间操作不相混淆
    Durable(持久性):永久保存,例如保存到数据库等
    jdbc事务的调用
    Connection conn;
    conn.setAutoCommit(false);
    操作1.。
    操作2.。
    conn.commit();
    hiberante
    session.save(...);
    tx.commit();

    基于Spring操作事务的应用方式,编程式事务/声明式事务

    2.Spring中的事务管理API

    1)PlatformTransactionManager 事务管理器接口
    TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

    2)TransactionStatus 事务状态
    isNewTransaction() 是否是新事务
    hasSavepoint() 保存点,oracle
    void flush();刷新

    3.声明式事务管理使用----基于xml
    把事务控件有关的操作在配置文件中进行说明,代码中不要任何事务控制的代码

    Spring中事务的传播:REQUIRED(需要事务,对会引起数据更新的方法)/SUPPORTSA(支持事务,对于查询类的就
    去)
    <!-- 配置事务 -->
    <!-- 配置一个事务管理器 -->
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="mydataSource"></property>
    </bean>

    <!-- 配置事务通知 -->
    <tx:advice id="transferServieAdvice" transaction-manager="transactionManager">
    <!-- 事务属性 -->
    <tx:attributes>
    <tx:method name="transferMoney" propagation="REQUIRED" />
    <tx:method name="saveMoney" propagation="REQUIRED" />
    <tx:method name="takeMoney" propagation="REQUIRES_NEW" />
    <!-- 查询类的方法用下面的配置 ,不用强制开事务,则可以提升性能 -->
    <tx:method name="*" propagation="SUPPORTS" read-only="true" />
    <!-- <tx:method name="*" propagation="REQUIRED" />
    --> </tx:attributes>
    </tx:advice>
    <aop:config>
    <!-- 增强,对哪一些切一点(pointcut)进行什么样(advice-ref)的事务增强。 -->
    <aop:advisor advice-ref="transferServieAdvice" pointcut="execution(* com.amos..*
    (..))" />
    </aop:config>

    4.声明式事务管理使用----基于注解
    1)在配置文件 中告诉spring通过注解去扫描业务Bean的事务配置信息。

    <!-- 配置事务 -->
    <!-- 配置一个事务管理器 -->
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="mydataSource"></property>
    </bean>


    <!-- 表示事务的配置均在注解中 -->
    <tx:annotation-driven/>
    2)、写业务Bean时,在需要开启事务的Bean上或者方法使用@Transactional标签来指定事务配置的特性。
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void saveMoney(String name, Double money) {
    ......
    }

    @Transactional(propagation=Propagation.SUPPORTS)
    public void takeMoney(String name, Double money) {
    ......
    }

    事务是定义在业务层!hibernate中把事务写在持久层会导致许多问题。

    代码实现可参考https://github.com/amosli/lspring_jdbc.git

  • 相关阅读:
    c语言基础学习10_文件操作02
    c语言_文件操作_FILE结构体小解释
    初识 Swift编程语言(中文版)
    Jquery滑动门实现
    【一步一步走(1)】远程桌面软件VNC的安装与配置
    并查集 路径压缩(具体解释)
    linux中操作java进程
    HDOJ 3944 DP?
    选择排序与冒泡排序
    UVa145 Gondwanaland Telecom
  • 原文地址:https://www.cnblogs.com/amosli/p/3448809.html
Copyright © 2011-2022 走看看