1.使用Spring Initializr创建项目。
360截图16581124656099.png

选择需要模块:
360截图163509129313583.png

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 nameList)
Notln:findByNameNotIn(Collection nameList)

如下列类自定义的方法声明,它们都是符合JPA规则的,这些方法
也不用实现.JPA将会代理实现这些方法
User findByNameLike(String name)
User readByName(String name)
List getByCreateDateLessThan(Date star)

Last modification:September 27th, 2018 at 09:32 am
如果觉得我的文章对你有用,请随意赞赏