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 国际许可协议知识共享许可协议进行许可。

  • 相关阅读:
    UDP
    TCP
    python基础之socket编程
    单列模式
    元类
    issubclass()和isinstance()
    手持机设备公司(WINCE/ANDROID/LINUX)
    Android Hal 分析
    Android JNI 使用的数据结构JNINativeMethod详解
    MTK GPIO 一些理解
  • 原文地址:https://www.cnblogs.com/vocaloid-fan1995/p/10363833.html
Copyright © 2011-2022 走看看