Mybatis的sql映射语句写法

mybatis模糊查询 Like

Mybatis模糊查询like语句有几种拼写方式:  

<select id="query" resultMap="ManualResultMap" parameterType="Map">
        SELECT a.*, b.client_name
        FROM publish a
        LEFT JOIN client b
        ON a.client_code = b.client_code
        WHERE 1=1
        <if test="null != adClient">
            and a.ad_client = #{adClient}
        </if>
        <if test="null != product">
            and a.product = #{product}
        </if>
        <if test="null != pageNo and null != pageSize">
            limit #{pageNo},#{pageSize}
        </if>
</select>

    1.使用#{} 。  因为#{ }解析成sql语句时候,把变量默认为字符串,会在变量外侧自动加单引号'  ',所以这里 % 需要使用双引号"  ",不能使用单引号 '  ',不然会查不到任何结果

<if test="null != product">
    and a.product like "%"#{product,jdbcType=VARCHAR}"%"
</if>

  即sql为:and a.product like ‘%美汁%’

     2.使用${ } 。 直接将参数显示注入到sql中,弊端:可能引起sql注入问题。不建议使用。

<if test="null != product">
    and a.product like '%${product}%'
</if>

即:传入变量“美汁”时,对应的sql为:and a.product like ‘%美汁%’

当传入的变量为“美汁%’ or 1=1 or a.product like ‘%你好 ”,sql会直接注入从参数,显示为:

        and a.product like ‘美汁%’ or 1=1 or a.product like ‘%你好’ 

此时,sql语句的意思已经发生变化,这种现象叫做sql注入问题,所以一般不建议使用${}

       3.使用concat(a,b,c) 。使用函数连接sql语句。        

<if test="null != product">
   and a.product like CONCAT('%',#{product,jdbcType=VARCHAR},'%')        
</if>

SQL注入问题

什么是sql注入

       所谓sql注入就是web后台应用程序存在安全漏洞,在输入的字符串中嵌入sql指令,缺乏字符检查的程序将这些字符串误认为是正常的sql指令,利用这些sql指令执行数据库操作,可能严重破坏数据库。

举个例子

        mybatis中使用${}时,会直接注入显示变量,容易出现sql注入问题,使用#{},则将变量作为字符串处理,会自动为变量添加双引号,不易出现sql注入,较为安全。

        有的应用程序喜欢直接抛异常,web页面上显示sql语句错误详情,这都很容易让人猜到背后执行的sql语句。比如这样的一句错误:“Syntax error (missing operator) in query expression 'username = 'admin'' AND password = 'admin'''.”

        很容易猜到:这是一个登陆账号的sql查询语句:select * from  user  where username=? and password=?

        如果后台使用${}来接受sql变量:当页面账号和密码都输入“admin' or '1”时:对应的sql则变成:

        select * from [users] where username=’admin’ or ‘1’ and password=’admin’ or ‘1’ 

        这句sql就变成永远成立,可以查出来账号密码信息。

         这就是一个典型的sql注入问题。

如何防备Sql注入

       输入验证:检查输入变量内容的合法性。

       错误信息处理:包装内部异常信息和错误信息,不要直接显示给别人看,错误信息显示在日志中自己看就可以了。

       数据加密:利用不常用的加密算法或盐值对数据加密。

       使用存储过程执行查询

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis中,可以使用三种方式进行模糊查询的拼接,具体如下所述: 1. 使用“${...}”的写法,语法为“like '${...}'”,这种写法直接将参数拼接到SQL语句中。例如,如果想要进行以某个关键字开头的模糊查询,可以使用类似于“like '${keyword}%'"的写法。 2. 使用“#{...}”的写法,语法为“like '#{...}'”,这种写法会将参数作为预处理语句的参数进行处理。例如,如果想要进行以某个关键字结尾的模糊查询,可以使用类似于“like CONCAT('%', #{keyword})”的写法。 3. 使用CONCAT函数连接参数的写法,语法为“like CONCAT('%',#{...},'%')”。这种写法将参数使用CONCAT函数进行连接,可以在模糊查询时更加灵活地组合多个参数。 需要注意的是,如果在使用Mybatis进行模糊查询时出现类似于"org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'VARCHAR' in 'class com.utry.ucsc.dao.bean.KnowledgeLibraryBean'"的异常,可能是由于在实体类中缺少名为'VARCHAR'的属性所导致的。查看实体类的属性是否正确命名与映射即可解决这一问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mybatis 中 Oracle 的拼接模糊查询及用法详解](https://download.csdn.net/download/weixin_38565221/12756821)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [mybatis模糊查询like语句怎么写](https://blog.csdn.net/knight5172/article/details/119942234)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值