Spring Data通过创建智能的DAO节省了很多时间,您基本上不需要编写任何代码就可以免费获得DAO。 它基本上遵循Eric Evans的DDD书中的“ 存储库模式 ” ,并将实体视为集合。 它有一个很好的约定,允许您为复杂查询指定条件,甚至可以将JPA Criteria API或QueryDSL流利API用于更复杂的查询/规范。 最好的部分是抽象不仅适用于JPA,而且适用于许多其他提供程序 。 在Spring生态系统(例如Spring Boot)中有一些使用spring-data的很好的例子,但是有时候您想在Spring Boot的神奇,迷人的世界之外使用它。
而且,如果您要进行认真的系统集成,那么您可能也正在使用Apache Camel ,因此在下面的快速博客(无极)中,我将向您展示与Camel一起使用时需要的重要组成部分……但是,没有任何内容这里太特别了。 我们从根本上解构了Spring Boot可以帮您解决的一些魔术问题,使您能够理解必须具备的必要组成部分(如果运行Tomcat,Dropwizard,Wildfly或任何容器,这是正确的)。
此示例代码位于我的github上,其中包含我们正在处理的一些代码 。
第一步,您将需要JPA和spring-data依赖项!
<!-- spring data + JPA -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
这将为我们准备类路径,其中应包括JPA API和我们将使用的提供程序的实体管理器。
接下来,我们应该在spring-context / bean-factory中添加以下内容:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="url" value="jdbc:derby:memory:orders;create=true"/>
<property name="username" value=""/>
<property name="password" value=""/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceXmlLocation" value="classpath:/META-INF/persistence.xml"/>
<property name="persistenceUnitName" value="sample"/>
<!-- spring based scanning for entity classes>-->
<property name="packagesToScan" value="org.jboss.fuse.examples.rest"/>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="dataSource" ref="dataSource"/>
</bean>
这一切都是Spring ORM的事情 ; 这里没有什么太夸张的,但是spring-data需要的样板文件。
要使用JPA,我们还需要一个persistence.xml文件。 如果您想使用Mongo或其他方式,请参阅该特定的spring-data mdoule以了解如何执行此操作。
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="sample">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/>
</properties>
</persistence-unit>
</persistence>
这应该为我们使用spring-data提供了基础! 现在,让我们做一些有趣的事情。 我们将添加一个存储库,该存储库将允许我们对数据库执行CRUD操作(以及更多操作!):
package org.jboss.fuse.examples.repositories;
import org.jboss.fuse.examples.rest.Organization;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
* Created by ceposta
* <a href="http://christianposta.com/blog>http://christianposta.com/blog</a>.
*/
public interface OrganizationRepository extends PagingAndSortingRepository<Organization, Integer> {
}
我们有我们的存储库,但是我们需要告诉spring如何找到它并应用一些魔术。 因此,我们将其像这样添加到spring上下文中(并让spring扫描软件包以发现存储库)
<jpa:repositories base-package="org.jboss.fuse.examples.repositories"/>
注意,这将需要适当的名称空间(假设我们正在使用spring XML配置;也支持java配置,但此处未显示):
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
现在,让我们将存储库注入到我们自己的POJO类中,以便可以使用它! 哇,哇……“我们实际上没有编写任何代码来实现此存储库”,您说……是的,这是真的! Spring-data为我们做到了!
让我们注入:
<bean id="orgCollection" class="org.jboss.fuse.examples.rest.OrganizationCollection">
<property name="repository" ref="organizationRepository"/>
</bean>
请注意,存储库organizationRepository的名称是由Spring在扫描软件包中的存储库时按约定创建的,但是我们仍然可以保留它,并像在bean工厂中的任何其他spring bean一样使用它。 现在,让我们在骆驼路线中使用这个包装器类(在这种情况下为OrganizationCollection ):
<route id="findAll">
<from uri="direct:findAll"/>
<bean ref="orgCollection" method="findAll"/>
</route>
<route id="orgById">
<from uri="direct:orgById"/>
<bean ref="orgCollection" method="findById"/>
</route>
<route id="paginate">
<from uri="direct:paginate"/>
<bean ref="orgCollection" method="findOrganizationWithPagination"/>
</route>
凉! 我们有3条单独的路线使用orgCollection pojo(依次使用利用spring-data的organizationRepository)。 让我们看一下该POJO:
package org.jboss.fuse.examples.rest;
import org.apache.camel.Header;
import org.apache.camel.language.Simple;
import org.jboss.fuse.examples.repositories.OrganizationRepository;
import org.springframework.data.domain.PageRequest;
public class OrganizationCollection {
private OrganizationRepository repository;
public Organization insertNewOrganization(@Simple("body.org_id") Integer id, @Simple("body.org_name") String name) {
Organization org = new Organization(id, name);
return repository.save(org);
}
public Iterable<Organization> findAll(){
return repository.findAll();
}
public Iterable<Organization> findOrganizationWithPagination(@Header("pageNumber")int pageNum, @Header("pageSize")int size){
return repository.findAll(new PageRequest(pageNum, size));
}
public Organization findById(@Header("id")int id) {
return repository.findOne(id);
}
public OrganizationRepository getRepository() {
return repository;
}
public void setRepository(OrganizationRepository repository) {
this.repository = repository;
}
}
我们注入OrganizationRepository并在这里使用它来查询数据存储。 请注意,这些参数具有Apache Camel注释,这些注释从标头和正文中提取值以用作参数。
翻译自: https://www.javacodegeeks.com/2015/12/using-spring-data-apache-camel.html