一,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);
}
}