这篇要从HelloWorld进一步,实现从数据库中取数据,然后显示在web页面上的功能,数据库采用H2,这是一种嵌入式的数据库,无需安装独立的客户端或者服务器端。
Hibernate是一种使用对象关系映射(Object-Relational Mapping)实现数据访问和操作的技术,它将模型层的类与数据库的表进行映射,这样在程序操纵对象同时也可以实现对底层数据库的操作,而不需要再去编写底层数据库代码。JPA即Java Persistence API就是由Hibernate主导的,基于对象关系映射的标准规则,Spring Data JPA是Spring Data的一个子项目,提供了基于JPA的Repository来减少JPA作为数据访问方案的代码量。
首先建立H2数据库,之前我们在下载项目的时候已经选择了有h2的依赖,接下来在application.property文件中写入一些数据库的配置。
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.datasource.platform=h2
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql
logging.level.root=INFO
logging.level.org.hibernate=INFO
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.org.hibernate.type.descriptor.sql.BasicExtractor=TRACE
Spring Boot配置文件的可选项多达几百个,建议用到的时候再去查找。上面的schema和data分别是存放在source目录下的数据库初始化和插入数据的文件,里面的内容如下。
drop table user if exists;
create table user (id bigint generated by default as identity, username varchar(40), name varchar(20), age int(3), balance decimal(10,2), primary key (id));
上面是schema.sql的内容,下面是data.sql文件的内容。
insert into user (id, username, name, age, balance) values (1, 'account1', '张三', 20, 100.00);
insert into user (id, username, name, age, balance) values (2, 'account2', '李四', 28, 180.00);
insert into user (id, username, name, age, balance) values (3, 'account3', '王五', 32, 280.00);
接下来建立user对应的实体类,在com.movie.example_1下建立entity包用来存放对应数据库的实体类,建立User类,内容如下。
package com.movie.example_1.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.annotations.GeneratorType;
import java.math.BigDecimal;
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@Column
private String username;
@Column
private String name;
@Column
private Integer age;
@Column
private BigDecimal balance;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return username;
}
public void setUsername(String userName) {
this.username = userName;
}
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 BigDecimal getBalance() {
return balance;
}
public void setBalance(BigDecimal balance) {
this.balance = balance;
}
}
上面的声明@Entity表明这是一个实体类,@Id说明下面这个属性是主键,@GeneratedValue说明主键的生成规则为默认(AUTO),通过@Entity声明我们可以通过操作该对象类来直接改变底层数据库。
接下来需要建立数据访问层,使用Spring Data JPA建立数据访问层只需要定义一个继承JpaRepository的接口即可。在com.movie.example_1下建立repository包,然后建立UserRepository接口,代码如下。
package com.movie.example_1.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.movie.example_1.entity.User;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
继承JpaRepository接口意味着我们默认已经有了增删改查一系列基本操作,如果要进行比较复杂的数据库操作还需要实现自己的方法,不过对这个简单的程序来说里面不需要写任何代码。
然后需要建立控制层,在com.movie.example_1.controller下建立UserController类,代码如下。
package com.movie.example_1.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.movie.example_1.repository.*;
import com.movie.example_1.entity.*;
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/{id}")
public User findById(@PathVariable Long id) {
User findOne = this.userRepository.findOne(id);
return findOne;
}
}
基本过程和上一篇的HelloWorld类似,不过这次使用到了Bean,所以用@Autowired进行了注入,在一个方法或变量上加上这个注解,等于告诉Spring接下来有一个Bean需要被注入。@GetMapping等价于@RequestMapping(method=RequestMethod.GET).
@PathVariable注解表明需要从URI中取出一个变量,也就是id
接下来运行项目,除了Hello之外就有另外一个页面了,输入http://localhost:8080/1会看到如下图结果,后面这个1就是id,也可以换成2和3