zoukankan      html  css  js  c++  java
  • MyBatis实现模糊查询的几种方式

      在学习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>

    查询结果:
    查询结果

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

    ————2017.07.03

    作者: 暮颜 —— 衣带渐宽终不悔
    出处:https://www.cnblogs.com/vocaloid-fan1995/
    版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    转载请注明原文链接:https://www.cnblogs.com/vocaloid-fan1995/p/10363833.html
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议知识共享许可协议进行许可。

  • 相关阅读:
    复制工程或修改工程名字后找不到第三方库解决方法
    描述文件不匹配的解决方法
    JSON Code3840错误
    swift介绍和语言概述
    swift
    新入行程序员应知的十个秘密
    signal SIGABRT
    属性,属性赋值及其内存管理
    HTTP网络请求
    使用类目删除可变字符串中重复字母的一个算法
  • 原文地址:https://www.cnblogs.com/vocaloid-fan1995/p/10363833.html
Copyright © 2011-2022 走看看