Mybatis #{}和${}

Posted 364.99°

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis #{}和${}相关的知识,希望对你有一定的参考价值。

大多数情况下,都是使用#

1.$和#

# 占位符,可以有效地防止SQL注入

  • 传参大部分使用#,底层使用的是PreparedStatement对象,是安全的数据库访问,能有效防止SQL注入
  • parameterType 即传入参数的类型是八种基本类型的时候
    # 中的内容书写没有限制
    使用?
    <select id="getOneById" parameterType="_int" resultType="string">
        select name
        from student
        where id=#zhang/*这里面的内容可以随便写,不写都可以*/
    </select>
  • parameterType 即传入参数的类型是实体类的类型时
    # 中的内容必须是类中成员变量的名称,要区分大小写
    <insert id="insert" parameterType="student">
        insert into student (name,email,age)
        values (#name,#email,#age)/*这三个参数都是实体类的属性*/
    </insert>

$ 字符串拼接

  • 一般用于模糊查询(like)中,但是有SQL注入的风险
  • parameterType 即传入参数的类型是八种基本类型的时候
    3.5.1及以下的版本,$ 只能写value
    3.5.1以上的版本,$ 随便写
    <select id="getByName" parameterType="string" resultType="student">
        select id,name,email,age
        from student
        where name like '%$name%'/*随便写*/
    </select>
  • parameterType 即传入参数的类型是实体类的类型时
    $ 中的内容必须是类中成员变量的名称,要区分大小写

$ 字符串替换

2.优化模糊查询,防SQL注入

Mapper接口中定义方法

List<Users> getByName(String name);

映射文件中

	<!--
		优化模糊查询
			#中的内容写法还是那样
	-->
    <select id="getByName" parameterType="string" resultType="student">
        select id,name,email,age
        from student
        where name like concat('%',#name,'%')
    </select>

3.$字符串替换

$ 字符串替换 —— $ 少有的优势(灬ꈍ ꈍ灬)

Mapper接口中定义方法

List<Users> getByNameOrAge(
@Param("columnName")//这里面可以随便写,但是要求与参数名相同
String columnName
@Param("columnValue")
String columnValue);

当传入参数多于1个的时候省略parameterType属性

    <select id="getByName" resultType="student">
        select id,name,email,age
        from student
        where $columnName like concat('%',#columnValue,'%')
    </select>

这样可以减少重复的代码

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于Mybatis #{}和${}的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis学习 之 一MyBatis简介与配置MyBatis+Spring+MySql

mybatis系列-16-spring和mybatis整合

mybatis映射 一对一,一对多,多对多高级映射

mybatis介绍和mybatis快速入门

Mybatis和mybatis-spring一级缓存

MyBatis和Mybatis-plus以及mybatis-spring的冲突解决