一.自定义 Repository 接口
1.1创建接口
package cn.grace.dao;
import cn.grace.pojo.Users;
public interface UsersRepository {
public Users findUserById(Integer userid);
}
1.2 使用接口
package cn.grace.dao;
import cn.grace.pojo.Users;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
*用户自定义Repository接口讲解
*/
public interface UserDao extends JpaRepository<Users,Integer>,JpaSpecificationExecutor<Users>,UsersRepository {
}
1.3 创建接口实现类
package cn.grace.dao;
import cn.grace.pojo.Users;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
public class UserDaoImpl implements UsersRepository {
@PersistenceContext(name="entityManagerFactory")
private EntityManager em;
@Override
public Users findUserById(Integer userid) {
System.out.println("myrespository");
return em.find(Users.class,userid);
}
}
1.4 编写测试代码
/**
* JpaRepository接口测试
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class RepositoryTest {
@Autowired
private UserDao userDao;
@Test
public void test1(){
Users users = userDao.findUserById(5);
System.out.println(users);
}
}
二.关联映射操作
2.1 一对一的关联关系
需求:用户与角色的一对一的关联关系 用户:一方 角色:一方
2.1.1 创建 Users 实体
@Entity
@Table(name = "t_users")
public class Users implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)//自增长
@Column(name = "userid")
private Integer userid;
@Column(name = "username")
private String username;
@Column(name = "userage")
private Integer userage;
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "roles_id")
//@JoinColumn:就是维护一个外键
private 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 Roles getRoles() {
return roles;
}
public void setRoles(Roles roles) {
this.roles = roles;
}
@Override
public String toString() {
return "Users{" +
"userid=" + userid +
", username='" + username + '\'' +
", userage=" + userage +
'}';
}
}
2.1.2 创建 Roles 实体
@Entity
@Table(name="t_roles")
public class Roles {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="roleid")
private Integer roleid;
@Column(name="rolename")
private String rolename;
@OneToOne(mappedBy = "roles")
private Users users;
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;
}
public Users getUsers() {
return users;
}
public void setUsers(Users users) {
this.users = users;
}
@Override
public String toString() {
return "Roles{" +
"roleid=" + roleid +
", rolename='" + rolename + '\'' +
'}';
}
}
2.1.3 一对一关联关系操作
/**
* 一对一关联关系测试
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class OneToOneTest {
@Autowired
private UserDao userDao;
/**
* 添加用户同时添加角色
*/
@Test
public void test1(){
//创建角色
Roles roles = new Roles();
roles.setRolename("管理员");
//创建用户
Users users = new Users();
users.setUserage(30);
users.setUsername("赵小刚");
//建立关系
users.setRoles(roles);
roles.setUsers(users);
//保存数据
userDao.save(users);
}
/**
* 根据用户 ID 查询用户,同时查询用户角色
*/
@Test
public void test2(){
Users users = userDao.findOne(8);
System.out.println("用户信息:"+users);
Roles roles = users.getRoles();
System.out.println(roles);
}
}
2.2 一对多的关联关系
需求:从角色到用户的一对多的关联关系 角色:一方 用户:多方
2.2.1 创建Users实体
@Entity
@Table(name = "t_users")
public class Users implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)//自增长
@Column(name = "userid")
private Integer userid;
@Column(name = "username")
private String username;
@Column(name = "userage")
private Integer userage;
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "roles_id")
private 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 Roles getRoles() {
return roles;
}
public void setRoles(Roles roles) {
this.roles = roles;
}
@Override
public String toString() {
return "Users{" +
"userid=" + userid +
", username='" + username + '\'' +
", userage=" + userage +
'}';
}
}
2.2.2 创建 Roles 实体
@Entity
@Table(name="t_roles")
public class Roles {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="roleid")
private Integer roleid;
@Column(name="rolename")
private String rolename;
@OneToMany(mappedBy = "roles")
private Set<Users> users=new HashSet<>();
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;
}
public Set<Users> getUsers() {
return users;
}
public void setUsers(Set<Users> users) {
this.users = users;
}
@Override
public String toString() {
return "Roles{" +
"roleid=" + roleid +
", rolename='" + rolename + '\'' +
'}';
}
}
2.2.3 一对多的关联关系操作
**
* 一对多的关联关系测试
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class OneToManyTest {
@Autowired
private UserDao usersDao;
/**
* 添加用户同时添加角色
*/
@Test
public void test1(){
//创建角色
Roles roles = new Roles();
roles.setRolename("管理员");
//创建用户
Users users =new Users();
users.setUserage(30);
users.setUsername("小王");
//建立关系
roles.getUsers().add(users);
users.setRoles(roles);
//保存数据
usersDao.save(users);
}
/**
* 根据用户 ID 查询用户信息,同时查询角色
*/
@Test
public void test2(){
Users users =usersDao.findOne(12);
System.out.println("用户姓名:"+users.getUsername());
Roles roles = users.getRoles();
System.out.println(roles);
}
}
2.3 多对多的关联关系
需求:一个角色可以拥有多个菜单,一个菜单可以分配多个角色。多对多的关联关系 角色:多方 菜单:多方
2.3.1 创建 Roles 实体
@Entity
@Table(name="t_roles")
public class Roles {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="roleid")
private Integer roleid;
@Column(name="rolename")
private String rolename;
@ManyToMany(cascade = CascadeType.PERSIST,fetch = FetchType.EAGER)
//@JoinTable:配置中间表信息
//joinColumns:建立当前表在中间表中的外键字段
@JoinTable(name = "t_roles_menus",joinColumns = @JoinColumn(name = "role_id"),inverseJoinColumns = @JoinColumn(name = "menu_id"))
private Set<Menus> menus=new HashSet<>();
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;
}
public Set<Menus> getMenus() {
return menus;
}
public void setMenus(Set<Menus> menus) {
this.menus = menus;
}
@Override
public String toString() {
return "Roles{" +
"roleid=" + roleid +
", rolename='" + rolename + '\'' +
'}';
}
}
2.3.2 创建 Menus 实体
@Entity
@Table(name="t_menus")
public class Menus {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="menusid")
private Integer menusid;
@Column(name="menusname")
private String menusname;
@Column(name="menusurl")
private String menusurl;
@Column(name="fatherid")
private Integer fatherid;
@ManyToMany(mappedBy = "menus")
private Set<Roles> roles=new HashSet<>();
public Integer getMenusid() {
return menusid;
}
public void setMenusid(Integer menusid) {
this.menusid = menusid;
}
public String getMenusname() {
return menusname;
}
public void setMenusname(String menusname) {
this.menusname = menusname;
}
public String getMenusurl() {
return menusurl;
}
public void setMenusurl(String menusurl) {
this.menusurl = menusurl;
}
public Integer getFatherid() {
return fatherid;
}
public void setFatherid(Integer fatherid) {
this.fatherid = fatherid;
}
public Set<Roles> getRoles() {
return roles;
}
public void setRoles(Set<Roles> roles) {
this.roles = roles;
}
@Override
public String toString() {
return "Menus{" +
"menusid=" + menusid +
", menusname='" + menusname + '\'' +
", menusurl='" + menusurl + '\'' +
", fatherid=" + fatherid +
'}';
}
}
2.3.3 多对多关联关系操作
/**
* 多对多关联关系测试
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class ManyToManyTest {
@Autowired
private RolesDao rolesDao;
/**
* 添加角色同时添加菜单
*/
@Test
public void test1(){
//创建角色对象
Roles roles = new Roles();
roles.setRolename("超级管理员");
//创建菜单对象 XXX 管理平台 --->用户管理
Menus menus = new Menus();
menus.setMenusname("XXX 管理平台");
menus.setFatherid(-1);
menus.setMenusurl(null);
//用户管理菜单
Menus menus1 = new Menus();
menus1.setMenusname("用户管理");
menus1.setFatherid(1);
menus1.setMenusurl(null);
//建立关系
roles.getMenus().add(menus);
roles.getMenus().add(menus1);
menus.getRoles().add(roles);
menus1.getRoles().add(roles);
//保存数据
this.rolesDao.save(roles);
}
/**
* 查询 Roles
*/
@Test
public void test2(){
Roles roles = this.rolesDao.findOne(3);
System.out.println("角色信息:"+roles);
Set<Menus> menus = roles.getMenus();
for (Menus menus2 : menus) {
System.out.println("菜单信息:"+menus2);
}
}
}