spring--数据库
spring访问数据库的原则是:模板--回调模式.采用的是设计模式中的
模板模式.
在项目中,数据库只可能用一种,可能是mysql,可能是oracle.甚至同一数据库实现对其的使用也有很多方法.如mysql可以通过jdbc,hibernate等方法进行.一旦我们定义好数据库的使用,就可以进行对应的操作.CURD.
因为所有的数据库相关操作都包括一些固定的步骤:
1.获得连接或其他资源;(不同数据库的实现方式可能不同,但在一个项目中一般只用一个)
2.开始事务.同上
3.处理事务(查找,更新,删除等).在同一项目中操作表有很多,所以此步是多变的.
4.得到结果.不同数据表肯定有不同结果,而且有时候要返回一个对象,有时候要返回多个,如List.所以此步也多变
5.提交或回滚(commit或rollback).数据库选中后此步肯定是统一的.
6.关闭连接或其他资源.同上
这里的模板回调如下:
将一些公用的,不变的步骤放在模板类中,将可变的放在回调类中.如上面的介绍,模板和回调的划分如下:
模式
回调
1.准备资源
2.开始事务
3.处理事务
4.得到结果
5.提交/回滚事务
6.关闭资源和错误处理
如上所述.一个项目中一般只选用一种数据库连接的实现方式.这里说的用模式方式实现体现这种性质的方式是在多种模式实现.不同模板实现上图中左侧方法的方式不同.而右侧的回调,不同方式也有不同的回调类.
模板主要有:
jdbc.core.JdbcTemplate JDBC连接
jdbc.core.nameparam.NameParameterJdbcTemplate 支持命名参数的JDBC连接
jdbc.core.simple.SimpleJdbcTemplate JDBC连接,Java 5 中进行了简化
orm.hibernate.HibernateTemplate Hibernate 2.x 版本中的实现
orm.hibernate3.HibernateTemplate Hibernate 3.x 版本中的实现
orm.ibatisSqlMapClientTemplate iBATIS SqlMap客户
orm.jpa.JpaTemplate Java存储API实体管理器
orm.toplink.TopLinkTemplate Oracle的TopLink
还有一些其他的模板.但不是主流的,上面JDBC肯定是最基本的,而且只是JDBC也有三种不同实现.
orm实现中最流利的就是hibernate和ibatis,上面列出了对应的实现.
模板的功能是提供公用的不变的方法,在代码中体现如:
jdbcTemplate.update(...);用来更新数据.
jdbcTemplate.query(...);用来查询.
上面是JdbcTemplate的应用,当然,我们先要将该对象添加到我们的类中才能使用.同样,其他模板在使用前也要先在项目中存在.我们可以在类中通过new 来实例化.但这样就将数据库实现耦合了.spring以解耦合为目标,所以我们也可以通过注入的方式来实现.但模板只定义了使用数据库的一些方法,但使用的是哪个数据库呢.这些数据是在哪里定义的.通常是在数据源中定义.
而数据源的定义也有三种:
1.jndi
2.jdbc
3.连接池
一.JNDI方式:
项目肯定是要发布在容器中的.窗口有很多,有J2EE容器诸如jboss,websphere,也有普通点的tomcat.但如果容器支持jndi,我们 就可以通过它来得到数据源.以tomcat为例.tomcat是支持jndi的,我们在它的配置文件里面定义一个数据源,在项目中(当然得布置在它上面) 就可以通过JNDI获得它.tomcat配置数据源的方式为:
配置:
GlobalNamingResources
<GlobalNamingResources>
<ResourceParams name="jdbc/MyDs">
<parameter>
<name>driverClassName</name>
<value>org.hsql.jdbcDriver</value>
</parameter>
<parameter>
<name>driverName</name>
<value>jdbc:HypersonicSQL:database</value>
</parameter>
<parameter>
<name>user</name>
<value>dbusername</value>
</parameter>
<parameter>
<name>password</name>
<value>dbpassword</value>
</parameter>
</ResourceParams>
</GlobalNamingResources>
tomcat更多配置及解释请参考:
在tomcat中配置好数据源后,在spring配置文件中可能如下引用:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
<property name="jndiName" value="jdbc/MyDs" />
<property name="resourceRef" value="true" />
</bean>
这样在配置文件中就定义好了,然后就可以将这个数据源配置到我们的模板中.这个后面再说,先把其他两种数据源定义方式介绍完.
二.JDBC方式:
因为jdbc是java最基本的访问数据库的方式.所以它对数据源的定义也是最基本的,直接用的jdbc包中的一些内容.jdbc中也现成的 datasource可以用:包含在org.springframework.jdbc.datasource包中.可选的数据源有两种:
DrivermanagerDataSource:每个连接请求都新建一个连接.但没有连接池管理.
SingleConnectionDataSource:每个连接请求都返回同一连接.
定义方式如下:
<bean id="dataSource" class="org.springframework.jdbc.datasource.上面的两个中的一个,自己选">
<property name="driverClassName" value="数据库驱动名称如:com.mysql.jdbc.Driver"/>
<property name="url" value="数据库地址,如:jdbc:mysql://localhost:3306/RSINFOREGSYS-2?useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="数据库用户名,如:root" />
<property name="password" value="数据库密码,如root" />
</bean>
三.连接池方式:
所谓连接池就是将数据库连接放在一个地方集中进行管理,用户请求的时候从池中获取.释放后放回池中.有点象缓存.同时它还有些管理,如最大连接,因为池的 容量有限,如果当前数据库的连接数超过最大数时,新请求的连接就会进行等待.诸如此许多功能.所以连接池是首选的方式,但如果项目较小,不用考虑效率等问 题,用JDBC方式比较直接.相反JNDI倒是最不常用的方式,因为它将项目和web容器耦合了.一般情况下我们希望只需要更改项目的配置就能更改数据库 的配置.而不是改动web容器.
当使用连接池来进行管理的时候,我们需要提供连接池功能的数据源.这样的源有很多.最基本的是DBCP,它只是提供数据源功能,是用何数据库还是得自己决 定,所以看到下面的配置中还是要我们输入数据驱动的名称和数据库地址.而下面的initialSize和maxActive配置的是扩展功能的配置.
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/RSINFOREGSYS-2" />
<property name="username" value="root" />
<property name="password" value="" />
<property name="initialSize" value="5" />
<property name="maxActive" value="10" />
</bean>
另一个比较常用的是
c3p0数据池:
<!-- 数据源配置:MySQL501 -->
<bean id="mysqlDataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/RSINFOREGSYS-2" />
<property name="user" value="root" />
<property name="password" value="" />
<!--连接池中保留的最小连接数 -->
<property name="minPoolSize" value="5" />
<!--连接池中保留的最大连接数 Default: 15 -->
<property name="maxPoolSize" value="30" />
<!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间 Default: 3 -->
<property name="initialPoolSize" value="10" />
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃 Default: 0 -->
<property name="maxIdleTime" value="0">
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 Default: 3 -->
<property name="acquireIncrement" value="8" />
</bean>
不同的连接池的属性不同.用的时候自己查相关介绍就可以了.