• SpringAccess数据库(oracle)构造


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

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

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

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

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

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

    注:服务对象本身并不会处理数据訪问。而是将数据訪问托付给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<?>;


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

  • 相关阅读:
    算法疑难(js实现)---5、变态跳台阶
    算法疑难(js实现)---4、跳台阶(记忆化递归)
    算法疑难(js实现)---3、两个栈来实现一个队列
    算法疑难(js实现)---2、重建二叉树
    Ext的Panel总结(好文章)
    Extjs datefield 日历控件中文显示
    EXTJS项目实战经验总结一:日期组件的change事件:
    ExtJs内的datefield控件选择日期过后的事件监听select
    ExtJs FormPanel布局
    开发extjs常用的插件
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4864961.html
Copyright © 2020-2023  润新知