zoukankan      html  css  js  c++  java
  • springboot模糊查询

    在学习MyBatis过程中想实现模糊查询,可惜失败了。后来上百度上查了一下,算是解决了。记录一下MyBatis实现模糊查询的几种方式。
      数据库表名为test_student,初始化了几条记录,如图:
      数据库表内容
      
      起初我在MyBatis的mapper文件中是这样写的:

        <select id="searchStudents" resultType="com.example.entity.StudentEntity"
            parameterType="com.example.entity.StudentEntity">
            SELECT * FROM test_student
            <where>
                <if test="age != null and age != '' and compare != null and compare != ''">
                    age
                    ${compare}
                    #{age}
                </if>
                <if test="name != null and name != ''">
                    AND name LIKE '%#{name}%'
                </if>
                <if test="address != null and address != ''">
                    AND address LIKE '%#{address}%'
                </if>
            </where>
            ORDER BY id
        </select>

    写完后自我感觉良好,很开心的就去跑程序了,结果当然是报错了:
    报错

      经百度得知,这么写经MyBatis转换后(‘%#{name}%’)会变为(‘%?%’),而(‘%?%’)会被看作是一个字符串,所以Java代码在执行找不到用于匹配参数的 ‘?’ ,然后就报错了。

    解决方法

    1.用${…}代替#{…}

       <select id="searchStudents" resultType="com.example.entity.StudentEntity"
            parameterType="com.example.entity.StudentEntity">
            SELECT * FROM test_student
            <where>
                <if test="age != null and age != '' and compare != null and compare != ''">
                    age
                    ${compare}
                    #{age}
                </if>
                <if test="name != null and name != ''">
                    AND name LIKE '%${name}%'
                </if>
                <if test="address != null and address != ''">
                    AND address LIKE '%${address}%'
                </if>
            </where>
            ORDER BY id
        </select>

    查询结果如下图:
    查询结果

      注:使用${…}不能有效防止SQL注入,所以这种方式虽然简单但是不推荐使用!!!

    2.把’%#{name}%’改为”%”#{name}”%”

       <select id="searchStudents" resultType="com.example.entity.StudentEntity"
            parameterType="com.example.entity.StudentEntity">
            SELECT * FROM test_student
            <where>
                <if test="age != null and age != '' and compare != null and compare != ''">
                    age
                    ${compare}
                    #{age}
                </if>
                <if test="name != null and name != ''">
                    AND name LIKE "%"#{name}"%"
                </if>
                <if test="address != null and address != ''">
                    AND address LIKE "%"#{address}"%"
                </if>
            </where>
            ORDER BY id
        </select>

    查询结果:
    查询结果

    3.使用sql中的字符串拼接函数

       <select id="searchStudents" resultType="com.example.entity.StudentEntity"
            parameterType="com.example.entity.StudentEntity">
            SELECT * FROM test_student
            <where>
                <if test="age != null and age != '' and compare != null and compare != ''">
                    age
                    ${compare}
                    #{age}
                </if>
                <if test="name != null and name != ''">
                    AND name LIKE CONCAT(CONCAT('%',#{name},'%'))
                </if>
                <if test="address != null and address != ''">
                    AND address LIKE CONCAT(CONCAT('%',#{address},'%'))
                </if>
            </where>
            ORDER BY id
        </select>

    查询结果:
    查询结果

    4.使用标签

       <select id="searchStudents" resultType="com.example.entity.StudentEntity"
            parameterType="com.example.entity.StudentEntity">
            <bind name="pattern1" value="'%' + _parameter.name + '%'" />
            <bind name="pattern2" value="'%' + _parameter.address + '%'" />
            SELECT * FROM test_student
            <where>
                <if test="age != null and age != '' and compare != null and compare != ''">
                    age
                    ${compare}
                    #{age}
                </if>
                <if test="name != null and name != ''">
                    AND name LIKE #{pattern1}
                </if>
                <if test="address != null and address != ''">
                    AND address LIKE #{pattern2}
                </if>
            </where>
            ORDER BY id
        </select>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    查询结果:
    查询结果

    5.在Java代码中拼接字符串
      这个方法没试过,就不贴代码和结果了。

  • 相关阅读:
    angular打包出现JavaScript堆内存不足
    antDesign 【NG-ZORRO、Angular】日期选择框时间段nz-range-picker设置默认选择日期及限制日期可选范围
    Echarts 折线图Demo调色12种,可以直接使用~~~
    公司版git完整版
    Linux实例重启服务器后root用户远程连接失败
    Flask+Redis+mq实现高并发
    Dockerfile
    Docker应用部署
    RabbitMQ 实现实现基本通信及订单处理
    centos 7 安装docker的文档参考
  • 原文地址:https://www.cnblogs.com/MaxElephant/p/8418276.html
Copyright © 2011-2022 走看看