spring02
jdbcTemplate的使用
c3p0&&dbcp
DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由Apache开发
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
dbcp没有自动回收空闲连接的功能
c3p0有自动回收空闲连接功能
bean.xml
1 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 2 <property name="dataSource" ref="dataSource"></property> 3 </bean> 4 5 <!-- 配置数据源--> 6 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 7 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 8 <property name="url" value="jdbc:mysql://localhost:3306/demo"></property> 9 <property name="username" value="root"></property> 10 <property name="password" value="root"></property> 11 </bean>
例:
1 public static void main(String[] args) { 2 //准备数据源:spring的内置数据源 3 DriverManagerDataSource ds = new DriverManagerDataSource(); 4 ds.setDriverClassName("com.mysql.jdbc.Driver"); 5 ds.setUrl("jdbc:mysql://localhost:3306/eesy"); 6 ds.setUsername("root"); 7 ds.setPassword("1234"); 8 9 //1.创建JdbcTemplate对象 10 JdbcTemplate jt = new JdbcTemplate(); 11 //给jt设置数据源 12 jt.setDataSource(ds); 13 //2.执行操作 14 jt.execute("insert into account(name,money)values('ccc',1000)"); 15 }
dao中使用jdbcTemplate
dao 中定义 JdbcTemplate
1 interface IAccountDao 2 3 public class AccountDaoImpl implements IAccountDao{ 4 5 private JdbcTemplate jdbcTemplate; 6 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 7 this.jdbcTemplate = jdbcTemplate; 8 // 9 } 10 11 } 12 13 14 15 <bean id="accountDao" class="com.xxx.dao.impl.AccountDaoImpl"> 16 <!-- 注入 jdbcTemplate --> 17 <property name="jdbcTemplate" ref="jdbcTemplate"></property> 18 </bean> 19 20 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 21 <property name="dataSource" ref="dataSource"></property> 22 </bean> 23 24 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 25 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 26 <property name="url" value="jdbc:mysql://localhost:3306/xxx"></property> 27 <property name="username" value="root"></property> 28 <property name="password" value="root"></property> 29 </bean>
dao 继承 JdbcDaoSupport
1 public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao { 2 3 @Override 4 public Account findAccountById(Integer id) { 5 //getJdbcTemplate()方法是从父类上继承下来的。 6 List<Account> list = getJdbcTemplate().query("select * from account where 7 id = ? ",new AccountRowMapper(),id); 8 return list.isEmpty()?null:list.get(0); 9 10 // 11 12 } 13 14 <bean id="accountDao" class="com.xxx.dao.impl.AccountDaoImpl"> 15 <property name="dataSource" ref="dataSource"></property> 16 </bean> 17 18 <!-- 配置数据源,--> 19 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 20 21 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 22 <property name="url" value="jdbc:mysql://localhost:3306/xxx"></property> 23 <property name="username" value="root"></property> 24 <property name="password" value="root"></property> 25 </bean>
事务
- 原子性:整体 【原子性是指事务包含的所有操作要么全部成功,要么全部失败】
- 一致性:数据 【一个事务执行之前和执行之后都必须处于一致性状态】
- 隔离性:并发 【对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。】
- 持久性:结果 【持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的】
隔离问题
- 脏读:一个事务读到另一个事务未提交的内容【读取未提交内容】
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果
- 不可重复读:前后多次读取,数据内容不一致
- 虚读(幻读):一个事务读到另一个事务已提交的内容(update)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据
- Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别, 可能导致大量的超时现象和锁竞争。
传播行为
REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选
择(默认值)
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
基于xml的声明式事务控制
1 <!-- 配置 service --> 2 <bean id="accountService" class="com.xxx.service.impl.AccountServiceImpl"> 3 <property name="accountDao" ref="accountDao"></property> 4 </bean>
5 <!-- 配置 dao --> 6 <bean id="accountDao" class="com.xxx.dao.impl.AccountDaoImpl"> 7 <!-- 注入 dataSource --> 8 <property name="dataSource" ref="dataSource"></property> 9 </bean>
10 <!-- 配置数据源 --> 11 <bean id="dataSource" 12 class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 13 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 14 <property name="url" value="jdbc:mysql:///xxx"></property> 15 <property name="username" value="root"></property> 16 <property name="password" value="root"></property> 17 </bean> 18 19 <!-- 配置一个事务管理器 --> 20 <bean id="transactionManager" 21 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 22 <!-- 注入 DataSource --> 23 <property name="dataSource" ref="dataSource"></property> 24 </bean> 25 26 <!--配置事务的通知引用事务管理器--> 27 <!-- 事务的配置 --> 28 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 29 </tx:advice> 30 31 <tx:attributes> 32 <tx:method name="*" read-only="false" propagation="REQUIRED"/> 33 <tx:method name="find*" read-only="true" propagation="SUPPORTS"/> 34 </tx:attributes> 35 36 <!-- 配置 aop --> 37 <aop:config> 38 <!-- 配置切入点表达式 --> 39 <aop:pointcut expression="execution(* com.xxx.service.impl.*.*(..))" 40 id="pt1"/> 41 </aop:config> 42 43 <!-- 在 aop:config 标签内部: 建立事务的通知和切入点表达式的关系 --> 44 <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/>
<tx:attributes/>
read-only:是否是只读事务。默认 false,不只读。
isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。
propagation:指定事务的传播行为。
timeout:指定超时时间。默认值为: -1。永不超时。
rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。没有默认值,任何异常都回滚。
no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时,事务回
滚。没有默认值,任何异常都回滚。
基于注解配置
<!-- 开启 spring 对注解事务的支持 --> <tx:annotation-driven transaction-manager="transactionManager"/>