问题:
现在需要实现一个搜索框对三个字段进行模糊查询,例如一个数据库有个user表内有String类型的name,int类型的age,int类型的height等字段,搜索框的请求字段为searchText,根据searchText来实现对name、age和height的模糊查询。
解决方案:
第一种:
1)我们可以在内新增一个Criteria:
public Criteria andSearchTextLike(String value) {
addCriterion("CONCAT(name,age,height) LIKE", value, "searchText");
return (Criteria) this;
}
2)然后直接使用此Criteria:
//从请求中获得字段内容
String searchText = req.getSearchText();
UserExample userExample = new UserExample();
UserExample.Criteria criteria = userExample.createCriteria();
if (StringUtils.isNotBlank(searchText)) {
criteria.andSearchTextLike(searchText);
}
List<User> list = UserMapper.selectByExample(userExample);
这种方法可以成功实现需求,但是存在一个问题,就是当我们对数据表的字段进行修改,即增删改,需要重新利用Generator自动生成时,会覆盖之前的内容。这就会导致我们在内的修改会被覆盖,如果还需要使用就又得写一遍,不利于维护。故第一种方法不建议使用。
第二种:
PS:对于来说,我们通常都会写一个UserExtendMapper接口来继承自动生成的UserMapper,这样当我们有额外的需求就可以写在UserExtendMapper中。同时我们在开发中调用Mapper时尽量调用xxxExtendMapper。
1)此时我们可以在UserExtendMapper接口里写一个方法:
public interface UserExtendMapper extends UserMapper {
List<User> seatchByText(@Param("id") Long id, @Param("searchText") String searchText);
}
PS:对于来说,我们通常都会写一个来增加我们额外的需求,此时只需要保持和的映射空间保持一致,都映射即可。即在各自xml中的namespace都如下写:
<mapper namespace="">
2)然后在写查询语句:
<select id="searchByText" parameterType="map" resultMap="BaseResultMap">
select
*
from user
where id =#{id,jdbcType=BIGINT}
<if test="searchText!=null and searchText!=''">
and ( name like concat('%',#{searchText},'%') or age like concat('%',#{searchText},'%') or height like concat('%',#{searchText},'%'))
</if>
</select>
此时直接调用seatchByText()方法即可:
String searchText = req.getSearchText();
List<User> list = userExtendMapper.searchByText(req.getId(),searchText);
建议使用第二种。