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代码中拼接字符串
      这个方法没试过,就不贴代码和结果了。

  • 相关阅读:
    【彩彩只能变身队】后端工作总结
    彩彩只能变身队团队项目进展记录by后端
    一周工作+会议汇报(6.3)
    【彩彩只能变身队】第七次会议
    【彩彩只能变身队】第六次会议
    这个博客正式废用了!!!!搬家了!!!!
    [软件工程]一些不错的学习网站
    NWERC 2015 Problem H: Hole in One
    HDU 5970 CCPC2016合肥 求等差数列整除整数下取整求和
    [软件工程]python 发送邮件网易邮箱163示范
  • 原文地址:https://www.cnblogs.com/MaxElephant/p/8418276.html
Copyright © 2011-2022 走看看