zoukankan      html  css  js  c++  java
  • Spring-day03

    Spring集成JDBC:提供了一些方便我们使用JDBC的工具类;

    query(String,ResultSetHandler handler,Object..parm){
         Connection connect=dataSource.getConnection();
         connect.preparedStatement();
         for(){
              ps.setObject();
         }
         ResultSet rs=ps.executeQuery();
         List ret=handler.handle(rs);
         return ret;
    }
    
    update(String sql,Object..param){
         Connection connect=dataSource.getConnection();
         connect.preparedStatement();
         for(){
              ps.setObject();
         }
         int rs=ps.executeUpdate();
         return rs;
    }

    1,在Spring中,主要使用JDBCTemplate来完成我们的JDBC代码;
    2,使用SpringJDBC
      1),在Spring中配置一个dataSource;
      2),完成DAO:
        1),dao中需要一个jdbcTemplate对象;
        2),不需要setJdbcTemplate,而是使用setDataSource;用传入的dataSource去new JdbcTemplate(dataSource);
        3),使用jdbcTemplate上的方法来完成JDBC代码;
        4),jdbcTemplate.update(String,Object..params):一般用来DML;
        5),jdbcTemplate.query(String,ResultSetExtractor/RowMapper,Object..parmas):一般用来查询;
          1,ResultSetExtractor:需要自己手动遍历结果集;
          2,RowMapper:spring榜我们遍历结果集,我们只需要在这个对象中映射每一行数据;

    SpringJDBC补充:
    1,Spring提供了JdbcDaoSupport类,在这个类里面帮我们封装了jdbcTemplate的创建过程,我们的DAO只需要继承JdbcDaoSupport类,就可以了,
      1),使用this.getJdbcTemplate()获得jdbcTemplate;
      2),在Spring配置文件中,还是要为dao设置dataSource:

    2,使用占位符的方式 把数据库连接信息放到额外的配置文件中;
      1),把xml配置文件中的值改成类似EL表达式的方式,
      2),创建一个配置文件x.properties,要求,properties文件中的key值需要和spring中配置的占位符的名字匹配
      3),在XML配置文件中导入占位符配置文件;

        <!-- 配置连接池 -->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
            <property name="driverClassName" value="${db.driverClassName}"/>
            <property name="url" value="${db.url}"/>
            <property name="username" value="${db.username}"/>
            <property name="password" value="${db.password}"/>
        </bean>
        <!-- 导入占位符配置文件${jdbc.xxx}
            location:配置文件地址,可以使用前缀
         -->
         <context:property-placeholder location="classpath:db.properties"/>
    //db.properties
    #key=value db.driverClassName=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/spring db.username=root db.password=admin

    3,spring配置文件的继承;
      1),抽象的类是不能直接配置在spring中的,需要在bean元素上面添加abtract=true属性;
      2),子类要继承父类的配置,必须要在bean元素上面添加parent属性,指向父bean的引用;
      3),在spring配置文件中,其实是没有继承的概念;
        1,一个bean是可以不需要class属性的,但是如果一个bean没有class属性,那么一定要添加abstract=true;代表这个bean是不需要去实例化的,这个bean是用来给其他的配置文件做继承的;
        2,parent属性并不是代表对象的继承关系,它代表的是配置文件的拷贝;

        <!-- 不能实例化的对象想配置在Spring里面,
            abstract="true":代表这个类是抽象的,不用实例化
            因为这个bean不需要实例化,所以不用编写class属性
         -->
        <bean id="baseDAO" abstract="true">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        
        <!-- 在子类中要配置parent属性,指向父类bean的引用 -->
        <bean id="employeeDAO" class="com.rk1632._01_jdbc.EmployeeDAOImpl" parent="baseDAO"/>
        
        <!-- 在子类中要配置parent属性,指向父类bean的引用 -->
        <bean id="deptDAO" class="com.rk1632._01_jdbc.DepartmentDAOImpl" parent="baseDAO"/>

    Spring中事务的管理:
    1,事务要开在service上;
    2,PlatformTranscationManager:Spring中的事务管理器;
      1),TransactionStatus getTransaction():开启事务;
      2),void commit(TransactionStatus status):提交事务;
      3),void rollback(TransactionStatus status):回滚事务;
    3,TransactionStatus:可以简单理解为创建的事务对象;

    4,Spring中提供的常用的事务管理器;
    我们需要注意的:
      1),DataSourceTranscationManager:针对JDBC;
      2),HibernateTranscationManager:针对Hibernate(版本);
      3),JpaTransactionManager:针对JPA;

     

    spring管理事务:
    1,配置一个和我们的持久化方式匹配的事务管理器;

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

    2,因为我们使用的是JDBC,所以选择DataSourceTranscationManager;
      1),在这个txManager中一定要传入一个DataSource;
      2),由这个dataSource来得到连接,管理事务;
      3),注意,这个传入的dataSource已经被spring代理过了,在调用getConnection的时候,实际上得到的是当前线程中的Connection;
    3,配置事务

      1),配置datasource
      2),配置baseDAO和transactionManager(使用同一个datasource);
      3),配置service;
      4),配置事务通知(tx:advice)
        1),名字(id):被切面引用;
        2),transaction-manager:在事务通知中,真正的执行开启事务,提交事务,回滚;
        3),配置事务属性:控制拦截到的不同的方法,具体怎么处理事务
      5),配置aop:
        1),配置切入点(aop:point-cut);
        2),配置aop:advisor(pointCut-ref/advice-ref)(把通知和切入点连起来)


    配置事务属性:

    1,tx:method是从上向下匹配的,一般最后一个tx:method的name="*",用来匹配上面方法匹配不到的其他方法的事务处理方式;
    2,read-only:开启一个只读的事务,只读的事务性能较高,不能在只读的事务中做DML操作;
    3,isolation:隔离级别
      1),DEFAULT:使用数据库默认的隔离级别;
      2),注意,这个属性一般填写为DEFAULT(默认),这个事务隔离级别是spring模拟出来;
    4,rollback-for:遇到什么异常事务要回滚(默认情况下,spring只有遇到RuntimeException才会回滚);
    5,propagation:事务的传播方式(默认是REQUIRED);
      1),常用:REQUIRED,REQUIRES_NEW;
      2),一般来说,tx:method最后一个方法都写作REQUIRED

     

    使用Annotation配置事务:
    1,在service方法或者类上面添加@Transactional标签;
      1),如果在类上面,相当于为类中的所有方法创建了一个默认的事务控制方式;
      2),如果要覆盖掉默认的方式,只需要在方法上面再重新写一次@Transactional
    2,在spring的配置文件中,使用<tx:annotation-drivern>标签来引入用于解析@Transactional标签的第三方应用;

    选择:建议使用配置文件的方式;

  • 相关阅读:
    Record
    Solution -「洛谷 P6287」「COCI 2016-2017」Mag
    Solution -「洛谷 P3773」「CTSC 2017」吉夫特
    Solution -「SP 106」BINSTIRL
    Record
    Record
    Record
    Solution Set -「CSP-S 2020」
    MDK在SRAM中运行-STM32F103RCT6为例
    STM8S103F3P STVD+COSMIC开发环境搭建
  • 原文地址:https://www.cnblogs.com/Java0120/p/10013540.html
Copyright © 2011-2022 走看看