1.加入jar包antlr-2.7.7.jar
c3p0-0.9.2.1.jar
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.1.3.jar
dom4j-1.6.1.jar
hibernate-c3p0-4.2.4.Final.jar
hibernate-commons-annotations-4.0.2.Final.jar
hibernate-core-4.2.4.Final.jar
hibernate-entitymanager-4.2.4.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.1.Final.jar
mchange-commons-java-0.2.3.4.jar
mysql-connector-java-5.1.7-bin.jar
slf4j-api-1.7.26.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-data-commons-1.6.2.RELEASE.jar
spring-data-jpa-1.4.2.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-jdbc-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
2.配置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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
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-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.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">
<!-- 配置要扫描的包 -->
<context:component-scan base-package="zhang.springdata"></context:component-scan>
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据源 -->
<bean id="comboPooledDataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driverclass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
</bean>
<!-- 配置LocalEntityManagerFactory -->
<bean id="localContainerEntityManagerFactoryBean"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="comboPooledDataSource"></property>
<!-- 配置配置器 -->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
</property>
<property name="packagesToScan" value="zhang.springdata.entities"></property>
<property name="jpaProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
<!-- 配置管理器 -->
<bean id="jpaTransactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="localContainerEntityManagerFactoryBean"></property>
</bean>
<!--配置事务的属性 -->
<tx:advice id="txadvice" transaction-manager="jpaTransactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* zhang.springdata.dao.*.*(..))" id="pointcut"/>
<aop:advisor advice-ref="txadvice" pointcut-ref="pointcut"/>
</aop:config>
<!-- 配置springdata -->
<jpa:repositories base-package="zhang.springdata" entity-manager-factory-ref="localContainerEntityManagerFactoryBean"></jpa:repositories>
</beans>
3.db.properties
jdbc.user=root
jdbc.password=zhangyukang
jdbc.driverclass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jpa_springdata
4.实体类:
package zhang.springdata.entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Person {
private Integer id;
private String name;
private int age;
private String email;
private Address address;
@JoinColumn(name="address_id")
@ManyToOne
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@GeneratedValue(strategy=GenerationType.AUTO)
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + ", email=" + email + "]";
}
}
package zhang.springdata.test;
import java.sql.SQLException;
import java.util.List;
import javax.persistence.Embeddable;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import zhang.springdata.dao.PersonDao;
import zhang.springdata.dao.PersonRepsotory;
import zhang.springdata.entities.Person;
public class Testspringdata {
private ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
private PersonDao personDao=null;
private PersonRepsotory personRepsotory=null;
{
personDao=ctx.getBean(PersonDao.class);
personRepsotory=ctx.getBean(PersonRepsotory.class);
}
@Test
public void testjpa(){
List<Person> persons = personRepsotory.getByAddressIdGreaterThan(2);
System.out.println(persons);
}
@Test
public void testquery3(){
List<Person> persons = personRepsotory.getByEmailInOrAgeLessThan(new String[]{"[email protected]"}, 25);
System.out.println(persons);
}
@Test
public void tsetqueryperson2(){
List<Person> persons = personRepsotory.getByNameEndingWithAndIdLessThan("g", 5);
System.out.println(persons);
}
@Test
public void testqueryperson(){
List<Person> persons = personRepsotory.getByNameStartingWithAndIdLessThan("z", 5);
System.out.println(persons);
}
@Test
public void testpersonrepsotory(){
PersonRepsotory personRepsotory=ctx.getBean(PersonRepsotory.class);
Person person = personRepsotory.getByName("zhangyukang1");
System.out.println(person);
}
@Test
public void testgetallperson(){
List<Person> persons = personDao.getAll();
System.out.println(persons.size());
}
@Test
public void testdeleteperson(){
personDao.deletePerson(1);
}
@Test
public void testsaveperson(){
Person person=new Person();
person.setAge(23);
person.setEmail("[email protected]");
person.setName("张");
personDao.savePerson(person);
}
@Test
public void testgetPerson(){
Person person = personDao.getPerson(1);
System.out.println(person);
}
@Test
public void testpersondao(){
PersonDao personDao=ctx.getBean(PersonDao.class);
List<Person> persons = personDao.getAll();
}
@Test
public void testgetconnection() throws SQLException{
DataSource dataSource=ctx.getBean(DataSource.class);
System.out.println(dataSource.getConnection());
}
@Test
public void testentities(){
EntityManagerFactory entityManagerFactory=ctx.getBean(EntityManagerFactory.class);
System.out.println(entityManagerFactory);
}
}
package zhang.springdata.dao;
import java.util.List;
import org.springframework.data.repository.Repository;
import zhang.springdata.entities.Person;
/**
* 继承该接口会被纳入到IOC容器中,
* 也可以不继承该Repository接口,可以使用
* @RepositoryDefinition(domainClass=Person.class,idClass=Integer.class)
* 注解.
* @author Administrator
*
*/
/**
* Repository中定义方法的规范.
* 1.不是随便声明的,需要满足一定的规范
* 2.查询方法用 find,get,read,开头
* 3.如果涉及条件查询的时候,属性的首字母需要大写
* 4.支持属性的级联查询,如果当前类有符合的属性,则优先使用当前类的属性
* 如果一定要使用级联属性,可以使用_进行连接
*/
public interface PersonRepsotory extends Repository<Person, Integer>{
//WHERE ADDRESS.ID>?
public List<Person> getByAddressIdGreaterThan(Integer id);
//WHERE ADDRESS.ID>?
public List<Person> getByAddress_IdGreaterThan(Integer id);
//WHERE EMAIL IN(?,?,?) OR AGE<?
public List<Person> getByEmailInOrAgeLessThan(String[] strs,Integer age);
//通过姓名来查询
public Person getByName(String name);
//WHERE name like z% and id>?
public List<Person> getByNameStartingWithAndIdLessThan(String name,Integer id);
//WHERE name like %g and id>?
public List<Person> getByNameEndingWithAndIdLessThan(String name,Integer id);
}