Spring的持久层封装

    技术2022-05-11  66

     

    Spring 的持久层封装 (零雨其蒙原创,转载请注明) 一、概述 (一)基本概念 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-ml/lob/jakarta-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: / eclipse /workspace/demo ” workDir=” c: / eclipse /workspace/demo/ work”> < 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.xml Book.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相匹配。

    最新回复(0)