一、mybatis处理模糊查询的几种方式
1、concat函数和#{}拼接的方式
select * from sys_user where student_name like concat('%',#{studentName},'%')
2、%和${}拼接的方式
select * from sys_user where student_name like '%${studentName}%'
3、.concat函数和${}拼接的方式
select * from sys_user where student_name like concat('%','${studentName}','%')
4、||和#{}拼接的方式,||主要在Oracle中使用
select * from sys_user where student_name like '%'||#{studentName}||'%'
5、使用 bind 标签来创建一个可以在 SQL 中使用的模糊匹配变量
<select id="selectUsersByName" resultType="User">
select * from sys_user
<where>
<if test="name != null">
<!-- 使用 bind 标签来创建一个可以在 SQL 中使用的模糊匹配变量 -->
<bind name="pattern" value="'%' + name + '%'"/>
and name like #{pattern}
</if>
</where>
</select>
区别:(1)${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中,可能引发sql注入。 (2)#{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,传入字符串后,会在值两边加上单引号,使用占位符的方式提高效率,可以防止sql注入。因此最好使用#{ }方式,或者bind标签的方式。
${}产生sql注入演示:例如有以下代码,而用户id是由用户输入的
String userId = "user' OR '1'='1";
String sql = "SELECT * FROM users WHERE id = " + userId;
那么攻击者可以输入userId为:userId = "OR 1=1,这将导致 SQL 语句变成如下:
SELECT * FROM users WHERE id = OR 1=1
这将查询到该表的所有数据
二、在element组件中约定输入数据为数字,报错解决:
在检验规则中加入如下规则:
{ type: 'number', message: '输入内容不是有效的数字', trigger: 'blur' }
但是在输入框中输入数字却依然显示不是有效数字解决方案如下:
在做数据绑定时候本来是v-model,修改为v-model.number,或者在输入框中再加一个type="number"即可解决
三、模糊知识点整理
1、自动拆装箱:当编译器检测到需要将一个基本数据类型的值赋给一个包装类类型的变量时,它会调用包装类的valueOf()
方法,将基本数据类型的值转换为包装类对象。当编译器检测到需要将一个包装类对象赋给一个基本数据类型的变量,或者包装类对象参与基本数据类型的运算时,它会调用包装类对象的xxxValue()
方法(如intValue()
、doubleValue()
等),将包装类对象中的基本数据类型值提取出来。
注意:在拆箱操作时,如果包装类对象为null,则会抛出NullPointerException,因此在进行拆箱之前,应始终检查包装类对象是否为null,或使用Optional
类来处理可能的null值