Spring jdbc及事务

  1. Spring的IOC的注解开发
    1. 注解的入门
      1. 引入aop的包
      2. 引入context约束
        1. <context:component-scan />
        2. <context:annotation-config />
      3. 使用注解开发
        1. @Component          :定义Bean
          1. @Controller    WEB
          2. @Service         Service
          3. @Repository   DAO
        2. 属性注入:
          1. 普通属性        @Value
          2. 对象属性        @Resource
            1. @Autowired   :按类型注入属性,按名称@Qulifier
    2. XML方式和注解方式比较
      1. XML方式        :适用性更广,结构更加清晰。
      2. 注解方式        :适用类是自己定义,开发更方便。
    3. XML和注解的整合开发
      1. XML定义一些工具类和配置的属性
      2. 注解属性注入
  2. Spring的AOP的基于AspectJ的XML的开发
    1. AOP的概述
      1. AOP:面向切面编程,是OOP的扩展和延伸,是用来解决OOP遇到问题。
    2. Spring的AOP
      1. 底层的实现
        1. JDK的动态代理
        2. Cglib的动态代理
      2. AOP的相关术语
        1. 连接点:可以被拦截的点。
        2. 切入点:真正被拦截的点。
        3. 通知:增强方法
        4. 引介:类的增强
        5. 目标:被增强的对象
        6. 织入:将增强应用到目标的过程。
        7. 代理:织入增强后产生的对象
        8. 切面:切入点和通知的组合
      3. AOP的入门开发
        1. 引入jar包
        2. 编写目标类并配置
        3. 编写切面类并配置
        4. 进行aop的配置

<aop:config>

        <aop:pointcut expression=”execution(表达式)” id=”pc1”/>

<aop:aspect >

        <aop:before method=”” pointcut-ref=”pc1”/>

</aop:aspect>

</aop:config>

      1. 通知类型
        1. 前置通知
        2. 后置通知
        3. 环绕通知
        4. 异常抛出通知
        5. 最终通知
      2. 切入点表达式写法
      3. Spring的JDBC的模板的使用
          1. Spring的JDBC的模板
      4. Spring是EE开发的一站式的框架,有EE开发的每层的解决方案。Spring对持久层也提供了解决方案:ORM模块和JDBC的模板

        Spring提供了很多的模板用于简化开发:

            1. JDBC模板使用的入门
      5. 创建项目,引入jar包
        1. 引入基本开发包:
        2. 数据库驱动
        3. Spring的JDBC模板的jar包
            1. 创建数据库和表
      6. create database spring5_day06;

        use spring5_day06;

        create table account(

            id int primary key auto_increment,

            name varchar(20),

            money double

        );

            1. 使用JDBC的模板:保存数据
      7.  

          1. 将连接池和模板交给Spring管理
            1. 引入Spring的配置文件
            1. 使用Jdbc的模板
      8. 引入spring_aopjar
          1. 使用开源的数据库连接池:
            1.  druid的使用
        • DRUID介绍

            DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0DBCPPROXOOLDB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池(据说是目前最好的连接池,不知道速度有没有BoneCP)

         

        • 配置参数

        和其它连接池一样DRUIDDataSource类为:com.alibaba.druid.pool.DruidDataSource,基本配置参数如下:

         

        配置

        缺省值

        说明

        name

         

        配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。 
        如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this)

        jdbcUrl

         

        连接数据库的url,不同数据库不一样。例如: 
        mysql : jdbc:mysql://10.20.153.104:3306/druid2 
        oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto

        username

         

        连接数据库的用户名

        password

         

        连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter

        driverClassName

        根据url自动识别

        这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName(建议配置下)

        initialSize

        0

        初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection

        maxActive

        8

        最大连接池数量

        maxIdle

        8

        已经不再使用,配置了也没效果

        minIdle

         

        最小连接池数量

        maxWait

         

        获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。

        poolPreparedStatements

        false

        是否缓存preparedStatement,也就是PSCachePSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。

        maxOpenPreparedStatements

        -1

        要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在OraclePSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100

        validationQuery

         

        用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuerynulltestOnBorrowtestOnReturntestWhileIdle都不会其作用。

        testOnBorrow

        true

        申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

        testOnReturn

        false

        归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能

        testWhileIdle

        false

        建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。

        timeBetweenEvictionRunsMillis

         

        有两个含义: 
        1) Destroy
        线程会检测连接的间隔时间2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明

        numTestsPerEvictionRun

         

        不再使用,一个DruidDataSource只支持一个EvictionRun

        minEvictableIdleTimeMillis

         

         

        connectionInitSqls

         

        物理连接初始化的时候执行的sql

        exceptionSorter

        根据dbType自动识别

        当数据库抛出一些不可恢复的异常时,抛弃连接

        filters

         

        属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 
        监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall

        proxyFilters

         

        类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filtersproxyFilters,是组合关系,并非替换关系

         

         

      9. 引入jar包
      10. <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->

        <dependency>

            <groupId>com.alibaba</groupId>

            <artifactId>druid</artifactId>

            <version>1.1.10</version>

        </dependency>

      11. 配置druid连接池
      12.     <!--使用开源的连接池druid 德鲁伊-->
        
           <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        
                 <property name="url" value="${jdbc_url}"></property>
        
               <property name="username" value="root"></property>
        
               <property name="password" value="root"></property>
        
               <!-- 数据源初始化自动创建10个连接 -->
        
               <property name="initialSize" value="10" />
        
               <property name="maxActive" value="20" />
        
               <property name="minIdle" value="0" />
        
           </bean>
        
          
        
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        
           <property name="dataSource" ref="dataSource"></property>
        
        </bean>

         

          1. 抽取配置到属性文件
            1. 定义一个属性文件

            1. 在Spring的配置文件中引入属性文件
        第一种:

         

         

        第五步:在业务层添加注解

        第四步:开启注解事务

         

            1. 注解方式的声明式事务管理
        第一步:引入aop的开发包 第二步:恢复转账环境 第三步:配置事务管理器
        <aop:config>
        
           <aop:pointcut id="tx" expression="execution(public * com.vp.service.impl.*.*(..) )"></aop:pointcut>
        
              <aop:advisor advice-ref="txinterceptor" pointcut-ref="tx"></aop:advisor>
        
        </aop:config>
        
          
        
        <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

         

         

        在spring3以上版本中使用spring的依赖注入(注解或者xml方式)和aop功能时,发现了一个问题,如果不设置<aop:aspectj-autoproxy  proxy-target-class="true"/>那么在获取bean时一直报:(无论通过name还是type都获取不到bean)

         

        org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type

         

        或者

        java.lang.ClassCastException: com.sun.proxy.$Proxy12 cannot be cast to cn.edu.nuc.SpringTest.service.impl.DemoServiceImpl

         

         

         

        proxy-target-class="true" 与proxy-target-class="false"的区别:

                proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。如果proxy-target-class 属性值被设置为true,那么基于类的代理将起作用(这时需要cglib库)。如果proxy-target-class属值被设置为false或者这个属性被省略,那么标准的JDK 基于接口的代理

        ---------------------

         

        测试
        <!--事务增强-->
        
           <tx:advice id="txinterceptor" transaction-manager="dataSourceTransactionManager">
        
            <tx:attributes>
        
               <tx:method name="*" propagation="REQUIRED" />
        
            </tx:attributes>
        
        </tx:advice>

         

         

        第五步:AOP的配置

        第四步:配置增强
        • 第三步:配置事务管理器

         

          1. Spring的事务管理:二类:声明式事务管理(通过配置实现)---AOP
            1. XML方式的声明式事务管理
        第一步:引入aop的开发包 第二步:恢复转账环境

            1. 测试:

            1. 编写事务管理的代码

            1. 第三步:在业务层注入事务管理的模板

            1. 第二步:Spring提供了事务管理的模板类
        配置事务的管理的模板类

          1. Spring的事务管理:一类:编程式事务(需要手动编写代码)--了解
            1. 第一步:配置平台事务管理器

        测试

        配置Service和DAO:交给Spring管理 在DAO中编写扣钱和加钱方法:
        1. 配置连接池和JDBC的模板
        2. 在DAO注入Jdbc的模板:

        创建DAO的接口和实现类
          1. Spring的事务管理
            1. 搭建Spring的事务管理的环境
        创建Service的接口和实现类

         

        1. 嵌套式事务
          1. PROPAGATION_NESTED       :嵌套事务,如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点,执行B中的操作,如果没有异常,执行通过,如果有异常,可以选择回滚到最初始位置,也可以回滚到保存点。

         

        1. 保证多个操作不在同一个事务中
          1. PROPAGATION_REQUIRES_NEW    :如果A中有事务,将A的事务挂起(暂停),创建新事务,只包含自身操作。如果A中没有事务,创建一个新事务,包含自身操作。
          2. PROPAGATION_NOT_SUPPORTED :如果A中有事务,将A的事务挂起。不使用事务管理。
          3. PROPAGATION_NEVER           :如果A中有事务,报异常。

        Spring进行事务管理的时候,首先平台事务管理器根据事务定义信息进行事务的管理,在事务管理过程中,产生各种状态,将这些状态的信息记录到事务状态的对象中。

          1. Spring的事务的传播行为
            1. Spring的传播行为
        Spring中提供了七种事务的传播行为:
        1. 保证多个操作在同一个事务中
          1. PROPAGATION_REQUIRED     :默认值,如果A中有事务,使用A中的事务,如果A没有,创建一个新的事务,将操作包含进来
          2. PROPAGATION_SUPPORTS     :支持事务,如果A中有事务,使用A中的事务。如果A没有事务,不使用事务。
          3. PROPAGATION_MANDATORY   :如果A中有事务,使用A中的事务。如果A没有事务,抛出异常。
        事务:逻辑上的一组操作,组成这组操作的各个单元,要么全都成功,要么全都失败。
            1. 事务的特性
        原子性:事务不可分割 一致性:事务执行前后数据完整性保持一致 隔离性:一个事务的执行不应该受到其他事务的干扰 持久性:一旦事务结束,数据就持久化到数据库
            1. 如果不考虑隔离性引发安全性问题
        读问题
        1. 脏读                 :一个事务读到另一个事务未提交的数据
        2. 不可重复读    :一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致
        3. 虚读、幻读    :一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致。
        写问题
        1. 丢失更新
            1. 解决读问题
        设置事务的隔离级别
        1. Read uncommitted :未提交读,任何读问题解决不了。
        2. Read committed     :已提交读,解决脏读,但是不可重复读和虚读有可能发生。(oracle)
        3. Repeatable read      :重复读,解决脏读和不可重复读,但是虚读有可能发生。(mysql)
        4. Serializable              :解决所有读问题。(不允许有事务并发,安全但是效率低)
          1. Spring的事务管理的API
            1. PlatformTransactionManager:平台事务管理器
        平台事务管理器:接口,是Spring用于管理事务的真正的对象。
        1. DataSourceTransactionManager    :底层使用JDBC管理事务
        2. HibernateTransactionManager       :底层使用Hibernate管理事务
            1. TransactionDefinition    :事务定义信息
        事务定义:用于定义事务的相关的信息,隔离级别、超时信息、传播行为、是否只读
            1. TransactionStatus:事务的状态
        事务状态:用于记录在事务管理过程中,事务的状态的对象。
            1. 事务管理的API的关系:

        Spring的事务管理
          1. 事务的回顾
            1. 什么事务

        数据封装

        查询返回对象或集合

            1. 查询操作
        查询某个属性

            1. 删除操作

            1. 修改操作

          1. 使用JDBC的模板完成CRUD的操作
            1. 保存操作

            1. 测试

            1. 引入属性文件的值

        第二种:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值