1. 程式人生 > 實用技巧 >【Spring】JdbcTemplate、宣告式事務配置

【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開頭,都適用於,只讀,支援事務這些設定