学习笔记:Spring Data JPA入门指南

目标

我们将会建一个小项目,运用Spring Data JPA来介绍流行编程语言program_lang POJOs,顺便也会用内存数据库IMDB从数据库进行基本查询。aaaa

准备

  • 大约15分钟的时间
  • 编程环境
    • JDK 1.8+
    • Maven 3.0+
    • Eclipse

定义Program_lang.java实体类。

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
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Program_lang {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String language;
private double ratings;
private double change;
protected Program_lang(){}
public Program_lang(String language, double ratings, double change){
this.language = language;
this.ratings = ratings;
this.change = change;
}
@Override
public String toString() {
return "Program_lang [id=" + id + ", language=" + language
+ ", ratings=" + ratings + ", change=" + change
+ ", getClass()=" + getClass() + ", hashCode()=" + hashCode()
+ ", toString()=" + super.toString() + "]";
}
}

该类有languageratings,change分别表示编程语言所占比重较前期的变化。我们提供两个构造方式,默认无参数的构造方式是JPA规范所规定,一般我们不会去直接调用它,另外一个是平常用来构造Program_lang类的实例对象。

构建简单的查询

Spring Data JPA专注于运用JPA将数据存储到关系型数据库。它最吸引开发者的地方在于它在运行时自动实现查询库具体查询方法的功能。

1
2
3
4
5
6
7
8
9
import java.util.List;
import org.springframework.data.repository.CrudRepository;
import com.accenture.spring_data_jpa_demo.domain.Program_lang;
public interface Program_langRepository extends CrudRepository<Program_lang, Long> {
List<Program_lang> findByChange(double change);
}

是不是很神奇呢?我们的Program_langRepository继承了CrudRepository这个接口。实体类和ID的类型,即Program_langLong,是在CrudRepository上的泛类型参数。就这样我们的Program_langRepository就拥有了将Program_lang持久化的基本能力(查找,保存,删除Program_lang)。

Spring Data JPA也允许开发者定义简单的查询方法,诸如findBy***。在我们的小项目里面,我们就定义了一个findbyLanguage

在普通的Java程序里面,我们会再写另外一个更详细的方法去实现``。但是我们用了Spring Data JPA之后就不用那么麻烦啦。Spring Data JPA会在我们允许程序的时候帮我们进行具体的实现。

构建主程序

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
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import com.accenture.spring_data_jpa_demo.domain.Program_lang;
import com.accenture.spring_data_jpa_demo.repository.Program_langRepository;
@SpringBootApplication
public class App
{
private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
@Bean
public CommandLineRunner demo(Program_langRepository repository){
return (args) -> {
repository.save(new Program_lang("Java", 18.799, -0.74));
repository.save(new Program_lang("C", 9.835, -6.35));
repository.save(new Program_lang("C++", 5.797, +0.05));
repository.save(new Program_lang("C#", 4.367, -0.46));
repository.save(new Program_lang("Python",3.775, -0.74));
LOGGER.info("programing language found with findAll");
LOGGER.info("--------------------------------------");
for (Program_lang program_lang : repository.findAll()) {
LOGGER.info(program_lang.toString());
}
LOGGER.info("======================================");
LOGGER.info("programing language found with findOne");
LOGGER.info("--------------------------------------");
LOGGER.info(repository.findOne(1L).toString());
LOGGER.info("======================================");
LOGGER.info("programing language found with findByChange");
LOGGER.info("--------------------------------------");
LOGGER.info(repository.findByChange(-0.74).toString());
LOGGER.info("======================================");
};
}
}
文章目录
  1. 1. 目标
  2. 2. 准备
    1. 2.1. 定义Program_lang.java实体类。
    2. 2.2. 构建简单的查询
    3. 2.3. 构建主程序
,