Spring Boot的数据访问(一)Spring Data JPA

Spring Data概述

Spring Data项目是Spring用来解决数据访问问题的一揽子方案,Spring Data是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案:

Spring Data为我们使用统一的API来对上述的数据存储技术进行数据访问操作提供了支持。这是Spring通过提供Spring Data Commons项目来实现的,它是上述各种Spring Data项目的依赖。Spring Data Commons让我们在使用关系型或非关系型数据访问技术时都使用基于Spring的统一标准,该标准包含CURD、查询、排序、和分页的相关的操作。
Spring Data Commons重要概念:Spring Data Repository抽象。使用Spring Data Repository可以极大地减少数据访问层的代码。既然是数据访问操作的统一标准,那肯定是定义了各种各样和数据访问相关的接口!

JPA(Java Persistence API)

JPA是一个基于O/R映射的标准规范。所谓规范即只定义标准规则(如注解、接口),不提供实现,软件提供商可以按照标准规范来实现,而使用者只需按照规范中定义的方式来使用,而不用和软件提供商的实现打交道!

Spring Boot 使用Spring Data JPA

1:新建Spring Boot项目:依赖选择JPA和Web,并导入数据库驱动;
2:配置属性
application.properties

//数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/book
spring.datasource.username=root
spring.datasource.password=123456

//JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent-output=true/ /让控制器输出的json字符串格式更美观

实体类Person.java

@Entity //指明这是一个和数据库表映射的实体类
@NamedQuery(name = "Person.withNameAndAddressNamedQuery",  //@NamedQuery定义查询方法,即一个名称映射一个查询语句
query = "select p from Person p where p.name=?1 and address=?2")
public class Person {
	@Id //主键
	@GeneratedValue //使用默认的主键生成方式自增
	private Long id;
	
	private String name;
	
	private Integer age;
	
	private String address;
	
	
	
	public Person() {
		super();
	}
	public Person(Long id, String name, Integer age, String address) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.address = address;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}


}

这里没有使用@Table、@Column注解。这是因为我们是采用正向工程通过实体类生成表结构,而不是通过逆向工程从表结构生成数据库。同时,我们没有通过@Column注解来注解普通属性,@Column是用来映射属性名和字段名,不注解的时候hibernate会自动根据属性名生成数据表的字段名,如:name映射为NAME,多字母属性如testName会自动映射为TEST_NAME。表名的映射规则也是如此!!!
数据访问层接口PersonRepository.java

public interface PersonRepository extends JpaRepository<Person, Long> {
	List<Person> findByAddress(String address);
	
	Person findByNameAndAddress(String name,String address);
	
	//@Query注解在接口的方法上实现查询
	@Query("select p from Person p where p.name= :name and p.address= :address")
	Person withNameAndAddressQuery(@Param("name")String name,@Param("address")String address);
	
	Person withNameAndAddressNamedQuery(String name,String address);

}

数据控制器DataController.java

@RestController
public class DataController {
	//1 Spring Data JPA已自动为你注册bean,所以可自动注入
	@Autowired
	PersonRepository personRepository;
	
	/**
	 * 保存
	 * save支持批量保存:<S extends T> Iterable<S> save(Iterable<S> entities);
	 * 
	 * 删除:
	 * 删除支持使用id,对象以,批量删除及删除全部:
	 * void delete(ID id);
	 * void delete(T entity);
	 * void delete(Iterable<? extends T> entities);
	 * void deleteAll();
	 * 
	 */
	@RequestMapping("/save")
	public Person save(String name,String address,Integer age){
		
		Person p = personRepository.save(new Person(null, name, age, address));
		System.out.println("save方法");
		return p;
		
	}
	

	
	/**
	 * 测试findByAddress
	 */
	@RequestMapping("/q1")
	public List<Person> q1(String address){
		
		List<Person> people = personRepository.findByAddress(address);
		
		return people;
		
	}
	
	/**
	 * 测试findByNameAndAddress
	 */
	@RequestMapping("/q2")
	public Person q2(String name,String address){
		
		Person people = personRepository.findByNameAndAddress(name, address);
		
		return people;
		
	}
	
	/**
	 * 测试withNameAndAddressQuery
	 */
	@RequestMapping("/q3")
	public Person q3(String name,String address){
		
		Person p = personRepository.withNameAndAddressQuery(name, address);
		
		return p;
		
	}
	
	/**
	 * 测试withNameAndAddressNamedQuery
	 */
	@RequestMapping("/q4")
	public Person q4(String name,String address){
		
		Person p = personRepository.withNameAndAddressNamedQuery(name, address);
		
		return p;
		
	}
	
	/**
	 * 测试排序
	 */
	@RequestMapping("/sort")
	public List<Person> sort(){
		
		List<Person> people = personRepository.findAll(new Sort(Direction.ASC,"age"));
		//按age,升序排序
		return people;
		
	}
	
	/**
	 * 测试分页
	 */
	@RequestMapping("/page")
	public Page<Person> page(){
		
		Page<Person> pagePeople = personRepository.findAll(new PageRequest(1, 2));
		//第一个参数表示页数,从0开始计,第二个参数表示每页的数据量。
		return pagePeople;
		
	}
		
}

测试运行效果:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

参考书籍:Spring Boot 实战
以上只是学习所做的笔记, 以供日后参考!!!

猜你喜欢

转载自blog.csdn.net/z1790424577/article/details/81126067