spring和JDBC-第一篇(模版template与回调callback)

  如果我们使用原始的JDBC,在实际访问数据库的时候,我们必须初始化数据访问框架,打开链接,处理各种异常和关闭链接,如果上述操作出现任何问题,都有可能损坏或删除珍贵的企业数据。

spring则帮我们解决了这个问题。

注:本文内容来自spring实战第四版,根据自己的语言记录 

 在spring实战中,用了一个飞机的比喻为了让大家理解模版模式,这里我就不讲解了,大家可以在书中看到。

第一:总结通俗的来说------

            不论使用什么样的技术访问数据库,都是需要一些特定的数据访问步骤(链接,关闭,提交等),所以spring将数据访问过程中固定和可变的部分明确划分为两个不同的类:模版(template)和回调(callback)。模版管理过程中固定的部分,而回到处理自定义数据的访问代码。

如下图:

注:图片模仿spring实战中图片

如果所示,

        spring访问的固定部分---事务控制,管理资源以及处理异常

        实际跟程序相关的数据访问---sql语句,绑定参数以及整理结果,再回调的实现处理。

        书的作者说:事实证明,这是一个优雅的架构,因为你只需要关心自己的数据访问逻辑即可。

        注:他这个确实牛逼

第二:配置数据源---

        书中推荐使用JNDI获取数据源,这个我没搞过,暂时跳过

          其次是从数据源连接池获取 

    我粘一种书中没有记录的方式:DRUID,并粘一张自己的配置文件,其中包括了spirngtx事务控制

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

	<!-- 3.配置数据源 ,使用的alibba的数据库 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
		init-method="init" destroy-method="close">
		<!-- 基本属性 url、user、password -->
		<property name="driverClassName" value="${jdbc_driverClassName}" />
		<property name="url" value="${jdbc_url}" />
		<property name="username" value="${jdbc_username}" />
		<property name="password" value="${jdbc_password}" />

		<!-- 配置初始化大小、最小、最大 -->
		<property name="initialSize" value="10" />
		<property name="minIdle" value="10" />
		<property name="maxActive" value="50" />

		<!-- 配置获取连接等待超时的时间 -->
		<property name="maxWait" value="60000" />
		<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
		<property name="timeBetweenEvictionRunsMillis" value="60000" />

		<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
		<property name="minEvictableIdleTimeMillis" value="300000" />

		<property name="validationQuery" value="SELECT 'x'" />
		<property name="testWhileIdle" value="true" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />

		<!-- 打开PSCache,并且指定每个连接上PSCache的大小 如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。 -->
		<property name="poolPreparedStatements" value="false" />
		<property name="maxPoolPreparedStatementPerConnectionSize"
			value="20" />

		<!-- 配置监控统计拦截的filters -->
		<property name="filters" value="wall,stat" />
	</bean>



	<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<!-- 自动扫描mapping.xml文件 -->
		<property name="mapperLocations" value="classpath:mappers/*.xml"></property>
	</bean>


	<!-- DAO接口所在包名,Spring会自动查找其下的类 ,自动扫描了所有的XxxxMapper.xml对应的mapper接口文件,只要Mapper接口类和Mapper映射文件对应起来就可以了 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.shen.mapper" />
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
	</bean>

	<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
	<!-- 配置事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!--======= 事务配置 End =================== -->
	<!-- 配置基于注解的声明式事务 -->
	<!-- enables scanning for @Transactional annotations -->
	<!-- 不同传递性用法 -->
	<!-- @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) -->
	<!-- Propagation支持7种不同的传播机制: -->
	<!-- REQUIRED -->
	<!-- 业务方法需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就加入该事务,否则自己创建一个新的事务.这是spring默认的传播行为.。 -->
	<!-- SUPPORTS: -->
	<!-- 如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分,如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。 -->
	<!-- MANDATORY: -->
	<!-- 只能在一个已存在事务中执行,业务方法不能发起自己的事务,如果业务方法在没有事务的环境下调用,就抛异常 -->
	<!-- REQUIRES_NEW -->
	<!-- 业务方法总是会为自己发起一个新的事务,如果方法已运行在一个事务中,则原有事务被挂起,新的事务被创建,直到方法结束,新事务才结束,原先的事务才会恢复执行. -->
	<!-- NOT_SUPPORTED -->
	<!-- 声明方法需要事务,如果方法没有关联到一个事务,容器不会为它开启事务.如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行. -->
	<!-- NEVER: -->
	<!-- 声明方法绝对不能在事务范围内执行,如果方法在某个事务范围内执行,容器就抛异常.只有没关联到事务,才正常执行. -->
	<!-- NESTED: -->
	<!-- 如果一个活动的事务存在,则运行在一个嵌套的事务中.如果没有活动的事务,则按REQUIRED属性执行.它使用了一个单独的事务, 这个事务拥有多个可以回滚的保证点.内部事务回滚不会对外部事务造成影响, 
		DataSourceTransactionManager 事务管理器起效. 它只对 -->
	<tx:annotation-driven transaction-manager="transactionManager" />


</beans>

这里普通JDBC更新数据库的demo就不写了,大家知道很麻烦就可以了

简单概括一下,就是需要链接,创建语句,绑定参数,执行语句,处理异常,清理资源关闭这些。

                还有一种方式,spring的 JdbcTemplate,其实就是使用spring把上面标蓝的地方模块化,直接跳过。

大致就这些,之后可以专门开一下事务,和mybatis

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值