SpringAccess数据库(oracle)构造

陈科朝:http://blog.csdn.net/u013474104/article/details/44279309

================

1.spring 对数据库訪问的支持

当我们开发持久层的时候。我们面临着多种选择。比方使用JDBC、Hibernate、java持久化API或其他持久化框架。幸好的是spring可以支持全部这些持久化机制。

DAO(data access boject)数据訪问对象,这个名字就非常形象描写叙述了DAO在应用程序中所扮演的角色。

DAO提供了数据的读取、写入到数据库中的一种方式。它们应该以接口的方式公布功能,而应用程序的其他部分就能够通过接口来进行訪问了。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ3NDEwNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="font-size:18px">

注:服务对象本身并不会处理数据訪问。而是将数据訪问托付给DAO。DAO接口确保其与服务对象的松耦合。

2.配置数据源

spring提供了在spring上下文中配置数据源Bean的多种方式,包含:

a.通过JDBC驱动程序定义的数据源;

b.通过JNDI查找的数据源;

c.连接池的数据源;

接下我们就专门来讲讲从使用连接池获取连接的数据源!

(即c点)

上下文配置Bean的代码:

<!--配置数据源 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
		<property name="username" value="wwo"/>
		<property name="password" value="wwo"/>
		<!-- 连接池启动时的初始值 -->
		<property name="initialSize" value="3" />
		<!-- 连接池的最大值 -->
		<property name="maxActive" value="300" />
		<!-- 最大空暇值.当经过一个高峰时间后,连接池能够慢慢将已经用不到的连接慢慢释放一部分,一直降低到maxIdle为止 -->
		<property name="maxIdle" value="2" />
		<!-- 最小空暇值.当空暇的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
		<property name="minIdle" value="1" />
		<!-- end -->
	</bean>

注:JDBC驱动数据源并没有池的概念,因此没有存在池属性的配置!

好了,到这一步,我们已经完毕了通过数据源建立了与数据库的连接。接下来就是实际訪问数据库了。

3.在Spring中集成Hibernate

Hibernate一些特性:

a.延迟载入(Lazy loading):比如一个Bean对象由其属性及还有一个Bean对象组成,假设我们仅仅关注的仅仅是这个Bean对象的属性。那么我们能够借助于延迟载入,仅仅抓取须要的数据。

b.预先抓取(Eager fetching):这与延迟载入是相对的,一个Bean所关联的其他Bean都会被查询出来,这就节省了多次查询的成本;

c.级联(Cascading):有时候删除一个Bean对象后,也希望其同一时候能数据库中删除掉与其关联的其他Bean。

Spring对Hibernate ORM框架的支持提供了与这些框架集成点以及一些附加的服务,例如以下所看到的:

a.Spring声明式事务的集成支持。

b.透明的异常处理;

c.线程安全的、轻量级的模板类;

d.DAO支持类。

e.资源管理。

4.声明会话工厂(Session Factory)

使用Hibernate的主要接口是org.hibernate.Session。Session提供了主要的数据訪问功能,如保存、更新、删除以及从数据库载入对象的功能。

能过借助于Hibernate的SessionFactory来获取Session对象,SessionFactory主要负责Hibernate Session的打开、关闭以及管理。

配置在xml上下文的Bean例如以下:

<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="packagesToScan">
			<!--扫描一下实体文件夹 -->
			<list>
				<value>com.blog.entity</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql"> true</prop>
				<prop key="current_session_context_class">thread</prop>
			</props>
		</property>
</bean>

5.创建自己的基础DAO类

Spring可以通过Spring的Hibernate模板来保证每一个事务都使用同一个会话。既然Hibernate可以对其自己进行管理,那就不必要使用模板类了。接下我们直接将Hibernate Session装配到自己的DAO类中。

/**
 * 基础dao
 *
 * @author ckz
 *
 * @param <T>
 */
public abstract class BaseDAO<T> {
	private Class<T> baseEntity;

	protected BaseDao(Class<T> baseEntity) {
		this.baseEntity = baseEntity;
	}

	/**
	 * 注入sessionFactory
	 */
	@Autowired
	private SessionFactory sessionFactory;

	/**
	 * 获得session
	 *
	 * @return
	 */
	protected Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}

	/**
	 * 保存
	 *
	 * @param entity
	 * @throws Exception
	 */
	public void add(T entity) throws Exception {
		getCurrentSession().save(entity);
	}

	/**
	 * 调用存储过程
	 *
	 * @param proName
	 * @return
	 */
	public CallableStatement citePro(final String proName){
		Session session = getCurrentSession();
		CallableStatement proc=session.doReturningWork(
	                new ReturningWork<CallableStatement>() {
	                    @Override
	                    public CallableStatement execute(Connection connection) throws SQLException{
	                    	CallableStatement resultSet = connection.prepareCall(proName);
	                        return resultSet;
	                    }
	                }
	        );
		return proc;
	}

	/**
	 * 更新
	 *
	 * @param entity
	 * @throws Exception
	 */
	public void update(T entity) throws Exception {
		getCurrentSession().update(entity);
	}

	/**
	 * 保存或更新
	 *
	 * @param entity
	 * @throws Exception
	 */
	public void saveOrUpdate(T entity) throws Exception {
		getCurrentSession().saveOrUpdate(entity);
	}

	/**
	 * 删除
	 *
	 * @param entity
	 * @throws Exception
	 */
	public void delete(T entity) throws Exception {
		getCurrentSession().delete(entity);
	}

	/**
	 * 依据id获取对象
	 *
	 * @param Id
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T getById(final Serializable Id) {
		return (T) getCurrentSession().get(this.baseEntity, Id);
	}
}

注:

1.T表示的是泛型的參数类型,java泛型简述--http://blog.csdn.net/u013474104/article/details/44337145;

2.T - 由此
Class 对象建模的类的类型。

比如,String.class 的类型是 Class<String>

假设将被建模的类未知。则使用
Class<?>;

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-11 12:56:55

SpringAccess数据库(oracle)构造的相关文章

Oracle实例和Oracle数据库(Oracle体系结构)

--========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --========================================== /* 对于初接触Oracle 数据库的人来讲,很容易混淆的两个概念即是Oracle 实例和Oracle 数据库.这两 概念不同于SQL sever下的实例与数据库,当然也有些相似之处.只是在SQL server我们根本不需要花费太 多的精力去搞清SQL实

Oracle实例和Oracle数据库(Oracle体系结构)---转载

对于初接触Oracle 数据库的人来讲,很容易混淆的两个概念即是Oracle 实例和Oracle 数据库.这两 概念不同于SQL sever下的实例与数据库,当然也有些相似之处.只是在SQL server我们根本不需要花费太 多的精力去搞清SQL实例和数据库,因为它简单易于理解.下面简要说明一下SQL实例.数据库,更多的是讲 述Oracle下的实例及数据库. 一.SQL server中的实例与数据库 1.SQL中的实例指的是一个SQL server服务器上仅有一个缺省实例.缺省实例名即为机器名S

【转载】Oracle实例和Oracle数据库(Oracle体系结构)

免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:Leshami      原文地址:http://blog.csdn.net/leshami/article/details/5529239 --========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --======================================

各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包

在开发基于数据库的应用系统时.须要在项目中进行数据源的配置来为数据 库的操作取得数据库连接. 配置不同数据库的数据源的方法大体上都是同样的.不同的仅仅是不同数据库的JDBC驱动类和连接URL以及对应的数据库username和密 码不同.以下列出8中经常使用的数据库的数据库数据源配置和对应的JDBC驱动包. 1.Spring中数据源配置格式 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSour

Oracle 数据库(oracle Database)Select 多表关联查询方式

Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名2>[,…] [WHERE <筛选择条件表达式>] [GROUP BY <分组表达式> [HAVING<分组条件表达式>]] [ORDER BY <字段>[ASC | DESC]] 语句说明: []方括号为可选项 [GROUP BY <分组表达式&g

数据库oracle与mysql在语法上的区别

转自http://blog.csdn.net/huanghm88/article/details/8009048 数据库oracle与mysql在语法上的区别不是很多,但是也有一些.下面是部分参考: 1,oracle没有offet,limit,在mysql中我们用它们来控制显示的行数,最多的是分页了.oracle要分页的话,要换成rownum. 2,oracle建表时,没有auto_increment,所有要想让表的一个字段自增,要自己添加序列,插入时,把序列的值,插入进去. 3,oracle有

手工创建数据库oracle

手工创建数据库(madrid)export ORACLE_SID=madrid 1.创建口令文件orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle 2.创建参数文件vi $ORACLE_HOME/dbs/initmadrid.ora-----------------------------------------------------------db_name='madrid'compatible=11.2.0.4.0sg

数据库——oracle

为什么要用数据库? 文件存储: 1.不易于管理和分析(Linux操作系统下输入ls命令会卡死) 2.不易于共享 3.文件内容不断增大,不易于存储 数据库:用数据结构来管理.存储数据的仓库 DB:Database数据库 DBMS:数据库管理系统 数据库软件:Oracle  MySQL  db2    sql-server   sybase 关系型数据库:由二维表组成 非关系型数据库(NOSQL   not only  sql): Web  高并发性mongodb   redis 关系:二维表 二维

Java37: 数据库(Oracle)

DB2 Oracle Infomix MySQL Sybase SQLServer 1 什么是数据库 数据需要持久保存 (磁盘文件) 数据库(数据库管理系统)是个软件 安全,可靠,高效 数据库服务器,数据中心 关系型数据库 用表来存储数据的数据库 SQL 通用的关系型数据库的操作语言 不同数据库之间SQL有一定的差异 NoSQL Not only SQL 芒果DB...... T-SQL PLSQL SQL 中的分类 DDL(Data Definition Language) 数据定义语言 cr