陈科朝: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" alt="" 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<?>;

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

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

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

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

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

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:Leshami      原文地址:http://blog.csdn.net/ ...

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

    Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...

  4. spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置

    spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...

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

    在开发基于数据库的应用系统时,需要在项目中进行数据源的配置来为数据 库的操作取得数据库连接.配置不同数据库的数据源的方法大体上都是相同的,不同的只是不同数据库的JDBC驱动类和连接URL以及相应的数据 ...

  6. JDBC(用Eclipse操作数据库Oracle)的基础操作集合

    JDBC: JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编 ...

  7. [数据库]Oracle和mysql中的分页总结

    Mysql中的分页 物理分页 •在sql查询时,从数据库只检索分页需要的数据 •通常不同的数据库有着不同的物理分页语句 •mysql物理分页,采用limit关键字 •例如:检索11-20条 selec ...

  8. Ubuntu16.04下安装数据库oracle客户端

    在Ubuntu16.04下安装oracle数据库客户端,使Django项目连接到远程Oracle数据库. 1.下载oracle客户端安装包: 进入官网http://www.oracle.com/tec ...

  9. 不同数据库oracle mysql SQL Server DB2 infomix sybase分页查询语句

    在不同数据库中的使用的分页查询语句: 当前页:currentpage 页大小:pagesize 1. Oracle数据库 select * from (select A.*,rownum rn fro ...

随机推荐

  1. Connecting Docker for Cloud Services using SDN and Network Virtualization

     Abstract The explosive scale of container CPUs needs highly efficient network virtualization Chal ...

  2. Unity UGUI——开源

    开源许可证:MIT/X11 来源托管网站:BitBucket

  3. MVC json

    1. .net MVC中Controller 在mvc中所有的controller类都必须使用"Controller"后缀来命名 并且对Action也有一定的要求: 必须是一个pu ...

  4. hdu 2391 Filthy Rich

    单纯dp 水一 处理时间点,第一行和第一列特殊处理: 其余的w[i][j]=show(w[i-1][j-1],w[i-1][j],w[i][j-1]); <span style="fo ...

  5. Cocos2d-x项目总结中的一些遇到的问题

    这几天在用Cocos2D-X尝试着做一个小游戏,当然不是创新,仅仅是单纯的模仿,就是为了将自己这段时间学到的技术应用于实践中. 在这个过程中.遇到了一些问题,在此特做一些总结,以免以后遇到类似的问题. ...

  6. jQuery来源学习笔记:扩展的实用功能

    // 扩展的实用功能 jQuery.extend({ // http://www.w3school.com.cn/jquery/core_noconflict.asp // 释放$的 jQuery 控 ...

  7. [转]Qt 智能指针学习

    从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...

  8. IOS本地化应用

    BK项目已完成7788,在项目的后期需要被翻译成多国语言版.为了适应全球多个国家使用多个存储. 应用本地化是分别对字符串.图片和 xib 或 storyboard 文件本地化,而传统的做法是对 xib ...

  9. DV工作流

  10. 非常基本的SQL 内外连接

    有些问题一直很郁闷,例如:为什么会存在大约在同一时间连接这个东西.如果外键为空,创建问题的声明时,将有一个外键约束失败. 后来,在精心研究,恩.外部连接(左连接.正确的连接). 事实上都是非常基础的东 ...