Just a little smile ^ ^

yoyo_zeng

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  112 随笔 :: 3 文章 :: 0 评论 :: 10万 阅读

 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 

     

posted on   yoyo_zeng  阅读(1379)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
点击右上角即可分享
微信分享提示