首页 > 代码库 > day_05

day_05

Spring第五天

2016年11月4日

9:33

 

1:切面的执行顺序

 

说明:当在切面中执行环绕通知中的proceed方法时,它有两个作用。

1.让目标方法执行。

2.执行下一个通知

当执行时如果还有下一个通知 就会先去执行该通知。直到所有的通知执行完毕。最后执行目标方法。并且程序按照递归(嵌套)的方式执行。

 

2.Spring和JDBC整合 

1.第一步导入jar包

 

 

2.配置数据源

 <!--spring和JDBC进行整合  -->

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

            <property name="driverClass" value="http://www.mamicode.com/${c3p0.driver}"></property>

            <property name="jdbcUrl" value="http://www.mamicode.com/${c3p0.url}"></property>

            <property name="user" value="http://www.mamicode.com/${c3p0.user}"></property>

            <property name="password" value="http://www.mamicode.com/${c3p0.password}"></property>

    </bean>

 

3.配置JDBCTemplate

这个是jdbc模板类,可以通过Spring为我们提供的版本进行快速的增删改操作。不需要像原生的jdbc那样复杂的代码。

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

            <!--配置数据源  -->

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

    </bean>

4.模板类的使用

JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");

String sql = "insert into user values(null,?,?)";

int row = jdbcTemplate.update(sql, "白骨精",5000);

System.out.println("影响的行数"+row);

 

说明:模板类自动的会使用预编译的方式。保证数据的安全。

使用预编译时 参数用“?”代替。具体的参数赋值 在执行模板方法时指定

 jdbcTemplate.update(sql, "白骨精",5000);

所有的增删改操作 都用jdbcTemplate.update(sql,arg0,arg1);

 

5.JDBC模板类中的查询方法

通常情况下 查询的结果结通过List进行封装。每一个list中的元素都是一个对象(实体类对象),而原始的模板对象方法jdbcTemplate.queryForList(sql);返回一个List<Map<key,value>>的形式 这样不符合我们的习惯。并且处理起来很麻烦。

 

5.1转化方法

 

 

5.2

 

两种转化方式的区别:

第二种转化方法比较浪费时间。因为底层通过各种反射调用。对象的属性判断才能进行赋值。。

所有建议使用接口的形式进行转化。

 

6:说明

虽然jdbcTemplate在使用上比jdbc原生的简单。可是在现实的开发中几乎不用。

 

7:Spring的声明式的事务处理

1.可以指定具体的方法来控制事务。例如增删改 添加事务,而查询方法和其他方法都不需要事务。

2.只要在Spring中使用了声明式的事务处理,将来所有的事务都不需要程序员自己维护。spring会非常智能帮你维护数据库事务。

 

 

分析:

问题:如果控制事务。

专门的事务管理器。专门负责数据源的管理。

 

 

步骤:

1.修改配置文件的头

2.配置事务管理器

 <!--事务管理器的id 默认都叫 transactionManager  -->

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

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

    </bean>

3.配置事务通知

<!-- method  name="事务指定的方法"

propagation = REQUIRED (必须的)    将来执行addUser方法的时候就是添加事务。

propagation="SUPPORTS" 事务可有可无。

read-only="true"  spring会自动优化 查询效率更高

-->

<tx:method name="update*" propagation="REQUIRED"/>

<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>

<tx:method name="*" propagation="SUPPORTS"/>

4.配置切面

    <aop:config>

            <aop:pointcut expression="execution(* service..*(..))" id="pc"/>

            <aop:advisor advice-ref="tx" pointcut-ref="pc"/>

    </aop:config>

 

8:传播属性

propagation="REQUIRED"

propagation="SUPPORTS"

实现事务的传播属性REQUIRED,可以做到多表操作时事务的一致性。

propagation="SUPPORTS" 

如果一直操作有事务。那么当执行find()时,这个方法也会添加事务。

 

9:事务的回滚策略

1.当程序执行遇到运行时异常时 事务会回滚。

2当程序执行遇到检查异常时 事务不会回滚

3.修改回滚策略

rollback-for="java.sql.SQLException"  遇到那种异常 事务回滚

no-rollback-for="java.la1:切面的执行顺序

 

说明:当在切面中执行环绕通知中的proceed方法时,它有两个作用。

1.让目标方法执行。

2.执行下一个通知

当执行时如果还有下一个通知 就会先去执行该通知。直到所有的通知执行完毕。最后执行目标方法。并且程序按照递归(嵌套)的方式执行。

 

2.Spring和JDBC整合 

1.第一步导入jar包

 

 

2.配置数据源

 <!--spring和JDBC进行整合  -->

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

            <property name="driverClass" value="http://www.mamicode.com/${c3p0.driver}"></property>

            <property name="jdbcUrl" value="http://www.mamicode.com/${c3p0.url}"></property>

            <property name="user" value="http://www.mamicode.com/${c3p0.user}"></property>

            <property name="password" value="http://www.mamicode.com/${c3p0.password}"></property>

    </bean>

 

3.配置JDBCTemplate

这个是jdbc模板类,可以通过Spring为我们提供的版本进行快速的增删改操作。不需要像原生的jdbc那样复杂的代码。

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

            <!--配置数据源  -->

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

    </bean>

4.模板类的使用

JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");

String sql = "insert into user values(null,?,?)";

int row = jdbcTemplate.update(sql, "白骨精",5000);

System.out.println("影响的行数"+row);

 

说明:模板类自动的会使用预编译的方式。保证数据的安全。

使用预编译时 参数用“?”代替。具体的参数赋值 在执行模板方法时指定

 jdbcTemplate.update(sql, "白骨精",5000);

所有的增删改操作 都用jdbcTemplate.update(sql,arg0,arg1);

 

5.JDBC模板类中的查询方法

通常情况下 查询的结果结通过List进行封装。每一个list中的元素都是一个对象(实体类对象),而原始的模板对象方法jdbcTemplate.queryForList(sql);返回一个List<Map<key,value>>的形式 这样不符合我们的习惯。并且处理起来很麻烦。

 

5.1转化方法

 

 

5.2

 

两种转化方式的区别:

第二种转化方法比较浪费时间。因为底层通过各种反射调用。对象的属性判断才能进行赋值。。

所有建议使用接口的形式进行转化。

 

6:说明

虽然jdbcTemplate在使用上比jdbc原生的简单。可是在现实的开发中几乎不用。

 

7:Spring的声明式的事务处理

1.可以指定具体的方法来控制事务。例如增删改 添加事务,而查询方法和其他方法都不需要事务。

2.只要在Spring中使用了声明式的事务处理,将来所有的事务都不需要程序员自己维护。spring会非常智能帮你维护数据库事务。

 

 

分析:

问题:如果控制事务。

专门的事务管理器。专门负责数据源的管理。

 

 

步骤:

1.修改配置文件的头

2.配置事务管理器

 <!--事务管理器的id 默认都叫 transactionManager  -->

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

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

    </bean>

3.配置事务通知

<!-- method  name="事务指定的方法"

propagation = REQUIRED (必须的)    将来执行addUser方法的时候就是添加事务。

propagation="SUPPORTS" 事务可有可无。

read-only="true"  spring会自动优化 查询效率更高

-->

<tx:method name="update*" propagation="REQUIRED"/>

<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>

<tx:method name="*" propagation="SUPPORTS"/>

4.配置切面

    <aop:config>

            <aop:pointcut expression="execution(* service..*(..))" id="pc"/>

            <aop:advisor advice-ref="tx" pointcut-ref="pc"/>

    </aop:config>

 

8:传播属性

propagation="REQUIRED"

propagation="SUPPORTS"

实现事务的传播属性REQUIRED,可以做到多表操作时事务的一致性。

propagation="SUPPORTS" 

如果一直操作有事务。那么当执行find()时,这个方法也会添加事务。

 

9:事务的回滚策略

1.当程序执行遇到运行时异常时 事务会回滚。

2当程序执行遇到检查异常时 事务不会回滚

3.修改回滚策略

rollback-for="java.sql.SQLException"  遇到那种异常 事务回滚

no-rollback-for="java.lang.Exception" 遇到所有的异常都不回滚

 

 

 

 

 

 

 

 

 

 

 

 

day_05