注册

Spring Boot(五)之跨域、自定义查询及分页

下面我将详细讲解“Spring Boot(五)之跨域、自定义查询及分页”完整攻略。

跨域

跨域是指浏览器的安全策略限制了网页从当前源访问另一个源的内容。在 Spring Boot 中,我们可以使用 CorsFilter 实现跨域请求。

首先需要在 pom.xml 中添加依赖:


    org.springframework.boot
    spring-boot-starter-web



    org.springframework.boot
    spring-boot-starter-security

然后在 Spring Boot 应用程序中创建一个 CorsFilter:

@Bean
public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

这样就完成了跨域请求配置。

自定义查询

在 Spring Boot 中,我们可以使用自定义查询来实现复杂的数据查询。自定义查询通常使用 Query DSL 实现。首先需要在 pom.xml 中添加 Query DSL 相关的依赖:


    com.querydsl
    querydsl-apt
    4.4.0
    provided



    com.querydsl
    querydsl-jpa
    4.4.0

然后在项目根目录下创建一个 QEntity 类:

@Generated("com.querydsl.codegen.EntitySerializer")
public class QUser extends EntityPathBase {

    private static final long serialVersionUID = 536966386L;

    public static final QUser user = new QUser("user");

    public final NumberPath id = createNumber("id", Long.class);

    public final StringPath name = createString("name");

    public final StringPath email = createString("email");

    public final DateTimePath createTime = createDateTime("createTime", java.util.Date.class);

    public QUser(String variable) {
        super(User.class, forVariable(variable));
    }

    public QUser(Path path) {
        super(path.getType(), path.getMetadata());
    }

    public QUser(PathMetadata metadata) {
        super(User.class, metadata);
    }

}

然后就可以在 Repository 接口中定义自定义查询方法了:

public interface UserRepository extends JpaRepository, QuerydslPredicateExecutor {

    User findByName(String name);

    @Query("select u from User u where u.email = ?1")
    User findByEmail(String email);

    List findAll(Predicate predicate);

}

最后,在 Service 中调用自定义查询方法:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public List getUsersByEmail(String email) {
        QUser qUser = QUser.user;
        BooleanBuilder builder = new BooleanBuilder();
        builder.and(qUser.email.eq(email));
        return userRepository.findAll(builder);
    }

}

分页查询

在 Spring Boot 中,我们可以使用分页功能对数据进行分页查询。首先需要在 pom.xml 中添加依赖:


    org.springframework.boot
    spring-boot-starter-data-jpa



     com.googlecode.concurrentlinkedhashmap
     concurrentlinkedhashmap-lru
     1.4.2

然后在 Controller 中定义分页查询方法:

@GetMapping("/users")
public Page getUsers(@RequestParam(value="page", defaultValue="0") Integer page,
        @RequestParam(value="size", defaultValue="10") Integer size) {
   Pageable pageable = PageRequest.of(page, size, Sort.by("id").descending());
   return userService.getUsers(pageable);
}

然后,在 Service 中执行分页查询:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public Page getUsers(Pageable pageable) {
        return userRepository.findAll(pageable);
    }

}

这样就完成了分页查询的功能。