spring data JPA的使用

最近又出来一套新的数据交互层的技术spring data JPA,我做了一个案例尝试了一番,感觉比较好用,下来将完成的效果进行展示
 搭建spring data jpa环境
1、引入maven依赖
<!-- MySQL驱动 -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.0.8</version>
</dependency>
<!-- spring jdbc -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>
<!-- spring context -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
    <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>1.8.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.6.Final</version>
</dependency>
2、在beans.xml中定义dataSource节点
<?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:tx="http://www.springframework.org/schema/tx"
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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
</beans>

3、在beans.xml中的beans节点中追加如下配置
<!-- 声明entityManagerFactoryBean -->
<bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.
HibernateJpaVendorAdapter"></bean>
</property>
<property name="packagesToScan" value="org.giles.springdatajpa"></property>
<property name="jpaProperties">
<props>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactoryBean" ref="entityManagerFactoryBean"></property>
</bean>
<!--配置支持注解的事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 配置spring data -->
<jpa:repositories base-package="org.giles" entity-manager-factory-ref="entityManagerFactoryBean"/>
<!-- 包浏览器 -->
<context:component-scan base-package="org.giles"></context:component-scan>
 使用spring data JPA实现CRUD操作
1、编写实体对象
@Entity
public class Employee {
private Integer eid;
private String ename;
private int age;
@GeneratedValue
@Id
public Integer getEid() {
return eid;
}
public void setEid(Integer eid) {
this.eid = eid;
}
@Column(length=20)
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2、编写数据交互层接口
如果要完成的是关系型数据库的CRUD操作,自定义类要继承JpaRepository
public interface EmployeeRepository extends JpaRepository<Employee,Integer>,JpaSpecificationExecutor<Employee>{
@Query("select o from Employee o where o.ename like ?1")
public Employee findEmployeeByEname(String ename);
@Modifying
@Query("update Employee e set e.ename= ?1,e.age= ?2 where e.eid= ?3")
public void updateEmployee(String ename,int age,int eid);
}
3、编写业务层
@Service
public class EmployeeService{
private EmployeeRepository employeeRepository;
@Autowired
public void setEmployeeRepository(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
/**
* 增加用户操作
* @param employee
*/
public void addEmployee(Employee employee) {
employeeRepository.save(employee);
}
/**
* 批量增加操作
* @param employees
*/
public void addEmployee(List<Employee> employees){
for (Employee employee : employees) {
employeeRepository.save(employee);
}
}
/**
* 按ID查询对象操作
* @param eid
* @return
*/
public Employee findByEid(Integer eid){
return employeeRepository.findOne(eid);
}
/**
* 查询所有操作
* @return
*/
public List<Employee> findAll(){
return employeeRepository.findAll();
}

/**
* 删除操作
* @param eid
*/
@Transactional
public void deleteEmployeeByEid(Integer eid){
employeeRepository.delete(eid);
}
/**
* 修改操作
* @param employee
*/
@Transactional
public void updateEmployee(Employee employee){
employeeRepository.updateEmployee(employee.getEname(),employee.getAge(),employee.getEid());
}
/**
* 按姓名查询用户对象
* @param ename
* @return
*/

public Employee findEmployeeByEname(String ename){
return employeeRepository.findEmployeeByEname(ename);
}

/**
* 分页操作
* @param currentPage
* @param pageSize
* @return
*/
public Page<Employee> findAllByPage(final Employee employee,int currentPage,int pageSize){
Sort.Order order=new Sort.Order(Sort.Direction.ASC,"eid");
Sort sort=new Sort(order);
Specification<Employee> specification=new Specification<Employee>() {
public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> query, CriteriaBuilder criteria) {
Path path1=root.get("age");
Predicate p1=criteria.gt(path1,employee.getAge());
Path path2=root.get("ename");
Predicate p2=criteria.like(path2,"%"+employee.getEname()+"%");
return criteria.and(p1,p2);
}
};
Pageable pageable=new PageRequest((currentPage-1)*pageSize,pageSize,sort);
Page<Employee> page=employeeRepository.findAll(specification,pageable);
return page;
}

}
4、编写测试类
public class EmpServiceTest {
private ApplicationContext cxt;
@Before
public void setup(){
cxt=new ClassPathXmlApplicationContext("beans.xml");
}
@Test
public void testSave(){
EmployeeService employeeService=cxt.getBean(EmployeeService.class);
Employee employee=new Employee();
employee.setEname("张三");
employee.setAge(33);
employeeService.addEmployee(employee);
}
@Test
public void testSave2(){
EmployeeService employeeService=cxt.getBean(EmployeeService.class);
List<Employee> employees=new ArrayList<Employee>();
for(int i=0;i<10;i++){
Employee employee=new Employee();
employee.setEname("张三"+i);
employee.setAge(i);
employees.add(employee);
}
employeeService.addEmployee(employees);
}
@Test
public void testSave3(){
EmployeeService employeeService=cxt.getBean(EmployeeService.class);
Employee employee=employeeService.findByEid(1);
System.out.println(employee.getEid()+"\t"+employee.getEname()+"\t"+employee.getAge());
}
@Test
public void testSave4(){
EmployeeService employeeService=cxt.getBean(EmployeeService.class);
List<Employee> all=employeeService.findAll();
for (Employee employee : all) {
System.out.println(employee.getEid()+"\t"+employee.getEname()+"\t"+employee.getAge());
}

}
@Test
public void testSave5(){
EmployeeService employeeService=cxt.getBean(EmployeeService.class);
employeeService.deleteEmployeeByEid(1);
}
@Test
public void testFindByEnameLike(){
EmployeeService employeeService=cxt.getBean(EmployeeService.class);
Employee employee=employeeService.findEmployeeByEname("张三0");
System.out.println("姓名:"+employee.getEname());
}
@Test
public void testUpdateEmployee(){
EmployeeService employeeService=cxt.getBean(EmployeeService.class);
Employee employee=new Employee();
employee.setEid(3);
employee.setEname("李四");
employee.setAge(45);
employeeService.updateEmployee(employee);
}
@Test
public void testFindAllByPage(){
EmployeeService employeeService=cxt.getBean(EmployeeService.class);
Employee employee=new Employee();
employee.setEname("张三");
employee.setAge(3);
Page<Employee> page=employeeService.findAllByPage(employee,1,5);
int totalPages=page.getTotalPages();
int size=page.getSize();
System.out.println("共"+totalPages+"页");
System.out.println("共"+size+"条记录");  
List<Employee> employees=page.getContent();
for (Employee item : employees) {
System.out.println(item.getEid()+"\t"+item.getEname()+"\t"+item.getAge());
}
}

猜你喜欢

转载自zhaijizhe.iteye.com/blog/2403892