您的位置:首页 > 其它

使用MyBatis进行模糊查询时%到底写哪儿的解决办法

2017-04-14 21:46 417 查看

介绍

这种解决办法。。。感觉非常Nice!!

解决办法

在我们以前写sql语句的时候,我们通常是这样写的。

SELECT * FROM user WHERE username LIKE #{likeUser}


我们在Java代码中我们是这样传值的:

%FireLang%


到现在才知道,这种写法太有耦合度了,代码写得太丑了!!
*\_/*
难看的脸。

sql语句不能够在Java代码中出现,我们要做的只是传入值,只是传入值!!!

如果哪儿天MySql要大换血,把%废了,那我们还要改Java代码??虽然可能性几乎为零。但是我这里讲的是一种思想!!一种思想!!!任何地方都要尽可能的减少耦合!!!不要耦合!!不要耦合!!!

所以你表达了这么多,现在能告诉我解决办法了吗??orz

解决办法就是。。。

把查询语句改为:

SELECT * FROM user WHERE username LIKE '%#{likeUser}%'


你觉得可以吗??我这样问你,你是否会思考这个问题到底有问题呢还是没问题呢还是这个问题到底有没有问题。。。晕没有。。反正我晕了。这问题到底是不是问题。。这个问题的问题到底有没有问题。。

试试不就知道咯!!

最终测试结果不尽人意。。。

Caused by: java.sql.SQLException: No parameters defined during prepareCall()

Caused by: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null .


哦豁。。。不得行!!!它说没得第一个占位符。

没有第一个占位符也就不可能把值设置进去了。看一下它发送的sql语句:

Preparing: SELECT * FROM user WHERE username LIKE '%?%'


嗯??这不是有占位符吗??为什么呢??想了想。。。。。嗯!!明白了这个
"?"
号写在单引号里面的。所以这个
"?"
被当成值处理了!!!

那还有什么办法呢??

试试这个!!

SELECT * FROM user WHERE username LIKE '%'+#{likeUser}+'%'


拼起来不就行咯。哈哈!!完美!!

咳!!各位读者啊,我想问一下。这个真的可以运行吗??

好!再试试!!

嗯。发送sql语句正常!!不错不错。

Preparing: SELECT * FROM user WHERE username LIKE '%'+?+'%'


嗯??还报错!!!

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax;


*_*
,MySQL。你逗我吧!!我这个有语法错误??我用
"+"
号拼接字符串还有错??你有病吧!!MySQL!!MD!!
*_*


不跟你玩了,快告诉我正确答案!!

其实很多程序员都犯这个错!!错了还不知道到底错在哪儿??

在MySQL中
"+"
号是被重写了的,它对于字符串来说并没有拼接的功能,反而只对数字有正常的加法功能!!!

所以啊!你还记得concat()这个方法不??

在MySQL中的用法:

concat('hello ','FireLang')//输出hello FireLang


所以我们可以这样写MyBatis的sql代码:

SELECT * FROM user WHERE username LIKE concat('%',#{username},'%')


好了正确答案告诉你了!!

表个态吧!!感觉我这篇文章怎么样???请点赞吧!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: