1.创建maven项目,编写pom.xml文件
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<groupId>per.czt</groupId>
<artifactId>22-spring-boot-jpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>22-spring-boot-jpa</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- Spring Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- junit环境的jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- mysql数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!-- druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
<!-- jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.4</version>
</dependency>
<!-- jaxb-core -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<!-- jaxb-impl -->
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.1</version>
</dependency>
<!-- javax.activation-api -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
</project>
2.编写application.properties文件
application.properties
spring.datasource.driverName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springbootjpa?serverTimezone=UTC&charset=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=200934652qwe
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
3.测试
(1)五个接口
前四个接口就不测试了,这里只给出JpaRepository和JpaSepcificationExecutor接口的测试
编写个接口继承JpaRepository和JpaSepcificationExecutor接口
UserRepositorySpecificationExecutor.java
package per.czt.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import per.czt.pojo.Users;
public interface UsersRepositoryJpaSpecificationExecutor extends JpaRepository<Users, Integer>,JpaSpecificationExecutor<Users>{
}
测试类
UsersRepositoryJpaSpecificationExecutorTest.java
package per.czt.test;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import per.czt.dao.UsersRepositoryJpaSpecificationExecutor;
import per.czt.pojo.Users;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UsersRepositoryJpaSpecificationExecutorTest {
@Autowired
private UsersRepositoryJpaSpecificationExecutor usersRepositoryJpaSpecificationExecutor;
/*
*多条件查询+分页+排序
*/
@Test
public void test1() {
Specification<Users> spec=new Specification<Users>() {
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
// TODO Auto-generated method stub
return cb.and(cb.notEqual(root.get("username"), "xiaoming"),cb.isNotNull(root.get("username")));
}
};
Order order1=new Order(Direction.ASC,"username");
Order order2=new Order(Direction.ASC,"userage");
Sort sort =new Sort(order1,order2);
int page=0;
int pageSize=1;
Pageable pageable=new PageRequest(page, pageSize, sort);
Page<Users> pages=usersRepositoryJpaSpecificationExecutor.findAll(spec, pageable);
for(Users users:pages.getContent()) {
System.out.println(users);
}
}
}
(2)一对多关系
Users.java
package per.czt.pojo;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_users")
public class Users {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="user_id")
private Integer userid;
@Column(name="user_name")
private String username;
@Column(name="user_age")
private Integer userage;
@Column(name="user_address")
private String useraddress;
@ManyToOne(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
@JoinColumn(name="roles_id")
private Roles roles;
public Roles getRoles() {
return roles;
}
public void setRoles(Roles roles) {
this.roles = roles;
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getUserage() {
return userage;
}
public void setUserage(Integer userage) {
this.userage = userage;
}
public String getUseraddress() {
return useraddress;
}
public void setUseraddress(String useraddress) {
this.useraddress = useraddress;
}
public Users() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Users [userid=" + userid + ", username=" + username + ", userage=" + userage + ", useraddress="
+ useraddress + ", roles=" + roles + "]";
}
}
Roles.java
package per.czt.pojo;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_roles")
public class Roles implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="role_id")
private Integer roleid;
@Column(name="role_name")
private String rolename;
@OneToMany(mappedBy="roles",cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
private Set<Users> usersSet=new HashSet<Users>();
public Set<Users> getUsersSet() {
return usersSet;
}
public void setUsersSet(Set<Users> usersSet) {
this.usersSet = usersSet;
}
public Integer getRoleid() {
return roleid;
}
public void setRoleid(Integer roleid) {
this.roleid = roleid;
}
public String getRolename() {
return rolename;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
@Override
public String toString() {
return "Roles [roleid=" + roleid + ", rolename=" + rolename + "]";
}
public Roles() {
super();
// TODO Auto-generated constructor stub
}
}
测试代码:
OneToManyTest.java
package per.czt.test;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import per.czt.App;
import per.czt.dao.UsersRepositoryJpaRepository;
import per.czt.pojo.Roles;
import per.czt.pojo.Users;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes= {App.class})
public class OneToManyTest {
@Autowired
private UsersRepositoryJpaRepository usersRepositoryJpaRepository;
/*
* 添加
*/
@Test
public void test1() {
Roles roles=new Roles();
roles.setRolename("管理员");
Users users=new Users();
users.setUseraddress("山东省");
users.setUserage(11);
users.setUsername("李四");
users.setRoles(roles);
roles.getUsersSet().add(users);
usersRepositoryJpaRepository.save(users);
}
/*
* 查询
*/
@Test
public void test2() {
List<Users> usersList=usersRepositoryJpaRepository.findAll();
for(Users users:usersList) {
System.out.println(users);
}
}
}
(3)多对多关系
假设roles和menus是多对多关系
Roles.java
package per.czt.pojo;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_roles")
public class Roles implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="role_id")
private Integer roleid;
@Column(name="role_name")
private String rolename;
@OneToMany(mappedBy="roles",cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
private Set<Users> usersSet=new HashSet<Users>();
@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
@JoinTable(name="t_roles_menus",joinColumns=@JoinColumn(name="roles_id"),inverseJoinColumns=@JoinColumn(name="menus_id"))
private Set<Menus> menusSet=new HashSet<Menus>();
public Set<Users> getUsersSet() {
return usersSet;
}
public void setUsersSet(Set<Users> usersSet) {
this.usersSet = usersSet;
}
public Integer getRoleid() {
return roleid;
}
public void setRoleid(Integer roleid) {
this.roleid = roleid;
}
public String getRolename() {
return rolename;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
@Override
public String toString() {
return "Roles [roleid=" + roleid + ", rolename=" + rolename + "]";
}
public Roles() {
super();
// TODO Auto-generated constructor stub
}
public Set<Menus> getMenusSet() {
return menusSet;
}
public void setMenusSet(Set<Menus> menusSet) {
this.menusSet = menusSet;
}
}
Menus.java
package per.czt.pojo;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_menus")
public class Menus {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="menu_id")
private Integer menuid;
@Column(name="menu_name")
private String menuname;
@Column(name="menu_url")
private String menuurl;
@Column(name="father_id")
private Integer fatherid;
@ManyToMany(mappedBy="menusSet",cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
private Set<Roles> rolesSet=new HashSet<Roles>();
public Integer getMenuid() {
return menuid;
}
public void setMenuid(Integer menuid) {
this.menuid = menuid;
}
public String getMenuname() {
return menuname;
}
public void setMenuname(String menuname) {
this.menuname = menuname;
}
public String getMenuurl() {
return menuurl;
}
public void setMenuurl(String menuurl) {
this.menuurl = menuurl;
}
public Integer getFatherid() {
return fatherid;
}
public void setFatherid(Integer fatherid) {
this.fatherid = fatherid;
}
public Set<Roles> getRolesSet() {
return rolesSet;
}
public void setRolesSet(Set<Roles> rolesSet) {
this.rolesSet = rolesSet;
}
@Override
public String toString() {
return "Menus [menuid=" + menuid + ", menuname=" + menuname + ", menuurl=" + menuurl + ", fatherid=" + fatherid
+ "]";
}
}
RolesRepository.java
package per.czt.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import per.czt.pojo.Roles;
public interface RolesRepository extends JpaRepository<Roles, Integer>{
}
多对多测试
ManyToManyTest,java
package per.czt.test;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import per.czt.App;
import per.czt.dao.RolesRepository;
import per.czt.dao.UsersRepositoryJpaRepository;
import per.czt.pojo.Menus;
import per.czt.pojo.Roles;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes= {App.class})
public class ManyToManyTest {
@Autowired
private RolesRepository rolesRepository;
/*
* 添加
*/
/*@Test
public void test1() {
Roles roles=new Roles();
roles.setRolename("管理员");
Menus menus=new Menus();
menus.setFatherid(1);
menus.setMenuname("xx管理");
menus.setMenuurl(null);
Menus menus1=new Menus();
menus1.setFatherid(2);
menus1.setMenuname("aa管理");
menus1.setMenuurl(null);
menus.getRolesSet().add(roles);
menus1.getRolesSet().add(roles);
roles.getMenusSet().add(menus1);
roles.getMenusSet().add(menus);
rolesRepository.save(roles);
}*/
/*
* 查询
*/
@Test
public void test2() {
List<Roles> rolesList=rolesRepository.findAll();
for(Roles roles:rolesList) {
System.out.println(roles);
System.out.println(roles.getMenusSet());
}
}
}