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"/>

 

 

 

 

 

 

 

posted @ 2019-11-16 17:05  曲阳阳  阅读(116)  评论(0编辑  收藏  举报