springboot连表查询数据库实现

141 阅读1分钟

[toc]

数据库连表

通过两张表相互关联,(某个相同的字段)实现两个数据库相互联系,通过连表查询语句可以同时访问两个表的数据.

需求示例

两张表;user表(有name,Email等属性),VerificationCode表(有Email,Verification等属性,)

现在想要实现两个接口功能,

1:通过Email同时查询name与Verification的值并返回;

2:通过name同时查询Email与Verification的值并返回

1通过Email同时查询name与Verification的值并返回

在UserRepository中,我们使用@Query注解来定义自定义查询语句,实现了通过Email同时查询name与Verification的功能:


@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    
    @Query("SELECT u.name, v.verification FROM User u JOIN VerificationCode v ON u.email = v.email WHERE u.email = :email")
    List<Object[]> findUserInfoByEmail(@Param("email") String email);
    
    User findByEmail(String email);
}

实现接口功能:

@RestController
public class UserController {
    
    private final UserRepository userRepository;
    
    @Autowired
    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    @GetMapping("/user-info-by-email")
    public ResponseEntity<Map<String, String>> getUserInfoByEmail(@RequestParam String email) {
        List<Object[]> result = userRepository.findUserInfoByEmail(email);
        
        if (!result.isEmpty()) {
            Object[] data = result.get(0);
            Map<String, String> resultMap = new HashMap<>();
            resultMap.put("name", (String) data[0]);
            resultMap.put("verification", (String) data[1]);
            return ResponseEntity.ok(resultMap);
        } else {
            return ResponseEntity.notFound().build();
        }
    }
}
2 通过name同时查询Email与Verification的值并返回

在VerificationCodeRepository中,我们同样使用@Query注解定义自定义查询语句,实现了通过name同时查询Email与Verification的功能:


@Repository
public interface VerificationCodeRepository extends JpaRepository<VerificationCode, Long> {
    
    @Query("SELECT u.email, v.verification FROM User u JOIN VerificationCode v ON u.email = v.email WHERE u.name = :name")
    List<Object[]> findVerificationInfoByName(@Param("name") String name);
    
    VerificationCode findByEmail(String email);
}

功能实现:

@RestController
public class VerificationCodeController {
    
    private final VerificationCodeRepository verificationCodeRepository;
    
    @Autowired
    public VerificationCodeController(VerificationCodeRepository verificationCodeRepository) {
        this.verificationCodeRepository = verificationCodeRepository;
    }
    
    @GetMapping("/verification-info-by-name")
    public ResponseEntity<Map<String, String>> getVerificationInfoByName(@RequestParam String name) {
        List<Object[]> result = verificationCodeRepository.findVerificationInfoByName(name);
        
        if (!result.isEmpty()) {
            Object[] data = result.get(0);
            Map<String, String> resultMap = new HashMap<>();
            resultMap.put("email", (String) data[0]);
            resultMap.put("verification", (String) data[1]);
            return ResponseEntity.ok(resultMap);
        } else {
            return ResponseEntity.notFound().build();
        }
    }
}

简单的讲解了连表查询,主要是查询语句的定义与数据返回的设置

本文由mdnice多平台发布