springboot整合springDataJPA,(Repository,CrudRepository,PagingSortingReository,JpaRepository,JPASpecif)

一,springJPA介绍
springData:其实springData就是spring提供了一个操作数据库框架
而springDataJPA只是springData框架下的一个基于JPA标准操作数据的模块
springDataJPA:基于JPA的标准对数据进行操作,简化操作持久层的代码
只需要编写接口就可以

二,springboot整合springDataJPA
创建maven项目
修改pom.xml文件

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.10.RELEASE</version>
	</parent>
	<groupId>com.ljw</groupId>
	<artifactId>spring-boot-springDataJPA</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<properties>
		<java.version>1.8</java.version>
		<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
		<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
	</properties>
	<dependencies>
		<!-- springboot的启动器 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<!-- springData的启动器 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<!-- 测试工具的启动器 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
		</dependency>
		<!-- mysql数据库驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!-- druid数据库连接池 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.9</version>
		</dependency>
	</dependencies>
</project>


添加application.properties文件

#数据库连接配置
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/aa
spring.datasource.username=root
spring.datasource.password=

#数据源的类型配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#正向工程开启
spring.jpa.hibernate.ddl-auto=update
#打印sql语句
spring.jpa.show-sql=true


添加实体类


@Entity
@Table(name="t_uu")
public class Users {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private Integer id;
	@Column(name = "name")
	private String name;
	@Column(name = "age")
	private Integer age;
	@Column(name = "address")
	private String address;
	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 String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Users [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
	}
	
	
	
}

 

SpringDataJpa提供的核心接口
1,Repository接口
提供了方法名称名称查询方式
编辑接口

package com.ljw.dao;

import java.util.List;

import org.springframework.data.repository.Repository;

import com.ljw.pojo.Users;

/**
 * Repository接口的方法名称查询
 * @author lenovo
 *
 */
public interface UserRepositoryByName extends Repository<Users, Integer> {

	/*
	 * 方法名称必须遵守驼峰命名规则,findBy(关键字)+属性名称(首字母要大写)+查询条件(首字母大写)
	 */
	List<Users> findByName(String name);
	List<Users> findByNameAndAge(String name,Integer age);
	List<Users> findByNameLike(String name);
}


些junit测试

@Test
	public void testFindByName() {
		List<Users> list=this.userRepositoryByName.findByName("ljw");
		for (Users users : list) {
			System.out.println(users);
		}
	}
	@Test
	public void testFindByNameAndAge() {
		List<Users> list=this.userRepositoryByName.findByNameAndAge("ljw",30);
		for (Users users : list) {
			System.out.println(users);
		}
	}
	@Test
	public void testFindByNameLike() {
		List<Users> list=this.userRepositoryByName.findByNameLike("l%");
		for (Users users : list) {
			System.out.println(users);
		}
	}


提供了基于@Query注解查询与更新
编写接口

package com.ljw.dao;

import java.util.List;

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;

import com.ljw.pojo.Users;

/**
 * Repository  @Query
 * @author lenovo
 *
 */
public interface UserRepositoryQueryAnnotation extends Repository<Users, Integer> {

	@Query("from Users where name = ?")
	List<Users> queryByNameUseHQL(String name);
	
	@Query(value = "select * from t_uu where name = ?" ,nativeQuery = true)
	List<Users> queryByNameUseSQL(String name);
	
	@Query("update Users set name = ?  where id = ?")
	@Modifying
	void updateUserNameById(String name,Integer id);
	
}


编写测试类

@Test
	public void testQueryByNameUseHQL() {
		List<Users> list=this.userRepositoryQueryAnnotation.queryByNameUseHQL("ljw");
		for (Users users : list) {
			System.out.println(users);
		}
	}
	
	@Test
	public void testQueryByNameUseSQL() {
		List<Users> list=this.userRepositoryQueryAnnotation.queryByNameUseSQL("ljw");
		for (Users users : list) {
			System.out.println(users);
		}
	}
	@Test
	@Transactional	//@Transactional与@Test一起使用事物自动回滚
	@Rollback(false)	//取消自动回滚
	public void testupdateUserNameById() {
		this.userRepositoryQueryAnnotation.updateUserNameById("LJW", 1);
	}

2,CrudRepository接口
主要是完成一些曾删改查的操作
注意:CrudRepository继承了Repository接口
编写接口继承CrudRepository

package com.ljw.dao;

import org.springframework.data.repository.CrudRepository;

import com.ljw.pojo.Users;

public interface UserRepositoryCrudRepository extends CrudRepository<Users, Integer> {

}


编写测试类

@Test
	public void testCrudRepositorSave() {
		Users users=new Users();
		users.setName("Gavin");
		users.setAge(30);
		users.setAddress("XXXXXX");
		this.userRepositoryCrudRepository.save(users);
	}
	@Test
	public void testCrudRepositorFindOne() {
		Users users = this.userRepositoryCrudRepository.findOne(2);
		System.out.println(users);
	}
	@Test
	public void testCrudRepositorFindAll() {
		Iterable<Users> list = this.userRepositoryCrudRepository.findAll();
		for (Users users : list) {
			System.out.println(users);
		}
	}
	@Test
	public void testCrudRepositorDeleteById() {
		this.userRepositoryCrudRepository.delete(2);;
	}

 

3,PagingSortingReository接口
该接口提供了分页与排序的操作
该接口继承了CrudRepository接口
编写接口

package com.ljw.dao;

import org.springframework.data.repository.PagingAndSortingRepository;

import com.ljw.pojo.Users;

public interface UserRepositoryPagingAndSorting extends PagingAndSortingRepository<Users, Integer> {

}


编写测试类

@Test
	public void testPagingAndSortingSort() {
		Order order=new Order(Direction.DESC,"id");//定义排序规则
		Sort sort=new Sort(order);//疯传排序对象规则
		Iterable<Users> list = this.userRepositoryPagingAndSorting.findAll(sort);
		for (Users users : list) {
			System.out.println(users);
		}
	}
	@Test
	public void testPagingAndSortingPage() {
		//Pageable 封装分页参数,当前页,每页显示的条数:注意它的当前页是从0开始
		//PageRequest(page, size)//当前页,每页显示的条数
		Pageable pageable=new PageRequest(0, 3);
		Page<Users> page = this.userRepositoryPagingAndSorting.findAll(pageable);
		System.out.println("总数:"+page.getTotalElements());
		System.out.println("总页数"+page.getTotalPages());
		List<Users> list = page.getContent();
		for (Users users : list) {
			System.out.println(users);
		}
	}
	@Test
	public void testPagingAndSortingPageAndSort() {
		Order order=new Order(Direction.DESC,"id");
		Sort sort=new Sort(order);
		Pageable pageable=new PageRequest(0, 3, sort);
		Page<Users> page = this.userRepositoryPagingAndSorting.findAll(pageable);
		System.out.println("总数:"+page.getTotalElements());
		System.out.println("总页数"+page.getTotalPages());
		List<Users> list = page.getContent();
		for (Users users : list) {
			System.out.println(users);
		}
	}

 


4,JpaRepository接口
该接口继承了PagingSortingReository接口
对继承的父接口中的返回值进行适配
在开发过程中最常用的接口
编写接口

package com.ljw.dao;

import org.springframework.data.jpa.repository.JpaRepository;

import com.ljw.pojo.Users;

public interface UserRepositoryJpaRepository extends JpaRepository<Users, Integer> {

}


编写测试类

@Test
	public void testJpaRepositorySort() {
		Order order=new Order(Direction.DESC,"id");//定义排序规则
		Sort sort=new Sort(order);//疯传排序对象规则
		Iterable<Users> list = this.userRepositoryJpaRepository.findAll(sort);
		for (Users users : list) {
			System.out.println(users);
		}
	}
	


5,JPASpecificationExcutor接口
该接口主要提供了多条件查询的支持
并且可以在查询中添加分页和排序
JPASpecificationExcutor接口是单独存在,完全独立
编写接口与JpaRepository一起使用

package com.ljw.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import com.ljw.pojo.Users;

public interface UserRepositoryJpaSecificationExcutor extends JpaSpecificationExecutor<Users>, JpaRepository<Users, Integer> {

}


编写测试类

@Test
	public void testJpaSecificationExcutor1() {
		Specification<Users> spec=new Specification<Users>() {
			/**
			 * Root<Users> root:查询对象属性的封装
			 * CriteriaQuery<?> query:封装了我们要执行查中的各个部分的信息(select from order)
			 * CriteriaBuilder cb:查询条件的构造器,定义不同的查询条件
			 * return Predicate:封装了单个查询条件
			 */
			@Override
			public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
				/*
				 * 参数1:查询的条件熟悉
				 * 参数2:条件的值
				 */
				Predicate pre=cb.equal(root.get("name"), "LJW");
				return pre;
			}
			
		};
		List<Users> list = this.userRepositoryJpaSecificationExcutor.findAll(spec);
		for (Users users : list) {
			System.out.println(users);
		}
		
	}
	@Test
	public void testJpaSecificationExcutor2() {
		Specification<Users> spec=new Specification<Users>() {
			/**
			 * Root<Users> root:查询对象属性的封装
			 * CriteriaQuery<?> query:封装了我们要执行查中的各个部分的信息(select from order)
			 * CriteriaBuilder cb:查询条件的构造器,定义不同的查询条件
			 * return Predicate:封装了单个查询条件
			 */
			@Override
			public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
				/*
				 * 参数1:查询的条件熟悉
				 * 参数2:条件的值
				 */
				List<Predicate> list=new ArrayList<Predicate>();
				list.add(cb.equal(root.get("name"), "LJW"));
				list.add(cb.equal(root.get("age"), 30));
				Predicate[] arr = new Predicate[list.size()];
				return cb.and(list.toArray(arr));
			}
			
		};
		List<Users> list = this.userRepositoryJpaSecificationExcutor.findAll(spec);
		for (Users users : list) {
			System.out.println(users);
		}
		
	}
/**
	 * 多条件查询,分页
	 */
	@Test
	public void testJpaSecificationExcutor3() {
		Specification<Users> spec=new Specification<Users>() {
			@Override
			public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
				Predicate pred=cb.or(
						cb.and(cb.equal(root.get("name"),"LJW"),cb.equal(root.get("age"),30)),
						cb.equal(root.get("id"),5));// where (name = ? and age = ?) or id = ?
				return pred;
			}
			
		};
		Sort sort=new Sort(Direction.DESC,"id");
		Pageable pageable=new PageRequest(0, 3, sort);
		Page<Users> page = this.userRepositoryJpaSecificationExcutor.findAll(spec,pageable);
		System.out.println("总数:"+page.getTotalElements());
		System.out.println("总页数"+page.getTotalPages());
		List<Users> list = page.getContent();
		for (Users users : list) {
			System.out.println(users);
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值