【Spring】JdbcTemplate、声明式事务配置

8).Spring - JdbcTemplate

JdbcTemplate:Spring简化的JDBC,Spring提供(spring-jdbc.jar),是自带的,直接用
获得JdbcTemplate:先将其放到spring中管理,再通过工厂获得
	<!-- 管理DruidDataSource -->
  	<bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
		<property name="username" value="jwnming"></property>
		<property name="password" value="Oracle123"></property>
		<property name="initialSize" value="10"></property>
		<property name="maxActive" value="20"></property>
		<property name="minIdle" value="4"></property>
		<property name="maxWait" value="4000"></property>
	</bean>
    <!-- 管理Spring的JdbcTemplate -->
   	<bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="druid"></property>
	</bean>
重要API:
① 增删改方法:
jdbcTemplate.update(sql,参数列表...);
② 查询方法(查询单个):
T t = jdbcTemplate.queryForObject(sql,映射工具RowMapper接口,绑定参数);
	例子:
ClassPathXmlApplicationContext c= new ClassPathXmlApplicationContext("classpath:/applicationContext.xml");
		jdbcTemplate = (JdbcTemplate) c.getBean("jt");
		User user = jdbcTemplate.queryForObject("select id,username,password,sex from t_users where username = ? and password = ?", 
new 	RowMapper<User>() {
			@Override
			public User mapRow(ResultSet rs, int arg) throws SQLException {
				User user = new User(rs.getString("id"), rs.getString("username"), rs.getString("password"), rs.getInt("sex"));
				return user;
			}
		}, "蒋文明", "123");
		return user;
注意:查询没有结果,异常形式告知。
③ 查询多条结果:List<T> list = jdbcTemplate.query(sql,RowMapper,绑定的参数);
Spring+JdbcTemplate开发应用:DAO层 + Service层
编码步骤:①表 ②实体 ③书写DAO、实现类 ④开发Service、实现类

10).Spring - 声明式事务

Spring声明式事务
操作步骤:
① 管理service的目标类(以及上面的JdbcTemplate、连接池)
② spring管理事务管理器
③ spring管理事务增强(tx:adivce 替代了 bean)
④ aop配置将增强加入service方法中
代码:
	<!-- 管理DruidDataSource -->
  	<bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
		<property name="username" value="jwnming"></property>
		<property name="password" value="Oracle123"></property>
		<property name="initialSize" value="10"></property>
		<property name="maxActive" value="20"></property>
		<property name="minIdle" value="4"></property>
		<property name="maxWait" value="4000"></property>
	</bean>
    <!-- 管理Spring的JdbcTemplate -->
    <bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="druid"></property>
</bean>
    <!-- 管理UserDAOImpl --> 
    <bean id="udi" class="com.jwnming.dao.impl.UserDAOImpl">
    		<property name="jdbcTemplate" ref="jt"></property>
    </bean>    
    <!-- 管理UserServiceImpl --> 
    <bean id="usi" class="com.jwnming.service.impl.UserServiceImpl">
    		<!-- UserDAO属性 -->
    		<property name="userDAO" ref="udi"></property>
    </bean>
    <!-- 事务管理器DataSourceTransactionManager -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<!-- 注入连接池 -->
    		<property name="dataSource" ref="druid"></property>
    </bean>
    <!-- 管理事务增强 -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
    	<!-- 事务增强属性 -->
    		<tx:attributes>
    			<!-- User 登录方法:只读、回滚异常为RuntimeExcepiton、支持事务 -->
    			<tx:method name="login" read-only="true" rollback-for="java.lang.RuntimeException" propagation="SUPPORTS"></tx:method>
    			<!-- User 注册方法:回滚异常为RuntimeException、必须事务 -->
    			<tx:method name="regist" rollback-for="java.lang.RuntimeException" propagation="REQUIRED"></tx:method>
    			<!--添加、修改、删除放到最后的位置 <tx:method name="*" rollback-for="java.lang.RuntimeException" propagation="REQUIRED"></tx:method> -->
    		</tx:attributes>
    </tx:advice>
    <!-- aop配置将事务增强加入UserServiceImpl的方法中 -->
    <aop:config>
    		<!-- 声明事务的切入点 -->
    		<aop:pointcut id="pc" expression="execution(boolean com.jwnming.service.impl.UserServiceImpl.login(java.lang.String, java.lang.String))"></aop:pointcut>
    		<aop:pointcut id="pc1" expression="execution(boolean com.jwnming.service.impl.UserServiceImpl.regist(com.jwnming.entity.User))"></aop:pointcut>
		<!--<aop:pointcut id="pc" expression="execution(* com.jwnming.service.impl.UserServiceImpl.*(..))"></aop:pointcut> -->
    		<!-- 组装:事务增强+切入点 -->
    		<aop:advisor pointcut-ref="pc" advice-ref="txAdvice"></aop:advisor>
    		<aop:advisor advice-ref="txAdvice" pointcut-ref="pc1"/>
</aop:config>

事务属性:
事务属性配置标签和属性
<tx:attributes>
    <tx:method name="方法名1" read-only="只读" propagation="事务传播" rollback-for="回滚异常"></tx:method>
    <tx:method name="方法名2" ></tx:method>
</tx:attributes>
① 事务回滚:rollback-for
   指定service的方法,在什么异常情况下进行事务回滚操作
   <tx:method name="regist" rollback-for="java.lang.RuntimeException"></tx:method>
   默认: rollback-for默认值 java.lang.RuntimeException
② 只读事务:read-only=“true|false”
   作用:可以让serviec的查询方法在数据库的内存中,事务中,不分配回滚段。节省内存
   应用:service方法只有读操作,建议设置为只读:`read-only="true"`
③ 事务传播:propagation="SUPOORTS|REQUIRED"
   场景:service调用service
   SUPPORTS: 支持事务
   		特点:如果外部已经开始了事务,并融合到外部事务中;如果外部没有开启事务,则不开启事务
   REQUIRED: 需要事务
   		特点:必须有一个事务。如果外部已经开启,则融合外部事务中。如果外部没有事务,则开启事务
④ 事务属性方法的简化:<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
   含义:只要service方法以get开头,都适用于,只读,支持事务这些设置
原文地址:https://www.cnblogs.com/jwnming/p/13635180.html