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

  • 相关阅读:
    Linux下Java环境安装
    Go语言学习之10 Web开发与Mysql数据库
    Go语言学习之9 网络协议TCP、Redis与聊天室
    Redis入门指南之三(入门)
    Redis入门指南之一(简介)
    Go语言学习之8 goroutine详解、定时器与单元测试
    Redis入门指南之二(安装及配置)
    Go语言学习之7 接口实例、终端文件读写、异常处理
    Go语言学习之6 反射详解
    Go语言学习之5 进阶-排序、链表、二叉树、接口
  • 原文地址:https://www.cnblogs.com/MaxElephant/p/8418276.html
Copyright © 2011-2022 走看看