• Spring 与其他ORM 框架结合 作数据持久层解析 (转)


    一、概述
    (一)基本概念
    1、数据访问的关键技术
         我们可以将数据访问分为两个部分:一是获得数据源;二是进行数据库操作(增删改查)。
    2、获得数据源的几种方法
    因为只是为了记录一些关键的东西,以实用为主,因此没有过多的考虑措辞和学术上的严谨。这里指的是在Java中怎么能取得和数据源(DataSource)的联系,方法主要有传统的在程序中硬编码和通过XML注入。Spring提供三种XML注入:(1)使用Spring自带的DriverManagerDataSource;(2)使用DBCP连接池(3)使用Tomcat提供的JNDI。其中(1)可以配合Hibernate、iBatis等ORM一起使用(在XML配置文档中加入相应的配置段)。
    (二)框架图
    XML 注入数据源的三种方式
    Spring 自带的DriverManagerDataSource
    DBCP 连接池
    Tomcat 的JNDI
     

    数据库操作的两种方式
    Spring  JdbcTemplate
    使用 ORM 工具
     
    (三)何时使用什么
              现在大多数轻量级开发,都采用Hibernate作为持久层解决方案,因此可以作为首选。
    二、详细
    (一)数据源注入
    1、使用Spring自带的DriverManagerDataSource  
    配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
     "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
       <!   定dataSource à
       <bean id=  dataSource ” class=” org.springframework.jdbc.datasource.DriverManagerDataSource ”>
          <! —使用SQL Server    à
           <property name= ”driverClassName”>
              <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
           </property>
            <property name= ”url”>
              <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
           </property>
    <property name= ”name”>
              <value>admin</value>
           </property>
    <property name= ”msg”>
              <value>admin</value>
           </property>
        </bean>
     
        <! —设定 transactionManager à
        <bean id=  transactionManager 
    class=  org.springframework.jdbc.datasource.DataSourceTransactionManager  >
            <property name=  dataSource  >
                <ref bean=  dataSource  />
            </property>
        </bean>
     
       <!—示例中DAO-->
       <bean id= ”bookDAO” class=”com.bookDAO”>
            <property name= ”dataSource”>
                <ref bean= ”dataSource”/>
            </property>
            <property name= ”transactionManager”>
                <ref bean= ”transactionManager”>
            </property>
       </bean>
    </beans>
       红色部分显示了所使用的类,就是用它来处理数据库连接。
    2、使用DBCP连接池
        要在Spring中使用DBCP连接池,需要引入spring-framework-2.0-mllobjakarta-commons文件夹中的commons-collections.jar、commons-dbcp.jar和commons-pool.jar。
    配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
     "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
       <!   定dataSource à
       <bean id=  dataSource ” class=” org.apache.commons.dbcp.BasicDataSource ”>
          <! —使用SQL Server    à
           <property name= ”driverClassName”>
              <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
           </property>
            <property name= ”url”>
              <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
           </property>
    <property name= ”name”>
              <value>admin</value>
           </property>
    <property name= ”msg”>
              <value>admin</value>
           </property>
        </bean>
     
        <! —设定 transactionManager à
        <bean id=  transactionManager 
    class=  org.springframework.jdbc.datasource.DataSourceTransactionManager  >
            <property name=  dataSource  >
                <ref bean=  dataSource  />
            </property>
        </bean>
     
       <!—示例中DAO-->
       <bean id= ”bookDAO” class=”com.bookDAO”>
            <property name= ”dataSource”>
                <ref bean= ”dataSource”/>
            </property>
            <property name= ”transactionManager”>
                <ref bean= ”transactionManager”>
            </property>
       </bean>
    </beans>
       红色部分为不同之处,可以看出,Spring为各种不同的数据源提供了统一的方式,下面看使用Tomcat提供的JNDI,有了一些不同。
    3、使用Tomcat提供的JNDI
    分两步,第一步是配置Tomcat的server.xml;第二步是编写Spring的配置文件。
    Tomcat 的server.xml
    <Context path=”/demo” reloadable=”true” docBase=”c: eclipseworkspacedemo” workDir=” c: eclipseworkspacedemowork”>
    < Resource name=”jdbc/opendb” auth=”Container” type=”javax.sql.DataSource” factory=”org.apache.tomcat.dbcp.BasicDataSourceFactory” driverClassName=”com.microsoft.jdbc.sqlserver.SQLServerDriver” url=”jdbc:Microsoft:sqlserver://localhost:1433/stdb”
    <!— 设定用户名-->
    name=”admin”
    <!— 设定密码 à
    msg=”admin”
    < !--设定最大连接数 à
    maxActive=”10000”
    < !--设定最大空闲时间 à
    maxldle=”10000”
    < !--设定最大等待时间 à
    maxWait=”10000”
    removeAbandoned=”true”
    removeAbandonedTimeout=”10”
    logAbandoned=”true”
    />
    </Context>
    Spring 配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
     "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
       <!   定dataSource à
       <bean id=  dataSource ” class=” o rg.springframework.jndi.JndiObjectFactoryBean >
         <property name=”jndiName”>
             <value>jdbc/opendb</value>
          /* 以下信息在 server.xml 中已经配置过了,不需要再配置了
     <! —使用SQL Server    à
           <property name= ”driverClassName”>
              <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
           </property>
            <property name= ”url”>
              <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
           </property>
    <property name= ”name”>
              <value>admin</value>
           </property>
    <property name= ”msg”>
              <value>admin</value>
           </property> */
        </bean>
     
        <! —设定 transactionManager à
        <bean id=  transactionManager 
    class=  org.springframework.jdbc.datasource.DataSourceTransactionManager  >
            <property name=  dataSource  >
                <ref bean=  dataSource  />
            </property>
        </bean>
     
       <!—示例中DAO-->
       <bean id= ”bookDAO” class=”com.bookDAO”>
            <property name= ”dataSource”>
                <ref bean= ”dataSource”/>
            </property>
            <property name= ”transactionManager”>
                <ref bean= ”transactionManager”>
            </property>
       </bean>
    </beans>
       红色部分为不同之处,可以看出,使用Tomcat提供的JNDI,有了一些不同。第一方式只是Spring包装了一下Jdbc,跟直接使用Jdbc没什么大的区别;后两种采用了连接池技术,比较好。我们也可以看出,三种方式配置基本相同,而作为使用数据源的类,调用方式相同,都是使用基本的依赖注入的方式。
    4、使用Hibernate
    配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
     "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
       <!   定dataSource à
       <bean id=  dataSource ” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
          <! —使用SQL Server    à
           <property name= ”driverClassName”>
              <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
           </property>
            <property name= ”url”>
              <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
           </property>
    <property name= ”name”>
              <value>admin</value>
           </property>
    <property name= ”msg”>
              <value>admin</value>
           </property>
        </bean>
     // 在第一种方法的基础上加上 Hibernate 的配置段就 OK 了。
     <!— 使用 Hibernate  sessionFactory à
       <bean id=” sessionFactory ” class=”org.springframework.orm.hibernate.LocalSessionFactoryBean”>
           <property name=”dataSource”>
                <ref local=” dataSources ”>
           </property>
           <property name=”mappingResources”>
                <list>
                    <value>com/demo/bo/Book.hbm.xml</value>
                 </list>
           </property>
           <property name=”hibernateProperties”>
                <props>
                     <prop key=”hibernate.dialect”>
                            net.sf.hibernate.dialect.SQLServerDialect
                     </prop>
    <prop key=”hibernate.show_sql”>
          true
    <prop>
                </props>
            </property>
        </bean>
     
        <! —设定 transactionManager à
        <bean id=  transactionManager 
    class=  org.springframework.jdbc.datasource.DataSourceTransactionManager  >
            <property name=  sessionFactory  >
                <ref bean=  sessionFactory  />
            </property>
        </bean>
     
       <!—示例中DAO-->
       <bean id= ”bookDAO” class=”com.demo.bo.Boo kDAO ”>
            <property name=  sessionFactory ”>
                <ref bean=  sessionFactory ”/>
            </property>
            <property name= ”transactionManager”>
                <ref bean= ”transactionManager”>
            </property>
       </bean>
    </beans>
       红色部分显示了不同之处,有三点:1)、加入了<bean id=”sessionFactory”>段,引入Hibernate的sessionFactory;2)事务处理的属性由原来的dataSource变成了sessionFactory;3)DAO引用从原来的dataSource变成了sessionFactory。其实就是说,在原来的datasouce之上加了Hibernate这一层,来处理相应的数据访问问题。因此在Spring中引入ORM是很容易的。
      Book.hbm.xmlBook.java是通过工具互相生成的,在这里不展示代码了,而Book就是一个POJO
    4、使用iBatis
    配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
     "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
       <!   定dataSource à
       <bean id=  dataSource ” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
          <! —使用SQL Server    à
           <property name= ”driverClassName”>
              <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
           </property>
            <property name= ”url”>
              <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
           </property>
    <property name= ”name”>
              <value>admin</value>
           </property>
    <property name= ”msg”>
              <value>admin</value>
           </property>
        </bean>
     // 在第一种方法的基础上加上 iBatis 的配置段就 OK 了。
     <!— 使用 iBatis à
       <bean id=” sqlMap ” class=”org.springframework.orm.ibatis.SqlMapClientFactoryBean”>
           <property name=”configLocation”>
                <value>WEB/sqlMapConfig.xml</value>
           </property>
        </bean>
        <! —设定 transactionManager à
        <bean id=  transactionManager 
    class=  org.springframework.jdbc.datasource.DataSourceTransactionManager  >
            <property name=  dataSource  >
                <ref bean=  dataSource  />
            </property>
        </bean>
     
       <!—示例中DAO-->
      <bean id= ”bookDAO” class=”com.demo.bo.Boo kDAO ”>
            <property name=  dataSource ”>
                <ref bean=  dataSource ”/>
            </property>
            <property name= ”transactionManager”>
                <ref bean= ”transactionManager”>
            </property>
            <property name=”sqlMap”>
                 <ref bean=”sqlMap”/>
            </property>
       </bean>
    </beans>
       红色部分显示了不同之处,主要来看一下其与Hibernate的不同之处,1)同样引入iBatis配置段,不过其mappingResources配置信息放在了sqlMapConfig.xml下,该文件放在WEB-INF下,示例代码如下:
    <sqlMapConfig>
         <sqlMap resource=”com/demo/bo/Book.xml”>
    </sqlMapConfig>
    而这其中的Book.xml文件类似于Hibernate中的Book.hbm.xml。
     2)事务处理配置段依然引用的是dataSource,而不是sqlMap。
     3)在DAO配置段,引用dataSource的同时,又加入了sqlMap引用。
     其PO对象——Book.java与Hibernate中相同。
     (二)数据库操作
    1、使用JDBCTemplate
     
    import javax.sql.DataSource;
    import org.springframework.jdbc.core.*;
    import org.springframework.transaction.*;
    import org.springframework.dao.*;
     
    public class bookDAO{
    private DataSource dataSource依赖注入dataSource,管理数据库;//
    private PlatformTransationManager transactionManager;//依赖注入管理事务
     
    public void setDataSource(DataSource dataSource){
        this.dataSource=dataSource;
    }
     
         public void setTransactionManager(PlatformTransationManager transactionManager){
             this. transactionManager= transactionManager;
    }
     
    public int create(String msg){
        JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
        jdbcTemplate.update(“INSERT INFO book VALUES(1,’gf’,’Mastering Spring’)”);
    }
    }
    配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
     "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
       <!   定dataSource à
       <bean id= ”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
          <! —使用SQL Server    à
           <property name= ”driverClassName”>
              <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
           </property>
            <property name= ”url”>
              <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
           </property>
    <property name= ”name”>
              <value>admin</value>
           </property>
    <property name= ”msg”>
              <value>admin</value>
           </property>
        </bean>
     
        <! —设定 transactionManager à
        <bean id=  transactionManager 
    class=  org.springframework.jdbc.datasource.DataSourceTransactionManager  >
            <property name=  dataSource  >
                <ref bean=  dataSource  />
            </property>
        </bean>
     
       <!—示例中DAO-->
      <bean id=”bookDAO” class=”com.bookDAO”>
            <property name= ”dataSource”>
                <ref bean= ”dataSource”/>
            </property>  
       </bean>
       <! —声明式事务处理 - à
       <bean id=  bookDAOProxy  class=  org.springframework.transaction.interceptor.Transation.ProxyFactoryBean  >
            <property name=  transacionManager  >
                <ref bean=  transacionMaganer  />
            </property>
    <property name=  target  >
                <ref bean=  bookDAO  />
            </property>
    <property name=  transactionAttributes  >
                <props>
                   <!-- 表示对 bookDAO 中的 create 方法进行事务处理,并指明当前没有事务就新建一个(用 PROPAGATION_REQUIRED 常量来表示的) à
                    <prop key=  create*  >PROPAGATION_REQUIRED</prop>
                </props>
            </property> 
       </bean>
    </beans>
     
    最简便、灵活的写法:
     
    import javax.sql.DataSource;
    import org.springframework.jdbc.core.*;
    import org.springframework.transaction.*;
    import org.springframework.dao.*;
     
    public class bookDAO{
    private DataSource dataSource依赖注入dataSource,管理数据库;//
    private PlatformTransationManager transactionManager;//依赖注入管理事务
    private String sql;
     
    public void setDataSource(DataSource dataSource){
        this.dataSource=dataSource;
    }
     
         public void setTransactionManager(PlatformTransationManager transactionManager){
             this. transactionManager= transactionManager;
    }
     
    public void setSql(String sql){
         this.sql=sql;
    }
     
    public int create(String msg){
     /*  JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
         jdbcTemplate.update(  INSERT INFO book VALUES(1, ’gf’,’Mastering Spring’)”); */
    // 使用下述代码代替上面注释的内容
       jdbcTemplate.update(this.sql);
    }
    }
    配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
     "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
       <!   定dataSource à
       <bean id= ”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
          <! —使用SQL Server    à
           <property name= ”driverClassName”>
              <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
           </property>
            <property name= ”url”>
              <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
           </property>
    <property name= ”name”>
              <value>admin</value>
           </property>
    <property name= ”msg”>
              <value>admin</value>
           </property>
        </bean>
     
        <! —设定 transactionManager à
        <bean id=  transactionManager 
    class=  org.springframework.jdbc.datasource.DataSourceTransactionManager  >
            <property name=  dataSource  >
                <ref bean=  dataSource  />
            </property>
        </bean>
     
       <!— 设定 jdbcTemplate à
        <bean id=”jdbcTemplate” class=”org.springframework.jdbc.core.JdbcTemplate”>
            <property name=”dataSource”>
                   <ref bean=”dataSource”>
            </property>
       <!—示例中DAO-->
      <bean id=”bookDAO” class=”com.bookDAO”>
            <property name= ”dataSource”>
                <ref bean= ”dataSource”/>
            </property>
          //jdbcTemplate 属性代替  处的代码将dataSource注入到jdbcTemplate中
            <property name=”jdbcTemplate”>
                 <ref bean=”jdbcTemplate”>
            </property>
          //sql 属性代替  处代码
            <property name=”sql”>
                 <value>INSERT INTO hello VALUES(1,  gf  ,  Mastering Spring  )</value>
             </property>
       </bean>
       <! —声明式事务处理 - à
       <bean id=  bookDAOProxy  class=  org.springframework.transaction.interceptor.TransationProxyFactoryBean  >
            <property name=  transacionManager  >
                <ref bean=  transacionMaganer  />
            </property>
    <property name=  target  >
                <ref bean=  bookDAO  />
            </property>
    <property name=  transactionAttributes  >
                <props>
                   <!-- 表示对 bookDAO 中的 create 方法进行事务处理,并指明当前没有事务就新建一个(用 PROPAGATION_REQUIRED 常量来表示的) à
                    <prop key=  create*  >PROPAGATION_REQUIRED</prop>
                </props>
            </property> 
       </bean>
    </beans>
     
     
    2、使用Hibernate
    import javax.sql.DataSource;
    import org.springframework.jdbc.core.*;
    import org.springframework.transaction.*;
    import org.springframework.dao.*;
    import org.springframework.orm.*;
     
    public class bookDAO{
    //private DataSource dataSource; 依赖注入 dataSource ,管理数据库
    private SessionFactory sessionFactory;
    private PlatformTransationManager transactionManager;//依赖注入管理事务
     
    /*public void setDataSource(DataSource dataSource){
        this.dataSource=dataSource;
    }*/
     
         public void setTransactionManager(PlatformTransationManager transactionManager){
             this. transactionManager= transactionManager;
    }
     
    public void setSessionFactory(DataSource sessionFactory){
         this. sessionFactory = sessionFactory;
    }
     
    public int create(String msg){
     /*  JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
         jdbcTemplate.update(  INSERT INFO book VALUES(1, ’gf’,’Mastering Spring’)”); */
     // 下面这行替代 
          HibernateTemplate hibernateTemplate=new HibernateTemplate(sessionFactory);
     
          Book book=new Book();
          book.setId(1);
          book.setAuthor(“gf”);
          book.setName(“Mastering Spring”);
      // 下面这行替代 
          hibernateTemplate.saveOrUpdate(book);
    }
     
    sessionFactory 里引入了book.hbm.xml
     
     
    3、使用iBatis
    import javax.sql.DataSource;
    import org.springframework.jdbc.core.*;
    import org.springframework.transaction.*;
    import org.springframework.dao.*;
    import org.springframework.orm.*;
     
    public class bookDAO extends SqlMapClientDaoSupport{
         private PlatformTransationManager transactionManager;
     
          public void setTransactionManager(PlatformTransationManager transactionManager){
             this. transactionManager= transactionManager;
    }
     
    public int create(String msg){
           Book book=new Book();
          book.setId(1);
          book.setAuthor(“gf”);
          book.setName(“Mastering Spring”);
      
         getSqlMapClientTemplate().update(“ insertBook ”,book);
    }
     
    }
     
    配置文件——Book.xml
    该文件相当于Hibernate中的book.hbm.xml
     
    <sqlMap namespace=”Book”>
    <typeAlias alias=”book” type=”com.demo.bo.Book”/>
    <insert id=”insertBook” parameterClass=”book”>
        insert into book(id,author,name) values(#id#,#author#,#name#);
    </insert>
    </sqlMap>
    BookDAO中的insertBook和配置文件中的insertBook相匹配。
  • 相关阅读:
    Python创建空DataFrame及添加行数据
    Python读取Excel文件
    Python拆分DataFrame
    Python中识别DataFrame中的nan
    Python线性回归算法【解析解,sklearn机器学习库】
    Python鸢尾花分类实现
    Python机器学习入门
    Python使用map,reduce高阶函数模拟实现Spark的reduceByKey算子功能
    Python参数传递(传值&传引用)
    Python迭代器
  • 原文地址:https://www.cnblogs.com/leonkobe/p/3549063.html
Copyright © 2020-2023  润新知