欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MyBatis动态匹配搜索

程序员文章站 2024-03-05 16:44:19
...

问题描述:前端页面一个搜索框中用户,输入查询的数据。那么问题来了,比如,不确定用户输入的是姓名,手机号,工号,车牌号,车架号,二维码,地址等。那么在不确定用户到底输入值是什么的情况下,如何将查询结果返回到前端页面?
解决问题的方法:用Mybatis 的 动态Sql 拼接。
现在给出相关代码:
controller 层代码,注意这里传的是一个对象Car

@RequiresPermissions("admin:car:list")
    @RequestMapping(value="/car/list",method=RequestMethod.POST,produces="application/json;charset=UTF-8")
    @ResponseBody
    public PageDataResult loadData(Integer page, Integer rows,String key){
        Car car = new Car();

        if(StringUtils.isNotEmpty(key))
        {
            car.setUsername("%"+key+"%");
            car.setJobnumber("%"+key+"%");
            car.setCarnumber("%"+key+"%");
            car.setUsermobile("%"+key+"%");
            car.setChejianumber("%"+key+"%");
            car.setRcode("%"+key+"%");
        }
        PageDataResult result = car_Service.getItemList(page, rows, car);
        List<Car> List = (List<Car>)result.getRows();
        result.setRows(List);
        return result;
    }

service 层代码


    /**
     *  分页插件
     * @param page
     * @param rows
     * @param key
     * @return
     */
    PageDataResult getItemList(int page, int rows,Car car);

serviceImpl层代码:

    public PageDataResult getItemList(int page, int rows, Car key) {
        // TODO Auto-generated method stub
//      CarExample example = new CarExample();
//      Criteria criteria = example.createCriteria();
//      //对车辆号码进行模糊查询
//      criteria.andUsermobileLike("%"+key+"%");
        //分页处理
        PageHelper.startPage(page, rows);
//      carMapper.selectByContiditions(key);

//      List<Car> list = carMapper.selectByExample(example);

        List<Car> list = carMapper.selectByContiditions(key);
        //创建一个返回值对象
        PageDataResult result = new PageDataResult();
        result.setRows(list);
        //取记录总条数
        PageInfo<Car> pageInfo = new PageInfo<>(list);
        result.setTotal(pageInfo.getTotal());
        return result;
    }

dao 层代码:

  List<Car> selectByContiditions(Car key);

Mapper.xml 代码:

    <!-- 多条件查询 selectByContiditions -->
    <select id="selectByContiditions" resultType="java.util.Map">
        SELECT
            <include refid="Base_Column_List" />
        FROM
            cx_car
        WHERE
            1 = 1
        AND
            kdgs = '顺丰'
        <if test="username != null">
            and username like #{username}
        </if>
        <if test="jobnumber != null">
            or jobnumber like #{jobnumber}
        </if>
        <if test="carnumber != null">
            or  carnumber like #{carnumber}
        </if>
        <if test="usermobile != null">
            or usermobile  like #{usermobile}
        </if>
        <if test="chejianumber != null">
            or chejianumber like #{chejianumber}
        </if>
        <if test="rcode != null">
            or rcode like #{rcode}
        </if>
        GROUP BY
            carnumber
        ORDER BY
        id DESC
    </select>

至此,Mybatia动态拼接Sql完成。
对比,单个字段的模糊查询:
Controller层代码:

    @RequiresPermissions("admin:carnote:list")
    @RequestMapping(value="/carnote/list",method=RequestMethod.GET)
    public ModelAndView list(Integer page, Integer rows,String key,ModelMap map){

        try {
            key = new String(key.getBytes("iso-8859-1"), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        }

        map.put("key", key);
        map.put("pageSize", this.pageSize);
        return new ModelAndView("/admin/carnote/list",map);
    }


    @RequiresPermissions("admin:carnote:list")
    @RequestMapping(value="/carnote/list",method=RequestMethod.POST,produces="application/json;charset=UTF-8")
    @ResponseBody
    public PageDataResult loadData(Integer page, Integer rows,String key){
        PageDataResult result = carNoteService.getItemList(page, rows, key);
        List<CarNote> List = (List<CarNote>)result.getRows();       
        result.setRows(List);
        return result;
    }

Service 层:

/**
     *  分页插件
     * @param page
     * @param rows
     * @param key
     * @return
     */
    PageDataResult getItemList(int page, int rows,String key);

ServiceImpl 代码:

    public PageDataResult getItemList(int page, int rows, String key) {
        // TODO Auto-generated method stub
        CarNoteExample example = new CarNoteExample();
        Criteria criteria =  example.createCriteria();

        criteria.andTitleLike(key+"%");
        //分页处理
        PageHelper.startPage(page, rows);
        List<CarNote> list = carNoteMapper.selectByExample(example);
        //创建一个返回值对象
        PageDataResult result = new PageDataResult();
        result.setRows(list);
        //取记录总条数
        PageInfo<CarNote> pageInfo = new PageInfo<>(list);
        result.setTotal(pageInfo.getTotal());
        return result;
    }

Dao 层代码:

    List<CarNote> selectByExample(CarNoteExample example);

Mapper.xml 代码

<select id="selectByExample" resultMap="BaseResultMap" parameterType="com.happydeer.pojo.CarNoteExample" >
    select
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from cx_note
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    order by id desc
  </select>

至此对比完毕。
动态拼接实现了多条件搜索功能。
《end》