Spring 的持久层封装
来源:互联网 发布:2017年中国老龄化数据 编辑:程序博客网 时间:2024/05/17 04:28
一、概述
(一)基本概念
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相匹配。
转载自:http://www.blogjava.net/sslaowan/archive/2007/02/22/100342.html
- Spring 的持久层封装
- Spring的持久层封装
- 持久层的EAO颗粒封装
- 封装持久层框架
- Spring持久层
- spring 持久层
- spring持久层
- Spring持久层(一)Spring JdbcTemplate 的例子
- Spring持久层(二)Spring 命名JdbcTemplate 的例子
- spring mvc:持久层浅析
- Spring持久层(三) Hibernate
- Spring持久层(四) iBatis
- Spring持久层(四) iBatis
- Spring与数据持久层
- 关于持久层和业务层代码封装的一点点设计
- hibernate做持久层,spring管理事物的架构方式
- Spring的统一异常体系和持久层技术
- Spring的学习--SpringMVC的四个基本注解annotation(控制层,业务层,持久层)
- Java 缓存,缓存算法,缓存框架
- oracle 创建表空间,用户,授权,导入/导出。。。
- 程序运行时堆区和栈区的分配
- SQL 入门——如何将两个字段拼接为一个字段
- C语言声明学习之初级篇
- Spring 的持久层封装
- 通过反射创建新类示例的两种方式及比较
- oracle占用8080端口的問題.
- sql server 2005/2008 设置 sql身份验证 和 sa空密码(像sql2000一样使用)(转载)
- Oracle字符函数
- ASPNET服务器控件和客户端脚本
- 新的开始
- 常用的正则表达式
- 用代码安装APK程序