900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > mybatis mysql 模糊查询语句_mybatis模糊查询语句及注意事项

mybatis mysql 模糊查询语句_mybatis模糊查询语句及注意事项

时间:2022-06-22 02:47:02

相关推荐

mybatis mysql 模糊查询语句_mybatis模糊查询语句及注意事项

select count(*)

from t_user

loginacct like concat("%",#{queryText},"%")

1.动态查询语句

2.SQL中占位符不能在单引号中,否则,会以?进行查询数据

'%#{param}%'

'%?%'

3.SQL中不能使用加号进行字符串拼接,加号是用来做运算的

'%'+'D'+'%'

4.MyBatis进行拼串,拼串会出现 SQL注入情况 ,例如:“or 1=1”

'%${param}%'

5.使用内置方法进行拼串

concat('%',#{param},'%')

6.查询条件值本身为%,查询出所有的数据

concat('%',#{param},'%') => '%%%'

'%\%%' 使用转译字符再进行查询。

7.#和\是一个意思,表示转译。使用#代替\

select * from t_user where username like '%#%%' escape '#'

select * from t_user where loginacct like '%@%%' escape '@'

SELECT * FROM t_user WHERE loginacct LIKE concat('%','@%','%') ESCAPE '@'

8.常见的SQL文,在Oracle中,使用两个竖线用来表示字符串拼接,MySQL中没有这样的语法。

select * from t_user where username like '%'|| #{param} ||'%'

SQL参数问题

select count(*) from t_user

loginacct like '%#{queryText}%'

select * from t_user

loginacct like '%#{queryText}%'

limit #{start}, #{size}

有3个参数,但是只是指定了2个.

Select * from t_user where loginacct like '%#{loginacct}%' limit?,?

org.springframework.dao.TransientDataAccessResourceException:

### Error querying database. Cause: java.sql.SQLException:Parameter index out of range (3 > number of parameters, which is 2).

### The error may exist in URL [jar:file:/F:/atcrowdfunding/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/atcrowdfunding-main/WEB-INF/lib/atcrowdfunding-user-0.0.1-SNAPSHOT.jar!/mybatis/mapper-user.xml]

### The error may involve defaultParameterMap

### The error occurred while setting parameters

### SQL:select * from t_user WHERE loginacct like '%?%' limit ?, ?

### Cause: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).

; SQL []; Parameter index out of range (3 > number of parameters, which is 2).; nested exception is java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).

SQL注入问题 :

Id = 100 OR 1=1

SELECT * FROM t_user WHERE id= ${id}

SELECT * FROM t_user WHERE id= 100 OR 1=1

在特定场合可以使用${}:

例如:

Create table ${tableName} … //表名称位置不能使用?占位符,所以也就不能使用#{}

Order by ${fieldName} asc //对字段进行排序,可以 传递动态字段名称.

select count(*) from t_user

loginacct like'%${queryText}%'

select * from t_user

loginacct like '%${queryText}%'

limit #{start}, #{size}

SQL拼接问题

不能使用加号拼接

使用concat()函数拼接字符串

select count(*) from t_user

loginacct likeconcat('%',#{queryText},'%')

select * from t_user

loginacct likeconcat('%',#{queryText},'%')

limit #{start}, #{size}

查询关键字为% 和 \

查询关键字为%将数据都查询出来了,不安全.

对查询的特殊符号进行转译.

解决:

Java中转译

String queryText = "%";

if(StringUtil.isNotEmpty(queryText)){

//斜线本身需要转译,regex中两个\\表示一个\ ; Java中也是两个\\表示一个\;所以,需要四个斜线

queryText = queryText.replaceAll("%", "\\\\%");

System.out.println("--------------"+queryText);

}

SQL语句中转译

对特殊符号进行转译;斜杠本身也属于特殊符号,需要转译.

select * from t_user where loginacct like '%\\%%'

注意:

尽量在保存数据时,验证数据的合法性,尽量避免存在的字符串中含有特殊符号.

但是,有时无法避免,则需要进行特殊处理:

例如:

"<>"

"D:\\atguigu"

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。