使用springboot实现搜索

645 阅读2分钟

构造一个简单的搜索需求:

假如现在给你一个需求: 有一个MySQL表articles,包含title和text等多个属性,要使用springboot实现一个搜索功能的接口,

post访问/search接口传入一个json格式的数据data,搜索数据库中的相匹配的数据并返回,

匹配规则:传入的data只要在title中出现过即为匹配(用户搜索"一千",只要title中有出现"一千"的字符串即为相匹配)

返回搜索到的数据,并使用这个类封装:

public MessageResponse(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    //成功相应
    public static <T> MessageResponse<T> success(T data) {
        return new MessageResponse<>(200, "ok", data);
    }
    //失败相应
    public static <T> MessageResponse<T> error(int code, String msg) {
        return new MessageResponse<T>(code, msg, null);
    }
    ///....
  }
  

逻辑实现:

findByTitleContaining方法来实现:

articleRepository.findByTitleContaining(keyword)调用了Spring Data JPA提供的findByTitleContaining方法。这个方法会在数据库中执行类似于"SELECT * FROM articles WHERE title LIKE '%keyword%'"的查询,即查找所有title包含关键字keyword的文章数据,并将结果以List

的形式返回。

因此,当你调用searchArticles方法并传入一个关键字,它将搜索数据库中所有符合匹配规则的文章标题,并将结果作为List

返回。这样,你就可以在Controller中将搜索结果封装到MessageResponse类中,并返回给客户端。

示例:

定义数据模型:

创建一个Java类来表示数据库表articles的数据模型。在这个类中,你需要定义title和text等属性,并提供相应的getter和setter方法。


@Entity
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    private String text;

    // Getters and Setters
}

创建Repository接口: 创建一个继承自JpaRepository的Repository接口,以便于对数据库表articles进行操作。


@Repository
public interface ArticleRepository extends JpaRepository<Article, Long> {
    List<Article> findByTitleContaining(String keyword);
}

创建搜索服务类: 创建一个搜索服务类,用于处理搜索逻辑。在这个类中,注入ArticleRepository,然后实现根据title搜索文章的方法。


@Service
public class SearchService {
    private final ArticleRepository articleRepository;

    @Autowired
    public SearchService(ArticleRepository articleRepository) {
        this.articleRepository = articleRepository;
    }

    public List<Article> searchArticles(String keyword) {
        return articleRepository.findByTitleContaining(keyword);
    }
}

创建Controller类: 创建一个Controller类来处理搜索请求,并返回搜索结果。


@RestController
public class SearchController {
    private final SearchService searchService;

    @Autowired
    public SearchController(SearchService searchService) {
        this.searchService = searchService;
    }

    @PostMapping("/search")
    public MessageResponse<List<Article>> searchArticles(@RequestBody SearchRequest request) {
        List<Article> searchResults = searchService.searchArticles(request.getKeyword());
        if (searchResults.isEmpty()) {
            return MessageResponse.error(404, "No articles found.");
        }
        return MessageResponse.success(searchResults);
    }
}

创建SearchRequest类: 创建一个Java类来表示搜索请求的数据模型。


public class SearchRequest {
    private String keyword;

    // Getter and Setter
}

创建MessageResponse类: 按照你提供的类封装,创建MessageResponse类。


public class MessageResponse<T> {
    private int code;
    private String msg;
    private T data;

    public MessageResponse(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    // Getter and Setter

    // 成功响应
    public static <T> MessageResponse<T> success(T data) {
        return new MessageResponse<>(200, "ok", data);
    }

    // 失败响应
    public static <T> MessageResponse<T> error(int code, String msg) {
        return new MessageResponse<>(code, msg, null);
    }
}

现在,已经完成了搜索功能的实现。向/search接口发送POST请求,并传入一个包含关键字的JSON数据,它将在数据库中搜索匹配的文章标题,并返回结果。

本文由mdnice多平台发布