Spring_AOP注解_JDBC模板_事务管理

目录

1、     AOP注解
2、     JDBC模板技术
3、     Spring框架事务管理
4 Mysql报错reading initial communication packet
内容

5 Eclipse配置

内容

1、Spring框架的AOP技术(注解方式)

1.1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包

        * 先引入Spring框架开发的基本开发包

           * spring的传统AOP的开发的包

               *spring-aop-4.2.4.RELEASE.jar

              * com.springsource.org.aopalliance-1.0.0.jar

           * 再引入Spring框架的AOP的开发包

              *com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

              * spring-aspects-4.2.4.RELEASE.jar

1.2. 步骤二:创建Spring的配置文件,引入具体的AOP的schema约束

       <beans xmlns="http://www.springframework.org/schema/beans"

             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

             xmlns:aop="http://www.springframework.org/schema/aop"

             xsi:schemaLocation="

              http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

              http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">

       </beans>

1.3. 步骤三:创建包结构,编写具体的接口和实现类

       * com.itheima.demo1

           * CustomerDao        -- 接口

           * CustomerDaoImpl    -- 实现类

   4. 步骤四:将目标类配置到Spring中

       <bean id="customerDao"class="com.itheima.demo1.CustomerDaoImpl"/>

   5. 步骤五:定义切面类

       * 添加切面和通知的注解

           * @Aspect                -- 定义切面类的注解

           * 通知类型(注解的参数是切入点的表达式)

              * @Before            -- 前置通知

              * @AfterReturing     -- 后置通知

              * @Around            -- 环绕通知

              * @After             -- 最终通知

              * @AfterThrowing     -- 异常抛出通知

       * 具体的代码如下

           @Aspect

           public class MyAspectAnno {

              @Before(value="execution(publicvoid com.itheima.demo1.CustomerDaoImpl.save())")

              public void log(){

                  System.out.println("记录日志...");

              }

           }

   6. 步骤六:在配置文件中定义切面类

       <bean id="myAspectAnno"class="com.itheima.demo1.MyAspectAnno"/>

   7. 步骤七:在配置文件中开启自动代理

       <aop:aspectj-autoproxy/>

   8. 完成测试

       /**

 * 测试AOP的环境

 * @author Administrator

 *其中RunWith(SpringJUnit4ClassRunner.class)

    ContextConfiguration("classpath:applicationContext.xml")

     是注解支持不写  ApplicationContextcontext=ClassPathXmlApplicationContext(applicationContext.xml)

 */

@RunWith(SpringJUnit4ClassRunner.class)

       @ContextConfiguration("classpath:applicationContext.xml")

       public class Demo1 {

           /*S 中 使用Resource注解代表的是不用再<bean></bean>标签中进行<property>的属性注入。在测试类中 private CustomerDao customer;的上面进行注解,这样就能关联到CustomerDao的类*/

    //Resource()这个可以代替<bean>标签中的<propertyname="userDao"ref="UserDao"></property>

    //其中name是指service层dao的名称,ref是配置文件中Dao中的id 

           @Resource(name="customerDao")

           private CustomerDao customerDao;

          

           @Test

           public void run1(){

              customerDao.save();

              customerDao.update();

           }

       }

其中mysql报错解决方式为,右键重新启动

2、JDBC模板技术

2.1JDBC模板类(自己来new对象的方式)

链接池默认是单例的,正好(scope)

public voidtest2(){

//     写一个Spring中的连接池对象

       DriverManagerDataSource dataSource = newDriverManagerDataSource();

       dataSource.setDriverClassName("com.mysql.jdbc.Driver");

       dataSource.setUrl("jdbc:mysql:///spring_day03");

       dataSource.setUsername("root");

       dataSource.setPassword("1234");

      

//     创建Spring的JDBC模板类

       JdbcTemplate jdbcTemplate = newJdbcTemplate();

       jdbcTemplate.setDataSource(dataSource);

//     如果不写null会报错,不想写的话只能insert t_account(name,money)values(null,?,?)";

        Stringsql = "insert t_account values(null,?,?)";

       jdbcTemplate.update(sql, "chen希",1000);

    }

2.2使用Spring框架来管理模板类

2.2.1 Spring管理内置的连接池
           <bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">

              <propertyname="driverClassName" value="com.mysql.jdbc.Driver"/>

             <propertyname="url" value="jdbc:mysql:///spring_day03"/>

             <propertyname="username" value="root"/>

             <propertyname="password" value="root"/>

          </bean>
2.2.2 步骤二:Spring管理模板类
        <bean id="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">

             <propertyname="dataSource" ref="dataSource"/>

          </bean>
2.2.3 步骤三:编写测试程序
           @RunWith(SpringJUnit4ClassRunner.class)

           @ContextConfiguration("classpath:applicationContext.xml")

           public class Demo2 {

             

              @Resource(name="jdbcTemplate")

              private JdbcTemplate jdbcTemplate;

             

              @Test

              public void run2(){

                  jdbcTemplate.update("insertinto t_account values (null,?,?)", "测试2",10000);

              }

           }

2.3 Spring框架管理开源的连接池

2.3.1. 管理DBCP连接池(apache的)

       * 先引入DBCP的2个jar包

           *com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar

           *com.springsource.org.apache.commons.pool-1.5.3.jar

       * 编写配置文件 

          <bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource">

             <propertyname="driverClassName" value="com.mysql.jdbc.Driver"/>

             <propertyname="url" value="jdbc:mysql:///spring_day03"/>

             <propertyname="username" value="root"/>

             <propertyname="password" value="root"/>

          </bean>

2.3.2. 管理C3P0连接池

       * 先引入C3P0的jar包

           * com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

       * 编写配置文件

          <bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource">

             <property name="driverClass"value="com.mysql.jdbc.Driver"/>

             <propertyname="jdbcUrl" value="jdbc:mysql:///spring_day03"/>

             <propertyname="user" value="root"/>

             <propertyname="password" value="root"/>

          </bean>

2.4 Spring框架的JDBC模板的简单操作

2.4.1. 增删改查的操作
   @RunWith(SpringJUnit4ClassRunner.class)

       @ContextConfiguration("classpath:applicationContext.xml")

       public class SpringDemo3 {

          

           @Resource(name="jdbcTemplate")

           private JdbcTemplate jdbcTemplate;

          

           @Test

           // 插入操作

           public void demo1(){

             jdbcTemplate.update("insertinto account values (null,?,?)", "冠希",10000d);

           }

          

           @Test

           // 修改操作

           public void demo2(){

              jdbcTemplate.update("updateaccount set name=?,money =? where id = ?", "思雨",10000d,5);

           }

          

           @Test

           // 删除操作

           public void demo3(){

              jdbcTemplate.update("deletefrom account where id = ?", 5);

           }

          

           @Test

           // 查询一条记录

           public void demo4(){

              Account account =jdbcTemplate.queryForObject("select * from account where id = ?", newBeanMapper(), 1);

              System.out.println(account);

           }

          

           @Test

           // 查询所有记录

           public void demo5(){

              List<Account> list =jdbcTemplate.query("select * from t_account", new BeanMapper());

              for (Account account : list) {

                  System.out.println(account);

              }

           }

       }

       //编写航映射,查询单个和多个通用

       class BeanMapper implementsRowMapper<Account>{

           public Account mapRow(ResultSet rs,int arg1) throws SQLException {

//     将结果集封装到ac中。rs使用的字段名称进行取值

              Account account = new Account();

              account.setId(rs.getInt("id"));

              account.setName(rs.getString("name"));

              account.setMoney(rs.getDouble("money"));

              return account;

           }

       }

3 Spring框架的事务管理相关的类和API

3.1.PlatformTransactionManager接口       -- 平台事务管理器.(真正管理事务的类)。该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类!DataSourceTransactionManagerJDBC模板的实现类;HibernateTransactionManager 整合Hibernate使用的实现类

3.2.TransactionDefinition接口       -- 事务定义信息.(事务的隔离级别,传播行为,超时,只读)

3.3.TransactionStatus接口            -- 事务的状态

3.4. 总结:上述对象之间的关系:平台事务管理器真正管理事务对象.根据事务定义的信息TransactionDefinition 进行事务管理,在管理事务中产生一些状态.将状态记录到TransactionStatus中

3.5.PlatformTransactionManager接口中实现类和常用的方法

       1. 接口的实现类

           * 如果使用的Spring的JDBC模板或者MyBatis框架,需要选择DataSourceTransactionManager实现类

           * 如果使用的是Hibernate的框架,需要选择HibernateTransactionManager实现类

       2. 该接口的常用方法

           * void commit(TransactionStatusstatus)

           * TransactionStatusgetTransaction(TransactionDefinition definition)

           * void rollback(TransactionStatusstatus)

3.6.TransactionDefinition

       1. 事务隔离级别的常量

           * static int ISOLATION_DEFAULT                -- 采用数据库的默认隔离级别

           * static int ISOLATION_READ_UNCOMMITTED

           * static int ISOLATION_READ_COMMITTED

           * static intISOLATION_REPEATABLE_READ

           * static int ISOLATION_SERIALIZABLE

       2. 事务的传播行为常量(不用设置,使用默认值)

           * 先解释什么是事务的传播行为:解决的是业务层之间的方法调用!!

           * PROPAGATION_REQUIRED(默认值)   -- A中有事务,使用A中的事务.如果没有,B就会开启一个新的事务,将A包含进来.(保证A,B在同一个事务中),默认值!!

           * PROPAGATION_SUPPORTS          -- A中有事务,使用A中的事务.如果A中没有事务.那么B也不使用事务.

           * PROPAGATION_MANDATORY         -- A中有事务,使用A中的事务.如果A没有事务.抛出异常.

           * PROPAGATION_REQUIRES_NEW(记)-- A中有事务,将A中的事务挂起.B创建一个新的事务.(保证A,B没有在一个事务中)

           * PROPAGATION_NOT_SUPPORTED     -- A中有事务,将A中的事务挂起.

           * PROPAGATION_NEVER         -- A中有事务,抛出异常.

           * PROPAGATION_NESTED(记)      -- 嵌套事务.当A执行之后,就会在这个位置设置一个保存点.如果B没有问题.执行通过.如果B出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)

4 搭建事务管理转账案例的环境(强调:简化开发,以后DAO可以继承JdbcDaoSupport类)

4.1. 步骤一:创建WEB工程,引入需要的jar包

    * IOC的6个包

    * AOP的4个包

    * C3P0的1个包

    * MySQL的驱动包

    * JDBC目标2个包

    * 整合JUnit测试包

4.2. 步骤二:引入配置文件

    * 引入配置文件

       * 引入log4j.properties

       * 引入applicationContext.xml

           <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

             <propertyname="driverClass" value="com.mysql.jdbc.Driver"/>

             <propertyname="jdbcUrl" value="jdbc:mysql:///spring_day03"/>

             <propertyname="user" value="root"/>

             <propertyname="password" value="root"/>

          </bean>

4.3. 步骤三:创建对应的包结构和类

    * com.itheima.demo1

       * AccountService

       * AccountServlceImpl

       * AccountDao

       * AccountDaoImpl

4.4. 步骤四:引入Spring的配置文件,将类配置到Spring中

   <bean id="accountService"class="com.itheima.demo1.AccountServiceImpl">

    </bean>

   

    <bean id="accountDao" class="com.itheima.demo1.AccountDaoImpl">

    </bean>

4.5. 步骤五:在业务层注入DAO ,在DAO中注入JDBC模板(强调:简化开发,以后DAO可以继承JdbcDaoSupport类)

    <bean id="accountService"class="com.itheima.demo1.AccountServiceImpl">

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

    </bean>

   

    <bean id="accountDao"class="com.itheima.demo1.AccountDaoImpl">

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

    </bean>

4.6. 步骤六:编写DAO和Service中的方法

    public class AccountDaoImpl extendsJdbcDaoSupport implements AccountDao {

       public void outMoney(String out, doublemoney) {

           this.getJdbcTemplate().update("update t_account set money = money = ? where name = ?", money,out);

       }

       public void inMoney(String in, doublemoney) {

           this.getJdbcTemplate().update("update t_account set money = money + ? where name = ?", money,in);

       }

    }

4.7. 步骤七:编写测试程序.

  @RunWith(SpringJUnit4ClassRunner.class)

    @ContextConfiguration("classpath:applicationContext.xml")

    public class Demo1 {

      

       @Resource(name="accountService")

       private AccountService accountService;

      

       @Test

       public void run1(){

           accountService.pay("冠希", "美美", 1000);

       }

    }


5、Spring框架的事务管理之编程式的事务管理(了解)

1. 说明:Spring为了简化事务管理的代码:提供了模板类 TransactionTemplate,所以手动编程的方式来管理事务,只需要使用该模板类即可!!

2. 手动编程方式的具体步骤如下:

    1. 步骤一:配置一个事务管理器,Spring使用PlatformTransactionManager接口来管理事务,所以咱们需要使用到他的实现类!!

    <!-- 配置事务管理器 -->

       <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

           <propertyname="dataSource" ref="dataSource"/>

       </bean>

    2. 步骤二:配置事务管理的模板

    <!-- 配置事务管理的模板 -->

       <beanid="transactionTemplate"class="org.springframework.transaction.support.TransactionTemplate">

           <propertyname="transactionManager" ref="transactionManager"/>

       </bean>

    3. 步骤三:在需要进行事务管理的类中,注入事务管理的模板.

      <bean id="accountService"class="com.itheima.demo1.AccountServiceImpl">

           <propertyname="accountDao" ref="accountDao"/>

           <propertyname="transactionTemplate" ref="transactionTemplate"/>

       </bean>

    4. 步骤四:在业务层使用模板管理事务:

      // 注入事务模板对象

       private TransactionTemplatetransactionTemplate;

       public voidsetTransactionTemplate(TransactionTemplate transactionTemplate) {

           this.transactionTemplate =transactionTemplate;

       }

      

       public void pay(final String out, finalString in, final double money) {

           transactionTemplate.execute(newTransactionCallbackWithoutResult() {

             

              protected voiddoInTransactionWithoutResult(TransactionStatus status) {

                  // 扣钱

                  accountDao.outMoney(out,money);

                  int a = 10/0;

                  // 加钱

                  accountDao.inMoney(in, money);

              }

           });

       }


6、Spring框架的事务管理之声明式事务管理,即通过配置文件来完成事务管理(AOP思想)

6.1Spring框架的事务管理之基于AspectJ的XML方式(重点掌握)

1. 步骤一:恢复转账开发环境
2. 步骤二:引入AOP的开发包
3. 步骤三:配置事务管理器
    <!-- 配置事务管理器 -->

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

    </bean>
4. 步骤四:配置事务增强
  <!-- 配置事务增强 -->

    <tx:advice id="txAdvice"transaction-manager="transactionManager">

       <tx:attributes>

           <!--

              name       :绑定事务的方法名,可以使用通配符,可以配置多个。

              propagation   :传播行为

              isolation  :隔离级别

              read-only  :是否只读

              timeout       :超时信息

              rollback-for:发生哪些异常回滚.

              no-rollback-for:发生哪些异常不回滚.

            -->

           <!-- 哪些方法加事务 -->

           <tx:method name="pay"propagation="REQUIRED"/>

       </tx:attributes>

    </tx:advice>
5. 步骤五:配置AOP的切面
<!-- 配置AOP切面产生代理 -->

    <aop:config>

       <aop:advisoradvice-ref="myAdvice" pointcut="execution(*com.itheima.demo2.AccountServiceImpl.pay(..))"/>

    </aop:config>

    * 注意:如果是自己编写的切面,使用<aop:aspect>标签,如果是系统制作的,使用<aop:advisor>标签。
6. 步骤六:编写测试类
    @RunWith(SpringJUnit4ClassRunner.class)

    @ContextConfiguration("classpath:applicationContext2.xml")

    public class Demo2 {

      

       @Resource(name="accountService")

       private AccountService accountService;

      

       @Test

       public void run1(){

           accountService.pay("冠希", "美美", 1000);

       }

    }

6.2 Spring框架的事务管理之基于AspectJ的注解方式(重点掌握,最简单的方式)

1. 步骤一:恢复转账的开发环境
2. 步骤二:配置事务管理器
    <!-- 配置事务管理器  -->

    <bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

    </bean>
3. 步骤三:开启注解事务
    <!-- 开启注解事务 -->

    <tx:annotation-driventransaction-manager="transactionManager"/>
4. 步骤四:在业务层上添加一个注解:@Transactional
5. 编写测试类
    @RunWith(SpringJUnit4ClassRunner.class)

    @ContextConfiguration("classpath:applicationContext3.xml")

    public class Demo3 {

      

       @Resource(name="accountService")

       private AccountService accountService;

      

       @Test

       public void run1(){

           accountService.pay("冠希", "美美", 1000);

       }

    }

7、Eclipse需要做设置

    1. 统一工作空间的编码,选择UTF-8


    2. 把创建JSP页面的编码修改UTF-8


    3. 重新配置Tomcat服务器

       * 先配置Tomcat服务器


       * 选择服务器 --> open --> 选择发布项目的目录(webapps目录)


    4. SSH自己配置约束

猜你喜欢

转载自blog.csdn.net/lxiansheng001/article/details/80496056