【102】
SpringDataJPA
SpringDataJPA 是springdata 项目下的一个模块。提供了一套基于JPA 标准操作数据库的简化方案。底层默认的是依赖 HibernateJPA 来实现的。
SpringDataJPA 的技术特点:我们只需要定义接口并集成 Spring DataJPA 中所提供的接 口就可以了。不需要编写接口实现类。
一、 创建 SpringDataJPA 项目
1 导入 jar 包
配置文件
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="Index of /schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd Index of /schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/data/jpahttp://www.springframework.org/schema/data/jpa/spring-jpa.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd">
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBe an">
com.bjsxt.pojo
class="org.springframework.orm.jpa.JpaTransactionManager">
二、 SpringDataJPA 的接口继承结构
三、 SpringDataJPA 的运行原理
@PersistenceContext(name="entityManagerFactory")
private EntityManager em;
@Test
public void test1(){
//org.springframework.data.jpa.repository.support.SimpleJpaRepositor y@fba8bf//System.out.println(this.usersDao);//class com.sun.proxy.$Proxy29 代理对象 是基于 JDK 的动态代理方式 创建的//System.out.println(this.usersDao.getClass());JpaRepositoryFactory factory = new JpaRepositoryFactory(em);
//getRepository(UsersDao.class);可以帮助我们为接口生成实现类。//而 这个实现类是 SimpleJpaRepository 的对象//要求:该接口必须要是继承 Repository 接口UsersDao ud = factory.getRepository(UsersDao.class);
System.out.println(ud);
System.out.println(ud.getClass()); }
四、 Repository 接口
Repository 接口是 SpringDataJPA 中为我我们提供的所有接口中的顶层接口
Repository 提供了两种查询方式的支持
1)基于方法名称命名规则查询
2)基于@Query 注解查询
1 方法名称命名规则查询
规则:findBy(关键字)+属性名称(属性名称的首字母大写)+查询条件(首字母大写)
1.1创建接口
/** * Repository 接口讲解* @author Administrator* */
public interface UsersDao extends Repository {
List findByUsernameIs(String string);
List findByUsernameLike(String string);
List findByUsernameAndUserageGreaterThanEqual(String name,Integer age); }
1.2测试类
/** * Repository 接口测试* @author Administrator* */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class RepositoryTest {
@Autowired private UsersDao usersDao;
/*** 需求:使用用户名作为查询条件*/ @Test public void test1(){
/*** 判断相等的条件,有三种表示方式* 1,什么都不写,默认的就是做相等判断* 2,Is* 3,Equal*/ List list = this.usersDao.findByUsernameIs("王五");
for (Users users : list) { System.out.println(users); } }
/*** 需求:根据用户姓名做 Like 处理* Like:条件关键字*/
@Test public void test2(){
List list = this.usersDao.findByUsernameLike("王%");
for (Users users : list) {
System.out.println(users); }
}
/** * 需求:查询名称为王五,并且他的年龄大于等于 22 岁*/
@Test public void test3(){
List list = this.usersDao.findByUsernameAndUserageGreaterThanEqual("王五", 22);
for (Users users : list) { System.out.println(users); } } }
2 基于@Query 注解的查询
2.1通过 JPQL 语句查询
JPQL:通过 Hibernate 的 HQL 演变过来的。他和 HQL 语法及其相似。
2.1.1创建接口
/** * Repository 接口讲解* @author Administrator* */
public interface UsersDao extends Repository {
//方法名称命名规则List findByUsernameIs(String string);
List findByUsernameLike(String string);
List findByUsernameAndUserageGreaterThanEqual(String name,Integer age);
//使用@Query 注解查询@Query(value="from Users where username = ?")
List queryUserByNameUseJPQL(String name);
@Query("from Users where username like ?")
List queryUserByLikeNameUseJPQL(String name);
@Query("from Users where username = ? and userage >= ?")
List queryUserByNameAndAge(String name,Integer age);
}
2.1.2测试类
/*** 测试@Query 查询 JPQL*/
@Test public void test4(){
List list = this.usersDao.queryUserByNameUseJPQL("王五");
for (Users users : list) {
System.out.println(users);
}
}
/*** 测试@Query 查询 JPQL*/
@Test public void test5(){
List list = this.usersDao.queryUserByLikeNameUseJPQL("王%");
for (Users users : list) {
System.out.println(users); }
}
/*** 测试@Query 查询 JPQL*/ @Test public void test6(){
List list = this.usersDao.queryUserByNameAndAge("王五",22);
for (Users users : list) {
System.out.println(users);
}
}
2.2通过 SQL 语句查询
2.2.1创建接口
/*** Repository 接口讲解* @author Administrator* */
public interface UsersDao extends Repository {
//方法名称命名规则List findByUsernameIs(String string);
List findByUsernameLike(String string);
List findByUsernameAndUserageGreaterThanEqual(String name,Integer age);
//使用@Query 注解查询@Query(value="from Users where username = ?")
List queryUserByNameUseJPQL(String name);
@Query("from Users where username like ?")
List queryUserByLikeNameUseJPQL(String name);
@Query("from Users where username = ? and userage >= ?")
List queryUserByNameAndAge(String name,Integer age);
//使用@Query 注解查询 SQL//nativeQuery:默认的是 false.表示不开启 sql 查询。是否对 value 中的语句做转义。
@Query(value="select * from t_users where username = ?",nativeQuery=true)
List queryUserByNameUseSQL(String name);
@Query(value="select * from t_users where username like ?",nativeQuery=true)
List queryUserByLikeNameUseSQL(String name);
@Query(value="select * from t_users where username = ? and userage >= ?",nativeQuery=true)
List queryUserByNameAndAgeUseSQL(String name,Integer age);
}
2.2.2测试类
/*** 测试@Query 查询 SQL*/
@Test public void test7(){
Listlist =this.usersDao.queryUserByNameUseSQL("王五");
for (Users users : list) {
System.out.println(users); } }
/*** 测试@Query 查询 SQL*/ @Test public void test8(){
List list = this.usersDao.queryUserByLikeNameUseSQL("王%");
for (Users users : list) {
System.out.println(users); }
}
/*** 测试@Query 查询 SQL*/ @Test public void test9(){
List list = this.usersDao.queryUserByNameAndAgeUseSQL(" 王五", 22);
for (Users users : list) {
System.out.println(users); } }
3 通过@Query 注解完成数据更新
3.1创建接口
@Query("update Users set userage = ? where userid = ?")
@Modifying
//@Modifying 当前语句是一个更新语句void updateUserAgeById(Integer age,Integer id);
3.2测试类
/*** 测试@Query update*/
@Test
@Transactional
@Rollback(false)
public void test10(){
this.usersDao.updateUserAgeById(24, 5); }