1.使用Spring Initializr创建项目。
选择需要模块:
2.首先创建一些普通对象,用来与数据库的表建立映射关系.然后使用JPA
对数据库进行增删查改等存取操作。假如现在有三个实体:部门、用户和角色,并且它们具有一定的关系,即一个用户
只能隶属于一个部门.一个用户Hf以拥有多个角色。
import javax.persistence.*;
@Entity
@Table(name = "department")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
其中注解@Table指定关联的数据库的表
名,注解@Id定义一条记录的唯一标识,并结合注解@GeneratedValue将其设置为自动
生成。部门实体只有两个字段:id和name。Getter和Setter方法的定义,
使用了IDEA的自动生成工具。
import com.fasterxml.jackson.annotation.JsonBackReference;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createDate;
@ManyToOne
@JoinColumn(name = "department_id")
@JsonBackReference
private Department department;
@ManyToMany
@JoinTable(name = "user_role",joinColumns = {@JoinColumn(name="user_id")},inverseJoinColumns = {@JoinColumn(name = "role_id")})
private List<Role> roles;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
}
用户实体包含三个字段:id、name和createdate,其中注解@ManyToOne定义它与部门的多对一关系,并且在数据库表中用字段department_id
来表示部门的lD,注解@ManyToMany定义与角色实体的多对多关系,并且用中问表
user role来存储它们各自的ID,以表示它们的对应关系。日期类型的数据必须使用注
解@DateTimeFormat来进行格式化,以保证它在存取时能提供正确的格式,避免保存
失败。注解@JsonBackReference用来防止关系对象的递归访问。
import javax.persistence.*;
@Entity
@Table(name = "roles")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
通过上面实体的定义,实现了使用Java的普通对象(POJO)与数据库表建立
映射关系(ORM),接下来使用JPA来实现持久化,
import com.pingchas.demo.vo.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserDao extends JpaRepository<User,Integer> {
}
它是一个接口,并继承
丁JPA资源库JpaRepository接口,使用注解@Repository将这个接口也定义为一个资
源库,使它能被其他程序引用,并为其他程序提供存取数据库的功能。
使用相同的方法,可以定义部门实体和角色实体的资源库接口。接口同样继承于
JpaRepository接口.只要注意使用的参数是各自的实体对象即可.
继承关系如下:
Repository
CrudRepository
PagingAndSortingRepository
JpaRepository
使用JPA就是可以这么简单,
JpaRepository继承于PagingAndSortingRepository,它提供厂
分页和排序功能,PagingAndsoningRepository继承于Crud
Repository,它提供了简单的增删查改功能。
JPA还提供了一些白定义声明方法的规则,例如,在接口中使用关键字findBy、
readBy、getBy作为方法名的前缀,拼接实体类中的属性字段(首个字母大写),并可选
择拼接一些SQL查询关键字来组合成一个查询方法.
关键字可以这样使用:
And:findByIdAndName(Long id,String name)
or:findByldOrName(Long id,String name)
Between:findByCreateDateBetween(Date start,Date end)
LessThan:findByCreateDateLessThan(Date start)
GreaterThan:findByCreateDateGreaterThan(Date start)
IsNull:findByNamelsNuIl()
IsNotNull:findByNameIsNotNull()
NotNull:与IsNotNull等价
Like:findByNameLike(String name)
NotLike:findByNameNotLike(String name)
OrderBy:findByNameOrderByIdAsc(String name)
Not:findByNameNot(String name)
In:findByNameln(Collection
Notln:findByNameNotIn(Collection
如下列类自定义的方法声明,它们都是符合JPA规则的,这些方法
也不用实现.JPA将会代理实现这些方法
User findByNameLike(String name)
User readByName(String name)
List