zoukankan      html  css  js  c++  java
  • 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"/>
  • 相关阅读:
    第三方登录原理
    django-rest-framework之 json web token方式完成用户认证
    HTTP Basic Authentication认证
    python 创建虚拟环境
    scrapy pipeline
    beautifulsoup 安装
    scrapy 安装
    Jmeter 安装
    css中的行高line-height
    html块级元素与行内元素
  • 原文地址:https://www.cnblogs.com/quyangyang/p/11870204.html
Copyright © 2011-2022 走看看