day03-spring与数据库操作的框架解析即dataSource的获取(JDBC)、使用spring中已经有的事务进行JDBC操作



数据库的操作:
   固定的代码(模板,datasource的获取)+动态的参数(变化的SQL语句、参数等等)
   模板模式的编程
代码的结构的解析:
 JdbcTemplate extends JdbcAccessor
    JdbcTemplate(){
   
    }
    JdbcTemplate(DataSource dataSource){
  this.dataSource = dataSource;
    }
    setDataSource(DataSource dataSource){
  this.dataSource = dataSource;
    }



 public abstract class JdbcDaoSupport extends DaoSupport {
  private JdbcTemplate jdbcTemplate;
  public final void setDataSource(DataSource dataSource) {
   if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) {
    this.jdbcTemplate = createJdbcTemplate(dataSource);
    initTemplateConfig();
   }
  }
  protected JdbcTemplate createJdbcTemplate(DataSource dataSource) {
   return new JdbcTemplate(dataSource);
  }
  public final DataSource getDataSource() {
   return (this.jdbcTemplate != null ? this.jdbcTemplate.getDataSource() : null);
  }
  public final void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
   this.jdbcTemplate = jdbcTemplate;
   initTemplateConfig();
  }
  public final JdbcTemplate getJdbcTemplate() {
    return this.jdbcTemplate;
  }
 }
   说明:
       1、在JdbcDaoSupport中可以注入dataSource
       2、在JdbcDaoSupport中注入的dataSource通过createJdbcTemplate方法
   传入到JdbcTemplate
              3、可以通过JdbcDaoSupport得到JdbcTemplate的引用
 HibernateTemplate
 SqlMapClientTemplate
 JdoTemplate

spring结合jdbc的写法:共七种写法
   1、
        类的写法:
  PersonDao extends JdbcDaoSupport
 配置文件:
        1、在PersonDao中注入DataSource
        2、在PersonDao中注入JdbcTemplate
             在JdbcTemplate中注入dataSource
                       1、可以利用构造器的形式
                       2、可以利用setter的方式
   2、
        类的写法
         PersonDao{
     private JdbcTemplate   jdbcTemplate;
  }
        配置文件:
              在PersonDao中注入JdbcTemplate
                     在JdbcTemplate中注入dataSource
                              1、可以利用构造器的形式
                              2、可以利用setter的方式
   3、
 类的写法
         PersonDao extends JdbcTemplate{
  
  }
 配置文件:
         利用构造器或者setter方法注入dataSource

总结:
     无论什么样的形式,最终是把dataSource传入到了jdbcTemplate中,只要有了数据源,就可以进行一系列crud操作。


package com.itheima.dao;

public interface PersonDao {
	void savePerson();
}


package com.itheima.dao.impl;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.itheima.dao.PersonDao;

public class PersonDaoImpl extends JdbcDaoSupport implements PersonDao {

	@Override
	public void savePerson() {
		// TODO Auto-generated method stub
		this.getJdbcTemplate().execute("insert into person(name) values(‘ccc‘)");
	}

}

package com.itheima.service;

public interface PersonService {
	void savePerson();
}


package com.itheima.service.impl;

import com.itheima.dao.PersonDao;
import com.itheima.service.PersonService;

public class PersonServiceImpl implements PersonService {
	private PersonDao personDao;
	
	public void setPersonDao(PersonDao personDao) {
		this.personDao = personDao;
	}

	@Override
	public void savePerson() {
		/**
		 * 如果有事务,则以下操作将不会执行,都不会成功。因为有异常 。
		 * 要么都成功。
		 */
		this.personDao.savePerson();
		//int i = 1/0;
		this.personDao.savePerson();
	}

}


spring的配置文件applicationContext.xml:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<value>classpath:jdbc.properties</value>
		</property>
	</bean>
    
  	<bean id="dataSource" destroy-method="close"
		class="org.apache.commons.dbcp.BasicDataSource">
		<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>
	<!-- 
		把dao,service层的类放入到spring容器中
	 -->
	<bean id="personDao" class="com.itheima08.spring.jdbc.transaction.xml.dao.impl.PersonDaoImpl">
		<property name="dataSource">
			<ref bean="dataSource"/>
		</property>
	</bean>
	<bean id="personService" class="com.itheima08.spring.jdbc.transaction.xml.service.impl.PersonServiceImpl">
		<property name="personDao">
			<ref bean="personDao"/>
		</property>
	</bean>
	
	<!-- 
		事务管理器
	 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource">
			<ref bean="dataSource"/>
		</property>
	</bean>
	<!-- 
		规定事务的策略问题和事务管理器的问题
	 -->
	<tx:advice id="tx" transaction-manager="transactionManager">
		<tx:attributes>
			<!-- 
				name指定目标方法的范围
				  save*  就是以save开头的方法
				  propagation  传播属性
				      	用来解决嵌套事务的问题
				  isolation    隔离机制
				  read-only
				      true    只读事务
				      false   读写事务
			 -->
			<tx:method name="save*" 
				propagation="REQUIRED" 
				isolation="DEFAULT" 
				read-only="false"/>
		</tx:attributes>
	</tx:advice>
	
	<aop:config>
		<aop:pointcut 
			expression="execution(* com.itheima08.spring.jdbc.transaction.xml.service.impl.PersonServiceImpl.*(..))" 
			id="perform"/>
		<aop:advisor advice-ref="tx" pointcut-ref="perform"/>
	</aop:config>
</beans>


spring事务的架构:

1、顶级接口
	public interface PlatformTransactionManager {
	        //得到事务
		TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
		//提交事务
		void commit(TransactionStatus status) throws TransactionException;
		//事务的回滚
		void rollback(TransactionStatus status) throws TransactionException;
	}

	TransactionStatus
		boolean isNewTransaction();
2、抽象类
	public abstract class AbstractPlatformTransactionManager implements PlatformTransactionManager{
		//获取事务
		public final TransactionStatus 
			getTransaction(TransactionDefinition definition) 
				throws TransactionException {
			//抽象方法
			Object transaction = doGetTransaction();
		}
		//将来谁继承该抽象类,谁实现该方法
		protected abstract Object doGetTransaction() throws TransactionException;

		public final void commit(TransactionStatus status) throws TransactionException {
		
		}

		public final void rollback(TransactionStatus status) throws TransactionException {
		
		}
	}
3、实现类
	DataSourceTransactionManager
	HibernateTransactionManager
	JdoTransactionManager
	...






案例分析:
    public class PersonDao{
	private PlatformTransactionManager platformTransactionManager;
	public void setPlatformTransactionManager(PlatformTransactionManager platformTransactionManager){
		this.platformTransactionManager = PlatformTransactionManager;
	}
    }


spring的声明式事务处理

这时spring容器是一个切面。

注意:要使用spring的事务管理来管理程序中的事务,就要遵守spring的规范(有一个接口、一个抽象类、三个实现类(JDBC、hibernate、))。
在使用spring的事务管理时,不需要写切面类,spring已经实现了,不需要关心。程序员只要写crud操作就行和声明事务。


事务管理器:你使用的是哪种技术,JDBC、hibernate,不管你是使用哪种技术,spring帮你实现完全的面向接口编程



day03-spring与数据库操作的框架解析即dataSource的获取(JDBC)、使用spring中已经有的事务进行JDBC操作,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。