Mybatis中$与#使用和区别

Mybatis中$与#使用和区别

1.#
#{}表示一个占位符,进行参数传递的时候,会将传递的参数看作是字符串,并且加上引号,替换占位符的位置,连接到sql语句中;

#{}可以接收简单类型和pojo,如果paramaterType传递的是简单类型,#{}括号中可以是value或其他;

xml文件中代码:

//  模糊查询 #
<select id="findByName" parameterType="String" resultType="org.ali.domain.User">
        select * from user where username like #{username};
    </select>

测试类中代码:

// 模糊查询
    @Test
    public void findByName(){
        String username = "%小%";
        // 执行
        List<User> list = userDao.findByName(username);
        for(User u:list){
            System.out.println(u);
        }
    }

测试结果:
在这里插入图片描述
上面可以看到控制台的预编译sql,测试类中我们写的 %小% 被当作字符串传入到sql语句中替代了?,一定也给添加上了引号,最后查询到数据库的用户信息。

2.$
利用 $进行传递参数,拼接sql,在xml的sql代码块中,要写好引号

${}也可以接收简单类型和pojo,但 如果传递的是简答类型, ${}括号中只能是value;

xml文件中代码:

<!--    模糊查询 用户-->
    <select id="findByName" parameterType="String" resultType="org.ali.domain.User">
        select * from user where username like '%${value}%';
    </select>

测试类中代码:

 // 模糊查询
    @Test
    public void findByName(){
        String username = "小";
        // 执行
        List<User> list = userDao.findByName(username);
        for(User u:list){
            System.out.println(u);
        }
    }

测试结果:
在这里插入图片描述
从控制台可以看到,与#不同的地方是,sql语句没有预处理,而是直接将我们在测试类中定义的字符 小 ,替换${value},拼接在xml中的sql语句中。

提醒:

  1. #{}与${} 都可以实现功能,但是两种方式在控制台中的过程是不相的,#{} 的jdbc类型转换可以有效的防止 sql注入(简单来说就是一些黑客在查询语句的结尾上添加额外的SQL语句,进行非法查询,窃取数据信息), ${}无法防止。
  2. 能用#{}就用#{},毕竟安全可靠。
IF(BOOL 学习= =FALSE)BOOL 落后=TRUE;不断的学习,我们才能不断的前进。

版权声明:本文为weixin_44679651原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。