实体类:
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; /** * 雇员: 先开发实体类===>自动生成数据表 */ @Entity public class Employee { private Integer id; private String name; private Integer age; @GeneratedValue @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(length = 20) public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
repository层
package com.imooc.repository; import com.imooc.domain.Employee; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; import org.springframework.data.repository.RepositoryDefinition; import org.springframework.data.repository.query.Param; import java.util.List; @RepositoryDefinition(domainClass = Employee.class, idClass = Integer.class) public interface EmployeeRepository { //extends Repository<Employee,Integer>{ public Employee findByName(String name); // where name like ?% and age <? public List<Employee> findByNameStartingWithAndAgeLessThan(String name, Integer age); // where name like %? and age <? public List<Employee> findByNameEndingWithAndAgeLessThan(String name, Integer age); // where name in (?,?....) or age <? public List<Employee> findByNameInOrAgeLessThan(List<String> names, Integer age); // where name in (?,?....) and age <? public List<Employee> findByNameInAndAgeLessThan(List<String> names, Integer age); //查询Employee中id最大的 @Query("select o from Employee o where id=(select max(id) from Employee t1)") public Employee getEmployeeByMaxId(); @Query("select o from Employee o where o.name=?1 and o.age=?2") public List<Employee> queryParams1(String name, Integer age); @Query("select o from Employee o where o.name=:name and o.age=:age") public List<Employee> queryParams2(@Param("name")String name, @Param("age")Integer age); @Query("select o from Employee o where o.name like %?1%") public List<Employee> queryLike1(String name); @Query("select o from Employee o where o.name like %:name%") public List<Employee> queryLike2(@Param("name")String name); //本地sql查询 将nativeQuery = true,开启nativeQuery @Query(nativeQuery = true, value = "select count(1) from employee") public long getCount(); @Modifying @Query("update Employee o set o.age = :age where o.id = :id") public void update(@Param("id")Integer id, @Param("age")Integer age); }
server层
package com.imooc.service; import com.imooc.repository.EmployeeRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.transaction.Transactional; @Service public class EmployeeService { @Autowired private EmployeeRepository employeeRepository; //修改需要添加事物管理,事物一般添加在server层,这样可以对repo层的对应的方法放在一个事物里面 @Transactional public void update(Integer id, Integer age) { employeeRepository.update(id, age); } }
测试方法
repoTest
package com.imooc.repository; import com.imooc.domain.Employee; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.ArrayList; import java.util.List; public class EmployeeRepositoryTest { private ApplicationContext ctx = null; private EmployeeRepository employeeRepository = null; @Before public void setup() { ctx = new ClassPathXmlApplicationContext("beans-new.xml"); employeeRepository = ctx.getBean(EmployeeRepository.class); System.out.println("setup"); } @After public void tearDown() { ctx = null; System.out.println("tearDown"); } @Test public void testFindByName() { //org.springframework.data.jpa.repository.support.SimpleJpaRepository@1a9c0566 System.out.println(employeeRepository); Employee employee = employeeRepository.findByName("zhangsan"); System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } @Test public void testFindByNameStartingWithAndAgeLessThan() { List<Employee> employees = employeeRepository.findByNameStartingWithAndAgeLessThan("test", 22); for (Employee employee : employees) { System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } } @Test public void testFindByNameEndingWithAndAgeLessThan() { List<Employee> employees = employeeRepository.findByNameEndingWithAndAgeLessThan("6", 23); for (Employee employee : employees) { System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } } @Test public void testFindByNameInOrAgeLessThan() { List<String> names = new ArrayList<String>(); names.add("test1"); names.add("test2"); names.add("test3"); List<Employee> employees = employeeRepository.findByNameInOrAgeLessThan(names, 22); for (Employee employee : employees) { System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } } @Test public void testFindByNameInAndAgeLessThan() { List<String> names = new ArrayList<String>(); names.add("test1"); names.add("test2"); names.add("test3"); List<Employee> employees = employeeRepository.findByNameInAndAgeLessThan(names, 22); for (Employee employee : employees) { System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } } @Test public void testGetEmployeeByMaxId() { Employee employee = employeeRepository.getEmployeeByMaxId(); System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } @Test public void testQueryParams1() { List<Employee> employees = employeeRepository.queryParams1("zhangsan", 20); for (Employee employee : employees) { System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } } @Test public void testQueryParams2() { List<Employee> employees = employeeRepository.queryParams2("zhangsan", 20); for (Employee employee : employees) { System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } } @Test public void testQueryLike1() { List<Employee> employees = employeeRepository.queryLike1("test"); for (Employee employee : employees) { System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } } @Test public void testQueryLike2() { List<Employee> employees = employeeRepository.queryLike2("test1"); for (Employee employee : employees) { System.out.println("id:" + employee.getId() + " , name:" + employee.getName() + " ,age:" + employee.getAge()); } } @Test public void testGetCount() { long count = employeeRepository.getCount(); System.out.println("count:" + count); } }
serviceTest
package com.imooc.service; import com.imooc.repository.EmployeeRepository; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class EmployeeServiceTest { private ApplicationContext ctx = null; private EmployeeService employeeService = null; @Before public void setup() { ctx = new ClassPathXmlApplicationContext("beans-new.xml"); employeeService = ctx.getBean(EmployeeService.class); System.out.println("setup"); } @After public void tearDown() { ctx = null; System.out.println("tearDown"); } @Test public void testUpdate() { employeeService.update(1, 55); } }
springdataTest
package com.imooc; import com.imooc.dao.StudentDAO; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringDataTest { private ApplicationContext ctx = null; @Before public void setup(){ ctx = new ClassPathXmlApplicationContext("beans-new.xml"); System.out.println("setup"); } @After public void tearDown(){ ctx = null; System.out.println("tearDown"); } @Test public void testEntityManagerFactory(){ } }
配置文件 beans-new.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: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/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!--1 配置数据源--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="username" value="root"/> <property name="password" value="root"/> <property name="url" value="jdbc:mysql:///spring_data"/> </bean> <!--2 配置EntityManagerFactory--> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> </property> <property name="packagesToScan" value="com.imooc"/> <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> <!--3 配置事务管理器--> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <!--4 配置支持注解的事务--> <tx:annotation-driven transaction-manager="transactionManager"/> <!--5 配置spring data--> <jpa:repositories base-package="com.imooc" entity-manager-factory-ref="entityManagerFactory"/> <context:component-scan base-package="com.imooc"/> </beans>
maven配置文件pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.imooc</groupId> <artifactId>springdata</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!--MySQL Driver--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> <!--spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.5.RELEASE</version> </dependency> <!--spring data jpa--> <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> </dependencies> </project>