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="${c3p0.driver}"></property>
<property name="jdbcUrl" value="${c3p0.url}"></property>
<property name="user" value="${c3p0.user}"></property>
<property name="password" value="${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="${c3p0.driver}"></property>
<property name="jdbcUrl" value="${c3p0.url}"></property>
<property name="user" value="${c3p0.user}"></property>
<property name="password" value="${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" 遇到所有的异常都不回滚