zoukankan      html  css  js  c++  java
  • 数据访问

     spring把数据访问过程中固定与变化的部分明确地划为两类:模板和回调

    spring提供了各种数据访问模板,分别适用于不同的持久机制,jdbc,hibernate等,使用数据访问模板只需要把它配置为spring context里的bean

    配置数据源

    方法1: JNDI

    Java Naming and Directory Interfaces,通过名称获取数据源

    从jndi中获取数据源

     <jee:jndi-lookup id="dataSource"
                jndi-name="/jdbc/SpitterDS" //制定jndi里的数据源名称
                resource-ref="true" />
    

     resource-ref:为true时,jnidi-name会被添加java:comp/env/,从应用程序服务器的JNDI目录里获取数据源。

    2. 数据源连接池

    如果无法从jndi获得数据源,可以使用数据源连接池,spring没有提供数据源连接池。DBCP有提供。

    我们只需要配置 BasicDataSource bean

    <bean id="dataSource"
          class="org.apache.commons.dbcp.BasicDataSource">
      <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
      <property name="url"
                value="jdbc:hsqldb:hsql://localhost/spitter/spitter" />
      <property name="username" value="sa" />
      <property name="password" value="" />
      <property name="initialSize" value="5" />
      <property name="maxActive" value="10" />
    </bean>

    3. 基于JDBC驱动的数据源

    两种数据源

    DriverManagerDataSource—每个连接请求都建立一个连接,没有进行池管理

    SingleConnectionDataSource—每次请求返回同一个连接,可以看作只有一个连接的池。不适合多线程

    <bean id="dataSource"
                  class="org.springframework.jdbc.datasource.
                     DriverManagerDataSource">
              <property name="driverClassName"
                        value="org.hsqldb.jdbcDriver" />
              <property name="url"
                        value="jdbc:hsqldb:hsql://localhost/spitter/spitter" />
              <property name="username" value="sa" />
              <property name="password" value="" />
            </bean>

    使用传统的jdbc代码,直接连接,使用sql插入和查询,代码重复。

    使用jdbc模板

    三种模板

    • JdbcTemplate—The most basic of Spring’s JDBC templates, this class provides simple access to a database through JDBC and simple indexed-parameter queries.

    • NamedParameterJdbcTemplate—This JDBC template class enables you to per- form queries where values are bound to named parameters in SQL, rather than indexed parameters

    • SimpleJdbcTemplate—This version of the JDBC template takes advantage of

      Java 5 features such as autoboxing, generics, and variable parameter lists to sim- plify how a JDBC template is used. 

      配置template

      <bean id="jdbcTemplate"
            class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
         <constructor-arg ref="dataSource" />
      </bean>

      将template装配到dao

      public class JdbcSpitterDAO implements SpitterDAO {
      ...
        private SimpleJdbcTemplate jdbcTemplate;
        public void setJdbcTemplate(SimpleJdbcTemplate jdbcTemplate) {
          this.jdbcTemplate = jdbcTemplate;
        }
      public void addSpitter(Spitter spitter) {
        jdbcTemplate.update(SQL_INSERT_SPITTER,//简化,且exception的处理也被隐藏了
      
                spitter.getUsername(),
                spitter.getPassword(),
                spitter.getFullName(),
                spitter.getEmail(),
                spitter.isUpdateByEmail());
      
        spitter.setId(queryForIdentity());
      }
      
      }
      bean id="spitterDao" class="com.habuma.spitter.persistence.SimpleJdbcTemplateSpitterDao">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
      </bean>

      JPA:

      JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

      基于jpa的程序使用 EntityManagerFactory来获取EnitityManager 的实例,JPA规范定义了两种实体管理器

      1 程序管理型:程序直接向实体管理器工厂请求一个实体管理器由程序负责打开,关闭,在事务中控制管理器不适合运行于在Java EE容器的独立程序。通过调用createEntityManagerFactory() method of the PersistenceProvider. 

      2 容器管理型: 由Java EE容器创建和管理,实体管理器是通过注入或利用JNDI直接获得,这种类型适合希望不考虑persistence.xml的特殊性。

      这两个管理器实现同一个 EntityManager接口,区别只在于创建和管理方式。

      配置程序管理型的JPA

      配置信息来源于persistence.xml,xml定义一个多多个持久单元,对应一个数据源

      <persistence xmlns="http://java.sun.com/xml/ns/persistence"
          version="1.0">
        <persistence-unit name="spitterPU">
          <class>com.habuma.spitter.domain.Spitter</class>
          <class>com.habuma.spitter.domain.Spittle</class>
          <properties>
            <property name="toplink.jdbc.driver"
                value="org.hsqldb.jdbcDriver" />
            <property name="toplink.jdbc.url" value=
                "jdbc:hsqldb:hsql://localhost/spitter/spitter" />
            <property name="toplink.jdbc.user"
                value="sa" />
            <property name="toplink.jdbc.password"
                value="" />
          </properties>
        </persistence-unit>
      </persistence>

      spring中定义bean LocalEntityManagerFactoryBean 

      <bean id="emf"
            class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="spitterPU" /> //持久单元的名称
      </bean>

      配置容器管理型 JPA

      <bean id="emf" class= "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" /> //上面提到的datasource
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
      </bean>
      <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
      
        <property name="database" value="HSQL" />  // 数据库类型
        <property name="showSql" value="true"/>
        <property name="generateDdl" value="false"/>
        <property name="databasePlatform"
                  value="org.hibernate.dialect.HSQLDialect" />
      </bean> 

       

      在spring上下文中配置jpaVendorAdapter属性用于设置特定JPA实现的细节,不同的数据库平台不同,包括:EclipseLinkJpaVendorAdapter HibernateJpaVendorAdapter OpenJpaVendorAdapter TopLinkJpaVendorAdapter 

       

  • 相关阅读:
    Linux设置系统时间并同步到硬件
    centos6.9安装mysql5.7.22并设置初始密码
    mysql修改数据库文件存储位置
    mysql1.7(mysql优化,mysql-mmm软件介绍,mysql高可用集群。)
    mysql1.6(主从同步,数据读写分离)
    Mysql1.5(binlog增量备份与恢复,innobackupex)
    Mysql1.4(用户授权,权限撤销;图形管理工具,数据备份-恢复)
    MYSQL1.3(存储引擎,数据导入导出,管理表记录)
    MYSQL1.2(字段管理,索引类型)
    mysql1.1(搭建,数据类型,基本使用)
  • 原文地址:https://www.cnblogs.com/zengyou/p/2773510.html
Copyright © 2011-2022 走看看