构造一个简单的搜索需求:
假如现在给你一个需求: 有一个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多平台发布