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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?