【Spring】JdbcTemplate、宣告式事務配置
阿新 • • 發佈:2020-09-08
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開頭,都適用於,只讀,支援事務這些設定