简介
springdata下的一个项目 提供了一套JPA标准的数据库操作方案,底层还是HibernateJPA
我们只需要定义接口然后继承SpringDataJpa中的接口即可,不用写实现类,意思dao不需要实现
startUp 在SpringHibernateJPA基础上修改
pom.xml文件添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <dependencies > <dependency > <groupId > log4j</groupId > <artifactId > log4j</artifactId > <version > 1.2.17</version > </dependency > <dependency > <groupId > org.slf4j</groupId > <artifactId > slf4j-log4j12</artifactId > <version > 1.8.0-beta4</version > </dependency > <dependency > <groupId > org.slf4j</groupId > <artifactId > slf4j-api</artifactId > <version > 1.8.0-beta4</version > </dependency > <dependency > <groupId > org.springframework.data</groupId > <artifactId > spring-data-jpa</artifactId > <version > 2.1.5.RELEASE</version > </dependency > <dependency > <groupId > org.springframework.data</groupId > <artifactId > spring-data-commons</artifactId > <version > 2.1.5.RELEASE</version > </dependency > <dependency >
修改配置文件applicationContext.xml
开启命名空间
1 xmlns:jpa="http://www.springframework.org/schema/data/jpa" http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
添加SpringDataJPA配置
1 2 3 <jpa:repositories base-package ="com.tr.dao" />
完整的配置文件
/resources/applicationContext.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 <?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 " > <context:property-placeholder location ="jdbc.properties" > </context:property-placeholder > <bean id ="dataSource" class ="com.mchange.v2.c3p0.ComboPooledDataSource" > <property name ="jdbcUrl" value ="${jdbc.url}" > </property > <property name ="driverClass" value ="${jdbc.driver.class}" /> <property name ="user" value ="${jdbc.username}" /> <property name ="password" value ="${jdbc.password}" /> </bean > <bean id ="entityManager" class ="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > <property name ="dataSource" ref ="dataSource" /> <property name ="jpaVendorAdapter" > <bean class ="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" > <property name ="database" value ="MYSQL" /> <property name ="generateDdl" value ="true" /> <property name ="showSql" value ="true" /> </bean > </property > <property name ="packagesToScan" > <list > <value > com.tr</value > </list > </property > </bean > <bean id ="transactionManager" class ="org.springframework.orm.jpa.JpaTransactionManager" > <property name ="entityManagerFactory" ref ="entityManager" /> </bean > <tx:annotation-driven transaction-manager ="transactionManager" /> <context:component-scan base-package ="com.tr" /> <jpa:repositories base-package ="com.tr.dao" /> </beans >
/resources/jdbc.properties
1 2 3 4 jdbc.url=jdbc:mysql://1.11.11.111:3306/MyTest jdbc.driver.class=com.mysql.cj.jdbc.Driver jdbc.username=root jdbc.password=123
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 <?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 > SpringDataJPA</groupId > <artifactId > SpringDataJPA</artifactId > <version > 1.0-SNAPSHOT</version > <dependencies > <dependency > <groupId > log4j</groupId > <artifactId > log4j</artifactId > <version > 1.2.17</version > </dependency > <dependency > <groupId > org.slf4j</groupId > <artifactId > slf4j-log4j12</artifactId > <version > 1.8.0-beta4</version > </dependency > <dependency > <groupId > org.slf4j</groupId > <artifactId > slf4j-api</artifactId > <version > 1.8.0-beta4</version > </dependency > <dependency > <groupId > org.springframework.data</groupId > <artifactId > spring-data-jpa</artifactId > <version > 2.1.5.RELEASE</version > </dependency > <dependency > <groupId > org.springframework.data</groupId > <artifactId > spring-data-commons</artifactId > <version > 2.1.5.RELEASE</version > </dependency > <dependency > <groupId > org.hibernate</groupId > <artifactId > hibernate-entitymanager</artifactId > <version > 5.4.1.Final</version > </dependency > <dependency > <groupId > junit</groupId > <artifactId > junit</artifactId > <version > 4.12</version > <scope > test</scope > </dependency > <dependency > <groupId > org.aspectj</groupId > <artifactId > aspectjweaver</artifactId > <version > 1.8.13</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-core</artifactId > <version > 5.0.11.RELEASE</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-expression</artifactId > <version > 5.0.11.RELEASE</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-beans</artifactId > <version > 5.0.11.RELEASE</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-aop</artifactId > <version > 5.0.11.RELEASE</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-context</artifactId > <version > 5.0.11.RELEASE</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-tx</artifactId > <version > 5.0.11.RELEASE</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-jdbc</artifactId > <version > 5.0.11.RELEASE</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-test</artifactId > <version > 5.0.11.RELEASE</version > </dependency > <dependency > <groupId > org.aspectj</groupId > <artifactId > aspectjrt</artifactId > <version > 1.8.13</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-orm</artifactId > <version > 5.0.11.RELEASE</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-aspects</artifactId > <version > 5.0.11.RELEASE</version > </dependency > <dependency > <groupId > antlr</groupId > <artifactId > antlr</artifactId > <version > 2.7.7</version > </dependency > <dependency > <groupId > dom4j</groupId > <artifactId > dom4j</artifactId > <version > 1.6.1</version > </dependency > <dependency > <groupId > org.apache.geronimo.specs</groupId > <artifactId > geronimo-jta_1.1_spec</artifactId > <version > 1.1.1</version > </dependency > <dependency > <groupId > org.hibernate.common</groupId > <artifactId > hibernate-commons-annotations</artifactId > <version > 5.0.1.Final</version > </dependency > <dependency > <groupId > org.hibernate</groupId > <artifactId > hibernate-core</artifactId > <version > 5.2.17.Final</version > </dependency > <dependency > <groupId > org.hibernate.javax.persistence</groupId > <artifactId > hibernate-jpa-2.1-api</artifactId > <version > 1.0.2.Final</version > </dependency > <dependency > <groupId > org.jboss</groupId > <artifactId > jandex</artifactId > <version > 2.0.3.Final</version > </dependency > <dependency > <groupId > org.javassist</groupId > <artifactId > javassist</artifactId > <version > 3.22.0-GA</version > </dependency > <dependency > <groupId > org.jboss.logging</groupId > <artifactId > jboss-logging</artifactId > <version > 3.3.2.Final</version > </dependency > <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > <version > 8.0.13</version > </dependency > <dependency > <groupId > com.mchange</groupId > <artifactId > c3p0</artifactId > <version > 0.9.5-pre8</version > </dependency > <dependency > <groupId > com.mchange</groupId > <artifactId > mchange-commons-java</artifactId > <version > 0.2.7</version > </dependency > <dependency > <groupId > org.hibernate</groupId > <artifactId > hibernate-c3p0</artifactId > <version > 5.4.1.Final</version > </dependency > <dependency > <groupId > junit</groupId > <artifactId > junit</artifactId > <version > 4.12</version > <scope > compile</scope > </dependency > <dependency > <groupId > junit</groupId > <artifactId > junit</artifactId > <version > 4.12</version > </dependency > </dependencies > </project >
使用idea的实体映射自动生成实体类 1. 在项目的faclet中添加JPA组件和Hibernate,且JPA组件在下拉栏中选择Hibernate作为提供者,右键JPA选择generate Persistence Mapping ==> ByDataBaseSchema
2. 在ImportDatabaseSchema中选中左下角:AddToPersistenceUnit
编写dao层接口
使用SpringDataJPA不需要对dao层接口做实现
继承extends JpaRepository<Users,Integer>
第一个参数:操作的实体类(实体类隐射了数据库表)
第二个参数:这个实体类的主键类型
编写测试类 千万不要忘记@ContextConfiguration!!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package com.tr.test;import com.tr.dao.UsersDao;import com.tr.domain.Users;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 javax.transaction.Transactional;@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class testUsersDao { @Autowired private UsersDao usersDao; @Test @Transactional(rollbackOn = Exception.class) public void testInsertUsers () { Users users = new Users("sdj" , "sdj" , "sdj" , "sdj" , "sdj" , "sdj" , "sdj" ); this .usersDao.save(users); } }
接口使用 Repository接口 注意点:继承的包org.springframework.data.repository.Repository;
且继承后要写泛型里面的类型
读取下划线字段findByCust_name会出错,使用@Column转驼峰法
是SpringDataJPA提供的顶层接口 是一个标识接口
提供了两种查询方式的支持
基于方法命名规则查询
规则:findBy(关键字)+属性名称(属性名称首字母大写)+ 查询条件(首字母大写)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Test public void testGetUserByName () { List<Users> list = this .usersDaoWithRepository.findByNameIs("tzq" ); for (Users u : list) { System.out.println(u); } }
1 2 3 4 5 6 7 8 9 10 11 12 @Test public void testAnd () { List<Users> list = this .usersDaoWithRepository.findByNameLikeAndLinkmanLike("t%" ,"tr" ); for (Users u : list) { System.out.println(u); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package com.tr.dao;import com.tr.domain.Users;import org.springframework.data.repository.Repository;import java.util.List;public interface UsersDaoWithRepository extends Repository <Users ,Integer > { List<Users> findByNameIs (String tzq) ; List<Users> findByNameLike (String s) ; List<Users> findByLinkmanIs (String tr) ; List<Users> findByNameLikeAndLinkmanLike (String s, String tr) ; }
基于@Query注解查询
通过JPQL语句查询(基于HQL改来的)
1 2 3 @Query(value = "from Users where name = ?1") List<Users> queryUserByNameUseJPQL (String name) ;
通过SQL语句查询
1 2 3 @Query(value = "select * from cst_customer where cust_name=?", nativeQuery = true) List<Users> queryUsersBySql (String name) ;
更新语句
1 2 3 4 5 @Query("update Users set name=?2 where id=?1") @Transactional(rollbackOn = Exception.class) @Rollback(false) @Modifying void updateNameById (int i, String jpa) ;
CureRepository接口
继承了接口后可以直接crud了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 @Test @Rollback(false) public void test1 () { Users users = new Users(); users.setName("CrudJpa" ); this .usersDao.save(users); } @Test @Rollback(true) public void test2 () { Users users = new Users(); users.setName("CrudJpa1" ); Users users2 = new Users(); users2.setName("CrudJpa2" ); List<Users> list = new LinkedList<>(); list.add(users); list.add(users2); this .usersDao.saveAll(list); } @Test public void test3 () { Optional<Users> users = this .usersDao.findById(1 ); System.out.println(users.get()); } @Test public void test4 () { Iterable<Users> users = this .usersDao.findAll(); for (Users u : users) { System.out.println(u); } } @Test @Transactional @Rollback(false) public void test5 () { Optional<Users> byId = this .usersDao.findById(1 ); Users users = byId.get(); users.setName("changed" ); }
PagingAndSortingRepository接口