我们都知道Spring是一个非常优秀的JavaEE整合框架,它尽可能的减少我们开发的工作量和难度。
在持久层的业务逻辑方面,Spring开源组织又给我们带来了同样优秀的Spring Data JPA。
通常我们写持久层,都是先写一个接口,再写接口对应的实现类,在实现类中进行持久层的业务逻辑处理。
而现在,Spring Data JPA帮助我们自动完成了持久层的业务逻辑处理,我们要做的,仅仅是声明一个持久层接口。
1、下载开发所需要的发布包。
1)spring-framework-3.1.2.RELEASE-with-docs.zip
下载地址:http://www.springsource.org/spring-framework
2)hibernate-release-4.1.6.Final.zip
下载地址:http://olex.openlogic.com/packages/hibernate
3)Spring Data JPA
Spring Data JPA
下载地址:http://www.springsource.org/spring-data/jpa
Spring Data Commons
下载地址:http://www.springsource.org/spring-data/commons
4)其他一些依赖包可以从 http://ebr.springsource.com/repository/app/library 上查找下载
2、新建一个Web项目 spring-data-jpa,把相应的jar包放到/WebRoot/WEB-INF/lib目录下。
我也没有挑选哪些是不需要的,最后用到的jar如下:
复制代码
antlr-2.7.7.jar
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.aspectj.weaver-1.6.3.RELEASE.jar
commons-lang3-3.1.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.6.Final.jar
hibernate-entitymanager-4.1.6.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
log4j-1.2.17.jar
mysql-connector-java-5.0.4-bin.jar
org.springframework.aop-3.1.2.RELEASE.jar
org.springframework.asm-3.1.2.RELEASE.jar
org.springframework.aspects-3.1.2.RELEASE.jar
org.springframework.beans-3.1.2.RELEASE.jar
org.springframework.context-3.1.2.RELEASE.jar
org.springframework.context.support-3.1.2.RELEASE.jar
org.springframework.core-3.1.2.RELEASE.jar
org.springframework.expression-3.1.2.RELEASE.jar
org.springframework.instrument-3.1.2.RELEASE.jar
org.springframework.instrument.tomcat-3.1.2.RELEASE.jar
org.springframework.jdbc-3.1.2.RELEASE.jar
org.springframework.jms-3.1.2.RELEASE.jar
org.springframework.js.resources-2.3.0.RELEASE.jar
org.springframework.orm-3.1.2.RELEASE.jar
org.springframework.oxm-3.1.2.RELEASE.jar
org.springframework.test-3.1.2.RELEASE.jar
org.springframework.transaction-3.1.2.RELEASE.jar
org.springframework.web-3.1.2.RELEASE.jar
org.springframework.web.portlet-3.1.2.RELEASE.jar
org.springframework.web.servlet-3.1.2.RELEASE.jar
slf4j-api-1.6.6.jar
slf4j-log4j12-1.6.6.jar
spring-data-commons-core-1.3.0.M1.jar
spring-data-jpa-1.0.2.RELEASE.jar
复制代码
3、在MySql数据库中建立一个叫spring_data_jpa的数据库。
create database spring_data_jpa default character set utf8;
4、JPA配置文件persistence.xml
1)在src目录下建立一个叫META-INF的文件夹
2)在META-INF文件夹下建立persistence.xml文件
persistence.xml内容如下:
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
<persistence-unit name="myJPA" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<!--配置Hibernate方言 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<!--配置数据库驱动 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<!--配置数据库用户名 -->
<property name="hibernate.connection.username" value="root" />
<!--配置数据库密码 -->
<property name="hibernate.connection.password" value="root" />
<!--配置数据库url -->
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/spring_data_jpa?useUnicode=true&characterEncoding=UTF-8" />
<!--设置外连接抓取树的最大深度 -->
<property name="hibernate.max_fetch_depth" value="3" />
<!--自动输出schema创建DDL语句 -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="javax.persistence.validation.mode" value="none"/>
</properties>
</persistence-unit>
</persistence>
复制代码
5、Spring配置文件applicationContext.xml
在src目录下建立applicationContext.xml
applicationContext.xml内容如下:
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<context:annotation-config />
<context:component-scan base-package="cn.luxh.app"/>
<!-- 定义实体管理器工厂 -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myJPA"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- 启用 annotation事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 配置Spring Data JPA扫描目录-->
<jpa:repositories base-package="cn.luxh.app.repository"/>
</beans>
复制代码
6、web.xml
web.xml内容如下:
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<!-- 编码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置spring监听器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置缓存清除监听器,负责处理由 JavaBean Introspector 功能而引起的缓存泄露 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
复制代码
8、所有环境配完毕,开始写一个Spring Data JPA 的增删改查
1)建立相应的包
2)领域模型实体类User
复制代码
package cn.luxh.app.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* 用户信息
* @author Luxh
* 2012-8-30
*/
@Entity
@Table(name="t_user")
public class User {
@Id
@GeneratedValue
private Integer id;
//账号
private String account;
//姓名
private String name;
//密码
private String password;
//省略 getter和setter方法
}
复制代码
3)声明持久层接口UserRepository
让UserRepository接口继承CrudRepository<T,ID>,T是领域实体,ID是领域实体的主键类型。CrudRepository实现了相应的增删改查方法。
复制代码
package cn.luxh.app.repository;
import org.springframework.data.repository.CrudRepository;
import cn.luxh.app.domain.User;
/**
* 用户持久层接口
* @author Luxh
* 2012-8-31
*/
public interface UserRepository extends CrudRepository<User,Integer>{
}
复制代码
不再需要持久层接口实现类。
4)业务层
一般多层架构是控制层调用业务层,业务层再调用持久层。所以这里写个业务层。
a、业务层接口:
复制代码
package cn.luxh.app.service;
import cn.luxh.app.domain.User;
/**
* 用户业务接口
* @author Luxh
* 2012-8-31
*/
public interface UserService {
/**
* 保存用户
* @param user
*/
void saveUser(User user);
/**
* 根据id查找用户
* @param id
* @return
*/
User findUserById(Integer id);
/**
* 更新用户
* @param user
*/
void updateUser(User user);
/**
* 根据ID删除用户
* @param id
*/
void deleteUserById(Integer id);
}
复制代码
b、业务层接口实现类
复制代码
package cn.luxh.app.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.luxh.app.domain.User;
import cn.luxh.app.repository.UserRepository;
/**
* 用户业务服务实现类
* @author Luxh
* 2012-8-31
*/
@Service("userService")
public class UserServiceImpl implements UserService{
@Autowired
private UserRepository userRepository;//注入UserRepository
@Override
@Transactional
public void saveUser(User user) {
userRepository.save(user);
}
@Override
@Transactional(readOnly=true)
public User findUserById(Integer id) {
return userRepository.findOne(id);
}
@Override
@Transactional
public void updateUser(User user) {
userRepository.save(user);
}
@Override
@Transactional
public void deleteUserById(Integer id) {
userRepository.delete(id);
}
}
复制代码
9)编写测试用例
测试代码:
复制代码
package cn.luxh.app.test;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import cn.luxh.app.domain.User;
import cn.luxh.app.service.UserService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/applicationContext.xml"})
public class UserTest {
@Autowired
private UserService userService;
//保存用户
@Test
public void testSaveUser() {
User user = new User();
user.setAccount("LiHuai");
user.setName("李坏");
user.setPassword("123456");
userService.saveUser(user);
}
//根据id查找用户
@Test
public void testFindUserById() {
Integer id = 1;
User user = userService.findUserById(id);
Assert.assertEquals("李坏",user.getName());
}
//更新用户
@Test
public void testUpdateUser() {
Integer id = 1;
User user = userService.findUserById(id);
user.setName("李寻欢");
userService.updateUser(user);
}
//根据id删除用户
@Test
public void testDeleteUserById() {
Integer id = 1;
userService.deleteUserById(id);
}
}
复制代码
--------------------------------------------------------------------------------
使用Spring Data JPA相当的简单,我们只需要定义持久层的接口,不需要编写实现代码。
步骤和注意点:
1)在spring配置文件中添加仓库接口的扫描路径 <jpa:repositories base-package="cn.luxh.app.repository"/>
2)编写领域实体,需要按照JPA规范
3)编写仓库Repository<T,ID>接口,依靠Spring Data规范定义接口方法。
比如按照规范定义一个数据访问接口方法 List<User> findByName(String name);
Spring Data JPA 就会自动转化为 select u from User u where u.name = ?1
--------------------------------------------------------------------------------
可以使用的仓库接口有:
Repository: 是 Spring Data的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法。
CrudRepository: 继承Repository,提供增删改查方法,可以直接调用。
PagingAndSortingRepository: 继承CrudRepository,具有分页查询和排序功能
JpaRepository: 继承PagingAndSortingRepository,针对JPA技术提供的接口
JpaSpecificationExecutor: 可以执行原生SQL查询
在持久层的业务逻辑方面,Spring开源组织又给我们带来了同样优秀的Spring Data JPA。
通常我们写持久层,都是先写一个接口,再写接口对应的实现类,在实现类中进行持久层的业务逻辑处理。
而现在,Spring Data JPA帮助我们自动完成了持久层的业务逻辑处理,我们要做的,仅仅是声明一个持久层接口。
1、下载开发所需要的发布包。
1)spring-framework-3.1.2.RELEASE-with-docs.zip
下载地址:http://www.springsource.org/spring-framework
2)hibernate-release-4.1.6.Final.zip
下载地址:http://olex.openlogic.com/packages/hibernate
3)Spring Data JPA
Spring Data JPA
下载地址:http://www.springsource.org/spring-data/jpa
Spring Data Commons
下载地址:http://www.springsource.org/spring-data/commons
4)其他一些依赖包可以从 http://ebr.springsource.com/repository/app/library 上查找下载
2、新建一个Web项目 spring-data-jpa,把相应的jar包放到/WebRoot/WEB-INF/lib目录下。
我也没有挑选哪些是不需要的,最后用到的jar如下:
复制代码
antlr-2.7.7.jar
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.aspectj.weaver-1.6.3.RELEASE.jar
commons-lang3-3.1.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.6.Final.jar
hibernate-entitymanager-4.1.6.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
log4j-1.2.17.jar
mysql-connector-java-5.0.4-bin.jar
org.springframework.aop-3.1.2.RELEASE.jar
org.springframework.asm-3.1.2.RELEASE.jar
org.springframework.aspects-3.1.2.RELEASE.jar
org.springframework.beans-3.1.2.RELEASE.jar
org.springframework.context-3.1.2.RELEASE.jar
org.springframework.context.support-3.1.2.RELEASE.jar
org.springframework.core-3.1.2.RELEASE.jar
org.springframework.expression-3.1.2.RELEASE.jar
org.springframework.instrument-3.1.2.RELEASE.jar
org.springframework.instrument.tomcat-3.1.2.RELEASE.jar
org.springframework.jdbc-3.1.2.RELEASE.jar
org.springframework.jms-3.1.2.RELEASE.jar
org.springframework.js.resources-2.3.0.RELEASE.jar
org.springframework.orm-3.1.2.RELEASE.jar
org.springframework.oxm-3.1.2.RELEASE.jar
org.springframework.test-3.1.2.RELEASE.jar
org.springframework.transaction-3.1.2.RELEASE.jar
org.springframework.web-3.1.2.RELEASE.jar
org.springframework.web.portlet-3.1.2.RELEASE.jar
org.springframework.web.servlet-3.1.2.RELEASE.jar
slf4j-api-1.6.6.jar
slf4j-log4j12-1.6.6.jar
spring-data-commons-core-1.3.0.M1.jar
spring-data-jpa-1.0.2.RELEASE.jar
复制代码
3、在MySql数据库中建立一个叫spring_data_jpa的数据库。
create database spring_data_jpa default character set utf8;
4、JPA配置文件persistence.xml
1)在src目录下建立一个叫META-INF的文件夹
2)在META-INF文件夹下建立persistence.xml文件
persistence.xml内容如下:
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
<persistence-unit name="myJPA" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<!--配置Hibernate方言 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<!--配置数据库驱动 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<!--配置数据库用户名 -->
<property name="hibernate.connection.username" value="root" />
<!--配置数据库密码 -->
<property name="hibernate.connection.password" value="root" />
<!--配置数据库url -->
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/spring_data_jpa?useUnicode=true&characterEncoding=UTF-8" />
<!--设置外连接抓取树的最大深度 -->
<property name="hibernate.max_fetch_depth" value="3" />
<!--自动输出schema创建DDL语句 -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="javax.persistence.validation.mode" value="none"/>
</properties>
</persistence-unit>
</persistence>
复制代码
5、Spring配置文件applicationContext.xml
在src目录下建立applicationContext.xml
applicationContext.xml内容如下:
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<context:annotation-config />
<context:component-scan base-package="cn.luxh.app"/>
<!-- 定义实体管理器工厂 -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myJPA"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- 启用 annotation事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 配置Spring Data JPA扫描目录-->
<jpa:repositories base-package="cn.luxh.app.repository"/>
</beans>
复制代码
6、web.xml
web.xml内容如下:
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<!-- 编码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置spring监听器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置缓存清除监听器,负责处理由 JavaBean Introspector 功能而引起的缓存泄露 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
复制代码
8、所有环境配完毕,开始写一个Spring Data JPA 的增删改查
1)建立相应的包
2)领域模型实体类User
复制代码
package cn.luxh.app.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* 用户信息
* @author Luxh
* 2012-8-30
*/
@Entity
@Table(name="t_user")
public class User {
@Id
@GeneratedValue
private Integer id;
//账号
private String account;
//姓名
private String name;
//密码
private String password;
//省略 getter和setter方法
}
复制代码
3)声明持久层接口UserRepository
让UserRepository接口继承CrudRepository<T,ID>,T是领域实体,ID是领域实体的主键类型。CrudRepository实现了相应的增删改查方法。
复制代码
package cn.luxh.app.repository;
import org.springframework.data.repository.CrudRepository;
import cn.luxh.app.domain.User;
/**
* 用户持久层接口
* @author Luxh
* 2012-8-31
*/
public interface UserRepository extends CrudRepository<User,Integer>{
}
复制代码
不再需要持久层接口实现类。
4)业务层
一般多层架构是控制层调用业务层,业务层再调用持久层。所以这里写个业务层。
a、业务层接口:
复制代码
package cn.luxh.app.service;
import cn.luxh.app.domain.User;
/**
* 用户业务接口
* @author Luxh
* 2012-8-31
*/
public interface UserService {
/**
* 保存用户
* @param user
*/
void saveUser(User user);
/**
* 根据id查找用户
* @param id
* @return
*/
User findUserById(Integer id);
/**
* 更新用户
* @param user
*/
void updateUser(User user);
/**
* 根据ID删除用户
* @param id
*/
void deleteUserById(Integer id);
}
复制代码
b、业务层接口实现类
复制代码
package cn.luxh.app.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.luxh.app.domain.User;
import cn.luxh.app.repository.UserRepository;
/**
* 用户业务服务实现类
* @author Luxh
* 2012-8-31
*/
@Service("userService")
public class UserServiceImpl implements UserService{
@Autowired
private UserRepository userRepository;//注入UserRepository
@Override
@Transactional
public void saveUser(User user) {
userRepository.save(user);
}
@Override
@Transactional(readOnly=true)
public User findUserById(Integer id) {
return userRepository.findOne(id);
}
@Override
@Transactional
public void updateUser(User user) {
userRepository.save(user);
}
@Override
@Transactional
public void deleteUserById(Integer id) {
userRepository.delete(id);
}
}
复制代码
9)编写测试用例
测试代码:
复制代码
package cn.luxh.app.test;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import cn.luxh.app.domain.User;
import cn.luxh.app.service.UserService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/applicationContext.xml"})
public class UserTest {
@Autowired
private UserService userService;
//保存用户
@Test
public void testSaveUser() {
User user = new User();
user.setAccount("LiHuai");
user.setName("李坏");
user.setPassword("123456");
userService.saveUser(user);
}
//根据id查找用户
@Test
public void testFindUserById() {
Integer id = 1;
User user = userService.findUserById(id);
Assert.assertEquals("李坏",user.getName());
}
//更新用户
@Test
public void testUpdateUser() {
Integer id = 1;
User user = userService.findUserById(id);
user.setName("李寻欢");
userService.updateUser(user);
}
//根据id删除用户
@Test
public void testDeleteUserById() {
Integer id = 1;
userService.deleteUserById(id);
}
}
复制代码
--------------------------------------------------------------------------------
使用Spring Data JPA相当的简单,我们只需要定义持久层的接口,不需要编写实现代码。
步骤和注意点:
1)在spring配置文件中添加仓库接口的扫描路径 <jpa:repositories base-package="cn.luxh.app.repository"/>
2)编写领域实体,需要按照JPA规范
3)编写仓库Repository<T,ID>接口,依靠Spring Data规范定义接口方法。
比如按照规范定义一个数据访问接口方法 List<User> findByName(String name);
Spring Data JPA 就会自动转化为 select u from User u where u.name = ?1
--------------------------------------------------------------------------------
可以使用的仓库接口有:
Repository: 是 Spring Data的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法。
CrudRepository: 继承Repository,提供增删改查方法,可以直接调用。
PagingAndSortingRepository: 继承CrudRepository,具有分页查询和排序功能
JpaRepository: 继承PagingAndSortingRepository,针对JPA技术提供的接口
JpaSpecificationExecutor: 可以执行原生SQL查询
发表评论
-
转:Spring Assert(方法入参检测工具类-断言)
2014-03-14 10:29 631Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如 ... -
使用Spring MVC表单标签
2014-03-13 17:00 619概述 在低版本的Spring中,你必须通过JSTL或 ... -
转:使用Spring MVC表单标签
2014-03-11 09:42 582Spring Framework开发参考: 13.9. 使用S ... -
转:使用Spring MVC表单标签
2014-03-11 09:36 358使用Spring MVC表单标签 概述 在低版本的 ... -
转:spring mvc表单form值自动传入javabean-注解@ModelAttribute
2014-03-10 15:39 2375直接通过Form Bean进行表单可以简化表单提交的处理,特别 ... -
jQuery ajax和spring mvc
2014-02-11 12:53 356jQuery ajax和spring mvc jsp部分 ... -
spring mvc @Scheduled注解中cron常用表示
2014-01-26 14:47 835Scheduled cron常用表示: Cron ... -
spring mvc @Scheduled注解实现后台定时操作
2014-01-26 14:36 2951Spring3 Shedule Task之注解实现 (两次 ... -
模型视图类ModelAndView(转载)
2014-01-13 10:24 513从名字上看ModelAndView中的Model代表模 ... -
Spring MVC 配置
2013-12-22 22:01 383Spring MVC 配置 转:http://blog.c ... -
在spring官网上下载jar包的方法
2013-12-20 08:06 744Spring官网改版后找了好久都没有找到直接下载Jar包的链接 ...
相关推荐
至于压缩包中的“helloworld”文件,可能是一个简单的示例项目,通常会包含一个基础的Spring Data JPA配置,一个实体类,以及对应的Repository接口,用于展示Spring Data JPA的基本用法。通过查看这个例子,你可以更...
**Spring Data JPA 简单案例** Spring Data JPA 是 Spring 框架的一个模块,它为使用 JPA(Java Persistence API)提供了强大的支持,简化了数据访问层的开发。通过使用 Spring Data JPA,我们可以避免编写大量重复...
'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观...
spring data jpa 实例源码 spring data jpa 实例源码 spring data jpa 实例源码
【Spring Data JPA 入门实例】 Spring Data JPA 是 Spring 框架的一个模块,它简化了数据库访问层(DAO)的开发,通过提供自动化的 Repository 实现,使得开发者无需编写大量的 CRUD(创建、读取、更新、删除)代码...
在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...
本入门例子将帮助你理解并掌握Spring Data JPA的核心概念和常用功能。 1. **什么是Spring Data JPA** Spring Data JPA是Spring框架的一部分,它为JPA提供了一种声明式的方法来处理数据访问层。通过使用Spring Data...
这个"spring data jpa 例子"很可能是包含了一个示例项目,展示了如何在实际应用中集成并使用Spring Data JPA。让我们深入探讨Spring Data JPA的关键概念和用法。 首先,Spring Data JPA的目标是通过提供泛型 ...
文档中所涉及的知识点涵盖了从简单的仓库接口定义、查询创建,到复杂的事务管理、锁定机制和审计功能的配置,使得开发者能够利用Spring Data JPA来极大减少数据访问层的代码量,专注于业务逻辑的实现。文档的编写以...
在这个实例中,我们将会深入理解SpringDataJPA如何与SpringBoot结合,实现数据库的增删改查(CRUD)操作以及实体之间的关联关系处理。 首先,SpringBoot是Spring框架的轻量级启动器,它自动配置了大量常见应用的...
分页查询在Spring Data JPA中非常简单,我们可以通过`Pageable`接口实现。在查询方法中添加`Pageable`参数,例如`findAll(Pageable pageable)`,然后在服务层或控制器层,我们可以创建`PageRequest`对象,指定页码和...
**Spring Data JPA 简单实例** Spring Data JPA 是 Spring 框架的一个模块,它极大地简化了与 Java 持久层的交互,尤其是与 JPA(Java Persistence API)的集成。通过 Spring Data JPA,我们可以快速地创建数据访问...
6. **Spring Boot集成**:在Spring Boot项目中,Spring Data JPA的配置非常简单,只需要在`pom.xml`添加依赖,然后在`application.properties`或`application.yml`配置数据库连接信息,Spring Boot会自动配置JPA和...
Spring Data JPA是Spring框架的一个重要模块,它简化了Java Persistence API (JPA)的使用,使得数据库操作变得更加便捷。这个"Spring Data JPA Examples"官方源码提供了丰富的示例,帮助开发者深入理解如何在实际...
在这个名为“springDataJpa测试demo”的项目中,我们看到它是一个基于Maven构建的工程,目的是演示如何在Spring应用中集成并测试Spring Data JPA的功能。这里我们将详细探讨Spring Data JPA以及与Maven和MySQL数据库...
Spring Data JPA 是一个强大的框架,它简化了与Java Persistence API (JPA)的交互,提供了对数据库操作的便捷抽象。1.7.0.RELEASE 版本的文档由 Oliver Gierke、Thomas Darimont 和 Christoph Strobl 编写,并由 ...
在Java后端开发中,Spring框架提供了强大的事务管理能力,特别是在使用Spring Data JPA时,`@Transactional`注解使得事务处理变得简单易用。这个注解是Spring框架中的核心部分,它允许开发者声明性地控制事务边界,...
在这个"Spring+Spring MVC+SpringData JPA整合完成增删改查,翻页实例"中,我们将深入探讨这三个组件如何协同工作,实现高效的数据管理与用户交互。 首先,Spring MVC是Spring框架的一个模块,专门用于构建Web应用...
在本项目中,我们探索的是一个基于2017年技术栈的Java Web应用程序实例,主要涉及Spring Data JPA、Spring 4.2、Spring MVC和Hibernate 4.3。这些技术是Java开发中的核心组件,尤其在企业级应用开发中广泛使用。下面...
Spring Data JPA 提供了一套灵活的查询机制,允许开发者通过简单的接口方法定义就能执行复杂的数据库查询。 Spring Data JPA 的核心概念包括以下几个接口: 1. Repository:这是所有 Repository 接口的基类,不...