一、JDBC模板技術:簡化數據庫操作
在傳統JDBC開發中,繁瑣的資源管理和重復代碼一直是開發者的痛點。Spring框架提供的 JDBC模板(JdbcTemplate) 徹底改變了這一現狀,它通過封裝底層JDBC操作,讓開發者僅需關注SQL邏輯,大幅提升開發效率。
1.1 快速入門:從手動編碼到Spring管理
手動創建模板對象
@Test
public void run1() {// 配置數據庫連接池DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setUrl("jdbc:mysql:///spring_db");dataSource.setUsername("root");dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setPassword("root");// 創建JdbcTemplate并執行SQLJdbcTemplate template = new JdbcTemplate(dataSource);template.update("insert into account values (null,?,?)", "熊大", 1000);
}
Spring管理模板對象
通過配置文件將數據源和模板納入IOC容器管理,避免硬編碼:
<!-- 配置數據源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql:///spring_db" /><property name="username" value="root" /><property name="password" value="root" />
</bean><!-- 配置JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource" />
</bean>
1.2 進階用法:操作數據庫的增刪改查
執行更新操作(增、刪、改)
// 新增數據
jdbcTemplate.update("insert into account values (null,?,?)", "熊二", 500);
// 修改數據
jdbcTemplate.update("update account set name = ?,money = ? where id = ?", "光頭強", 100, 7);
// 刪除數據
jdbcTemplate.update("delete from account where id = ?", 7);
查詢操作:結果集映射
通過RowMapper
接口實現自定義數據封裝,例如將查詢結果映射為Account
對象:
// 單個對象查詢
Account account = jdbcTemplate.queryForObject("select * from account where id = ?", new BeanMapper(), // 自定義RowMapper實現類6
);// 列表查詢
List<Account> list = jdbcTemplate.query("select * from account", new BeanMapper()
);class BeanMapper implements RowMapper<Account> {@Overridepublic Account mapRow(ResultSet rs, int rowNum) throws SQLException {Account account = new Account();account.setId(rs.getInt("id"));account.setName(rs.getString("name"));account.setMoney(rs.getDouble("money"));return account;}
}
1.3 集成開源連接池:以Druid為例
替換為高性能的Druid連接池只需兩步:
- 添加Maven依賴:
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version>
</dependency>
- 修改配置文件:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" />
</bean>
同時建議將數據庫配置提取到jdbc.properties
文件,通過<context:property-placeholder>
標簽加載,提升配置靈活性。
二、模擬轉賬開發:業務邏輯與事務需求
轉賬場景是檢驗數據庫操作和事務管理的典型場景,涉及扣減余額和增加余額兩個核心步驟,必須保證原子性——要么全部成功,要么全部回滾。
2.1 業務層與持久層設計
服務接口定義
public interface AccountService {void pay(String out, String in, double money); // 轉賬方法
}
持久層實現(基于JdbcTemplate)
public class AccountDaoImpl implements AccountDao {private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}// 付款:扣減余額@Overridepublic void outMoney(String out, double money) {jdbcTemplate.update("update account set money = money - ? where name = ?", money, out);}// 收款:增加余額@Overridepublic void inMoney(String in, double money) {jdbcTemplate.update("update account set money = money + ? where name = ?", money, in);}
}
服務層實現
public class AccountServiceImpl implements AccountService {private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}@Overridepublic void pay(String out, String in, double money) {accountDao.outMoney(out, money); // 扣錢accountDao.inMoney(in, money); // 加錢}
}
2.2 未加事務的問題:數據不一致風險
若轉賬過程中(如扣錢后)發生異常(如服務器崩潰),會導致付款方余額已扣減但收款方未到賬,破壞數據一致性。例如:
@Override
public void pay(String out, String in, double money) {accountDao.outMoney(out, money); // 成功執行int a = 1/0; // 模擬異常accountDao.inMoney(in, money); // 未執行
}
此時需要事務管理來保障操作的原子性。
三、Spring事務管理:聲明式與注解式實現
Spring提供了兩種事務管理方式:編程式事務(手動編寫事務代碼)和聲明式事務(推薦,通過配置或注解管理)。
3.1 聲明式事務:基于XML配置
步驟1:配置事務管理器
<!-- 平臺事務管理器,基于數據源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" />
</bean>
步驟2:定義事務通知
<!-- 事務通知:指定哪些方法需要事務增強 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- pay方法配置:默認隔離級別, REQUIRED傳播行為 --><tx:method name="pay" isolation="DEFAULT" propagation="REQUIRED" /><!-- 所有find開頭的方法設為只讀 --><tx:method name="find*" read-only="true" /></tx:attributes>
</tx:advice>
步驟3:AOP織入事務
<aop:config><!-- 將事務通知應用到指定切入點 --><aop:advisor advice-ref="txAdvice" pointcut="execution(public * com.qcbyjy.*.AccountServiceImpl.pay(..))" />
</aop:config>
3.2 注解式事務:更簡潔的開發體驗
步驟1:開啟事務注解支持
在配置文件中添加:
<tx:annotation-driven transaction-manager="transactionManager" />
步驟2:在服務方法上添加@Transactional
注解
@Service
@Transactional // 類級注解:對所有方法啟用事務
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Overridepublic void pay(String out, String in, double money) {accountDao.outMoney(out, money); int a = 1/0; // 異常會觸發事務回滾accountDao.inMoney(in, money);}
}
@Transactional
可作用于類或方法,推薦作用于方法以精準控制。- 關鍵屬性:
isolation
:隔離級別(如Isolation.REPEATABLE_READ
)。propagation
:傳播行為(如Propagation.REQUIRED
,默認值)。rollbackFor
:指定需要回滾的異常類型。
3.3 純注解配置:全Java代碼管理
通過@Configuration
類替代XML配置,實現完全注解化開發:
@Configuration
@ComponentScan(basePackages="com.qcbyjy.demo6")
@EnableTransactionManagement // 開啟事務注解
public class SpringConfig {@Bean(name="dataSource")public DataSource createDataSource() throws Exception {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setUrl("jdbc:mysql:///spring_db");dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource;}@Bean(name="jdbcTemplate")public JdbcTemplate createJdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);}@Bean(name="transactionManager")public PlatformTransactionManager createTransactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}
四、核心總結:三大模塊的協同作用
模塊 | 作用描述 |
---|---|
JDBC模板 | 封裝JDBC操作,簡化數據庫訪問,支持連接池和結果集映射。 |
模擬轉賬業務 | 體現事務的必要性,通過扣減/增加余額的原子性需求,引出事務管理的核心價值。 |
聲明式事務 | 基于AOP實現非侵入式事務管理,通過配置或注解靈活控制事務范圍和行為。 |
通過這三大模塊的結合,Spring框架實現了高效的數據訪問、安全的業務邏輯和便捷的事務控制,成為企業級開發中不可或缺的核心技術。開發者只需專注業務邏輯,底層的資源管理和事務保障由框架自動完成,極大提升了開發效率和系統穩定性。