我来为你详细讲解“SpringDataJpa多表操作的实现”的完整攻略。下面是完整步骤:
环境要求
在开始之前,请确保已经安装了如下环境:
- JDK8+
- Maven
- SpringBoot 2.x
- SpringData JPA
配置数据源
首先需要配置数据源,这里以MySQL为例。在application.properties
中添加如下配置:
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
定义实体类
在进行多表操作时,需要定义多个实体类,每个实体类对应一个表。
比如我们有两张表:user
表和role
表。对应的实体类分别为User
和Role
。
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
// 省略get/set方法
}
@Entity
@Table(name = "role")
public class Role {
@Id
@GeneratedValue
private Long id;
private String roleName;
// 省略get/set方法
}
定义关联关系
在进行多表操作时,需要定义实体类之间的关联关系。比如User
表和Role
表之间是一对多的关系。
在User
类中定义一对多关系:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private List<Role> roles;
// 省略get/set方法
}
在Role
类中定义多对一关系:
@Entity
@Table(name = "role")
public class Role {
@Id
@GeneratedValue
private Long id;
private String roleName;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private User user;
// 省略get/set方法
}
定义Repository
定义UserRepository
和RoleRepository
的方法以实现多表操作,比如:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
@Repository
public interface RoleRepository extends JpaRepository<Role, Long> {
List<Role> findByUser_Id(Long userId);
}
定义业务逻辑
最后,定义业务逻辑。比如我们要查询username
为admin
的用户所拥有的所有角色,代码如下:
@Service
public class UserService {
@Autowired
UserRepository userRepository;
@Autowired
RoleRepository roleRepository;
public List<Role> getRolesByUsername(String username) {
User user = userRepository.findByUsername(username);
return roleRepository.findByUser_Id(user.getId());
}
}
示例
假设现在有两张表,分别为user
和role
,表结构如下:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `role` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`role_name` varchar(50) DEFAULT NULL,
`user_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK_USER_id` (`user_id`),
CONSTRAINT `FK_USER_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
首先定义实体类:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private List<Role> roles;
// 省略get/set方法
}
@Entity
@Table(name = "role")
public class Role {
@Id
@GeneratedValue
private Long id;
@Column(name = "role_name")
private String roleName;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private User user;
// 省略get/set方法
}
然后定义Repository
:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
@Repository
public interface RoleRepository extends JpaRepository<Role, Long> {
List<Role> findByUser_Id(Long userId);
}
最后定义业务逻辑:
@Service
public class UserService {
@Autowired
UserRepository userRepository;
@Autowired
RoleRepository roleRepository;
public List<Role> getRolesByUsername(String username) {
User user = userRepository.findByUsername(username);
return roleRepository.findByUser_Id(user.getId());
}
}
接下来我们来执行示例代码:
@Service
public class UserServiceTest {
@Autowired
UserService userService;
@Test
public void testGetRolesByUsername() {
List<Role> roles = userService.getRolesByUsername("admin");
System.out.println(roles);
}
}
最后运行示例代码,即可在控制台上看到输出结果。
另外,如果想要插入数据,只需要在UserService
中定义保存方法即可:
@Service
public class UserService {
@Autowired
UserRepository userRepository;
@Autowired
RoleRepository roleRepository;
public void save(User user) {
userRepository.save(user);
}
public void save(Role role) {
roleRepository.save(role);
}
}
这样,就可以通过UserService
来完成多表操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringDataJpa多表操作的实现 - Python技术站