mybatis中用like的时候,变量是动态的,但是总是多了一个单引号,好奇怪。

public List getmajorscores(String course,String term){//这是调用方法
List list = sMapper.getmajorscores("17会计","2");
return list;
}
在score.java中:
List getmajorscores( String course, String term);
在score.xml中:
select * from scores where s_term = #{1} and s_class like CONCAT('%',#{0},'%') and s_course in(SELECT DISTINCT s_course from scores where s_class like CONCAT('%',#{0},'%') )

0

9个回答

sql本身如楼上所说,and s_class like CONCAT('%',#{0},'%')这句话不用要,因为你虚表本身就有,说实话,就sql本身而言,楼主将sql写复杂了,
我们分析一下,SELECT DISTINCT s_course from scores where s_class like CONCAT('%',#{0},'%')这句话就是查询课程根据班级,而你
所以整个sql可以翻译为查询信息根据 s_term 并且 根据 班级s_class like CONCAT('%',#{0},'%')(这句)并且根据课程,而课程是怎么查出来的?根据班级SELECT DISTINCT s_course from scores where s_class like CONCAT('%',#{0},'%'),楼主可以试一下,根本没必要要最后一个and之后的语句,查询出的信息觉对完全一样,也就是2句话说的是一个意思,如果是因为s_cores可能为null导致的可以加一句and s_course is not null,至于为什么觉得让楼主去掉最后一个and之后的,是因为in的效率极其低下我们一般sql能不用in就不用in的,in是全表检循环检索,也就是说,你有1000条数据,in有10个条件,呢么就要检索1000*10次,什么概念?你有百万条数据呢?另外看你贴的错误其是因为17会计真正传过去的时候是'17会计',其暂时我还没看出来,方便的话,将整个xml关于这段贴出来,包含select标签

0
zhangpan_soft
zhangpan_soft 回复weixin_40119478: 我知道你没有加,我说的假如,假如我是一个攻击者,我就非常轻松的进入你系统了
10 个月之前 回复
weixin_40119478
代码没写完 回复sky__fall: 没有啊,就直接传变量过去的,我没有单独加一个单引号
10 个月之前 回复
zhangpan_soft
zhangpan_soft 回复weixin_40119478: $会产生sql注入漏洞,真正解决办法已贴出,你可以看下,$的含义在评论某条帖子时已说明,我给你举一个例子,就比如你的sql,假如我这样传入参数,我的参数是' OR 1=1,会产生什么?,sql变为 where s_term = ... and s_class like '' or 1=1这时候直接把你所有数据拿到了,假如再狠一点我用1来试你有多少列,然后关联用户表,试出密码,如下:我传入' UNIQUE SELECT 1如果不是一列报错再传入' UNIQUE SLEECT 1,1,不是2列继续递推,当推出你有多少列的时候我开始传入' UNIQUE SELECT ... FROM 表名,试出用户表,说严重点,我甚至可以根据sql漏洞,拿到数据库权限,拿到数据库权限,然后将其升级为root用户,拿到整个操作系统权限,你就gg了
10 个月之前 回复
sky__fall
Dream_fall 回复weixin_40119478: 尽量不要用美元符号哦,有sql注入漏洞的风险。你是否确定course参数中没有单引号?
10 个月之前 回复
weixin_40119478
代码没写完 感谢您的指导,我后面再优化一下语句,不用in了,整句是这样的: <select id="getmajorscores" resultMap="BaseResultMap" > select * from scores where s_term = #{term} and s_class like CONCAT('%',${course},'%') and s_course in(SELECT DISTINCT s_course from scores where s_class like CONCAT('%',${course},'%') ) </select>
10 个月之前 回复

没有语法错误,但是你得sql语句写重复了 不需要下面这句: and s_course in(SELECT DISTINCT s_course from scores where s_class like CONCAT('%',#{0},'%') )

0
weixin_40119478
代码没写完 后面那句是有用的,所以不能删呢。
10 个月之前 回复
weixin_40119478
代码没写完 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%'17会计'%' at line 1 忘记放上去错误了,在变量那里&多了一个‘
10 个月之前 回复

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%'17会计'%' at line 1
忘记放上去错误了,在变量那里&多了一个‘

0

建议试一下:
List getmajorscores( String course, String term); 这句改成List getmajorscores( @Param("course")String course, @Param("term")String term);

#{1} 改成 #{term} #{0} 改成 #{course}

另外 in 后半句确实没用,子查询和外面的查询都是从一张表查?那还搞个子查询干嘛

0
 select * from scores where s_term = #{1} and 
<bind name="pattern" value="'%"+#{0} +" %'" />
s_class like #{pattern}
and s_course in(SELECT DISTINCT s_course from scores where s_class like  #{pattern})
0

图片说明

0

补充一点,我们在用模糊的时候,很少如楼主呢让用,我们一般是在业务层拼接好传过去的,也就是在service中已经拼接成%17会计%,然后将这个传入sql,在sql中就变为了like #{...},

0
zhangpan_soft
zhangpan_soft 回复zhangpan_soft: 方便的话加我qq283483610,我给你远程下,个人感觉是一个小点被忽略了,
10 个月之前 回复
zhangpan_soft
zhangpan_soft 回复weixin_40119478: like不会自己加的,我一直这么写的,没出过问题
10 个月之前 回复
weixin_40119478
代码没写完 回复zhangpan_soft: 确定了传的时候17会计没有’引号,语句用的like #{0},感觉'%'是这个like自己加进去的
10 个月之前 回复
zhangpan_soft
zhangpan_soft 回复weixin_40119478: 你先试试,我先吃饭去了
10 个月之前 回复
zhangpan_soft
zhangpan_soft 回复weixin_40119478: 如果还是报这个错那绝对是因为你的参数本身就带了',你可以改为List<Scores> list = sMapper.getmajorscores("%"+course.replaceAll("\'","")+"%","%"+term+"%");就没问题了
10 个月之前 回复
zhangpan_soft
zhangpan_soft 回复weixin_40119478: select * from scores where s_term = #{1} and s_class like #{0} 将这句话替换你原来sql试下
10 个月之前 回复
sky__fall
Dream_fall 回复weixin_40119478: 1、%外还是要加单引号的;2、这个说明,course里本来就有单引号,你可以把course打印出来试试。
10 个月之前 回复
weixin_40119478
代码没写完 List<Scores> list = sMapper.getmajorscores("%"+course+"%","%"+term+"%");我这样子拼接了一下,还是这样ight syntax to use near '%'17会计'%' at line 1
10 个月之前 回复
weixin_40119478
代码没写完 我试试
10 个月之前 回复

把#{0}换成${0}试试应该可以

0

图片说明
#{}是带引号的吧,拼接会报错,?就没错。

-2
zhangpan_soft
zhangpan_soft 回复u014794644: 一样的,你只不过用的是注解方式,mybatis注解是不支持$的,仅仅这个区别
10 个月之前 回复
u014794644
瓦史托德 回复zhangpan_soft: xml和java不一样的,我java的使用$就报错
10 个月之前 回复
zhangpan_soft
zhangpan_soft #在mybatis中等同于jdbc的?,?的含义是PreparedStatement,好好研究下什么是PreparedStatement,什么是Statement,在MyBatis中#代表PreparedStatement,$代表Statement,Statement会产生sql注入漏洞,我是怀疑楼主加了DATA头,所以出问题了
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
mybatis模糊搜索内容带单引号报错问题
今天写了个mapper做模糊查询name like '%${name}%'。如果输入的内容里带有单引号,像这个样子ce’shi,就会报mybatis异常。 最后使用name like concat('%',#{name},'%')解决问题 ...
如何用sql模糊查询如:单引号
 1:如果在sql中:单引号的查询 select * from t where t.name like '%&quot;%'; 两个单引号的中间加个双引号就可以了 2:如果是在程序中拼装sql String s = &quot;&quot;; s =&quot;select *from t where t.name like &quot;; s +=&quot;'%&quot;; s +=&quot;\&quot;&quot;; s += &quot;%'&quot;;  这里主要是像两
要查询的字段里面带有一个双引号或者单引号 如何使用like模糊查询
本人测试的是mysql、 当使用的时候只要使用反斜杠转移字符就好 举例: select * from cx_interface_log WHERE text like '%\'5555\'%';
mybatis中llike模糊查询中#和$的使用
在mybatis中经常要写到like 查询,以前从来没有遇到什么问题,突然遇到一个问题,找了好长时间没找到,最后找到了,是关于#和$的使用的。总结如下: name like 表达式 and falg=#{falg} 本次示例中共两个条件,一个是name like 表达式, 还有flag相等,这个是使用#{}占位符,没有任何问题,关键问题就是 表达式的书写.下面来研究下表达式的书写:
oracle的存储过程中使用变量或参数进行模糊查询(like的变量绑定)
网上找的createorreplaceprocedure Query_By_Key(p_key1 invarchar2,p_key2 invarchar2,p_cursor out JN_TABLE.JN_CTable)*isstr_Sql  varchar2(500):=' select * from TableA'||                          ' where...
python qpython sqlite3 like 模糊查询 变量 赋值 单引号 双引号
1、sqlite多表查询用模糊查询怎么写? 参考自:http://www.iteye.com/problems/85830 select a.name,a.age,b.name,b.sex from a a inner join  b b on a.name=b.name where a.name like '%"+name+"%' 或者 "select a.name,a.age,
MyBatis传入parameter时的引号问题
为何Mybatis传入String参数没问题时,却无法得到结果? 1. 期初没报错,所以没注意到Parameter显示为“jhz" 2. 之后修改了,select的Base_Column_List,减少了几个参数,发现,原来传入的是”jhz",而不是jhz,多了对双引号 3. 原来是JSON的rootNode.toString转换时,还是带了”\""在其中的原因 4. 解决方案: roo
mybatis中传递参数时,会加上单引号
1) 使用#{参数}传入会加上单引号,sql语句解析是会加上"", 比如  select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是  select * from table where name = ‘小李’,就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果你传入的参数
mybatis中操作数据库时传递参数时,会加上单引号(#{}与${}的使用)
mybatis中操作数据库时传递参数时,会加上单引号(#{}与${}的使用) 学习要点 mybatis中操作数据库时传递参数时,会加上单引号(#{}与${}的使用) mybatis中操作数据库时传递参数时,会加上单引号(#{}与${}的使用) 1) 使用#{参数}传入会加上单引号,sql语句解析是会加上"", 比如 select * from table where nam
mybatis like 模糊查询 特殊字符报错 转义处理
&amp;lt;if test=&quot;projectName!=null and projectName!=''&quot;&amp;gt; &amp;lt;bind name=&quot;projectName_&quot; value=&quot;'%'+projectName+'%'&quot;/&amp;gt; AND info.name like #{projectName_} &amp;lt;/if&amp;gt;
mybatis中怎么使用like形成动态模糊查询,错误使用CONCAT拼接sql的看过来
这个问题曾经困扰了我很长时间,因为我需要动态参数的模糊查询,上网找了很多,都说用CONCAT但我用ORACLE的时候发现并不能满足我的需求。 今天就说一下,我是怎么解决这个问题的。 其实我当时为了拼sql一经头昏脑胀了,但是你想想看,为什么一定要在sql中拼凑sql呢? 直接连‘%value%’当作一个整体传参,你想到了吗?让你远离拼接sql实现更强大的功能。 但一定要注意判断在...
mybatis的foreach语句使用问题
项目开发过程中,需要对表中多条记录进行删除和更新处理,为此,使用了mybatis中的foreach配置语句,我配置如下:      delete from alarm   where id in   open="(" separator="," close=")">#{item}      使用的参数是字符串数组,在界面操作后,mybatis日志打印如下: 2012-09-0
SQL语句拼接多了一个单引号抛出的异常
工作中遇到异常:org.springframework.jdbc.UncategorizedSQLException: Hibernate-related JDBC operation; uncategorized SQLException for SQL []; SQL state [99999]; error code [17034]; 出现不支持的 SQL92 标记: 122: 61977C
hibernate用like进行模糊查询时不能写单引号!!!
今天在用hibernate进行like查询时,遇到了sql语句类似这样的:   'xxx'      'xxx%'     '%xxx'    '%xxx%' 每种情况都要考虑的时候,直接写查询不出结果(我带单引号查不出结果) 其中SQL SERVER2014中: SQL语句为: select p.p_order, p.id from order_product
存储过程中动态拼接sql,拼接单引号问题
create or replace procedure mergerOrder(       v_ids in varchar2,       v_productCode in varchar2,       v_productCateCode in varchar2) is       type cur_type is ref cursor;       cur_policy cur_
MySQL concat里面使用多个单引号,三引号
在动态拼接字符串时,我们常会用到字符拼接,我对拼接的引号不理解,如:1、'''+ id +'''  为什么是3个引号,为什么左边一个加号右边一个加号(能不能着重帮我解释下这个,详细点)SQL code?1sum(case Leave when '''+ id +''' then DaysNo else 0 end) ['+ name +']'正常语句:SQL code?12SUM(CASE Lea...
mybatis中的like查询,$取值时防sql注入和通配符注入,#取值时防通配符注入
在mybatis中用like查询时,如果用户输入的值有"_"和“%”,则会出现这种情况: 用户本来只是想查询“abcd_”,查询结果中却有"abcd_"、"abcde"、"abcde"等等,用户要查询"30%"(注:百分之三十)时也会出现问题。 测试后发现不管你是用#{xxxx }还是用${xxxx }取值都会存在这些问题,而且用${xxxx }取值时还存在sql注入的问题。 为了解决这些问
MyBatis变量自动加单引号问题
为了防止SQL注入,MyBatis在调用Mapper中的SQL语句是,会为变量值自动加单引号 如 select * from table_a where name=#{name}    如果变量name=“abc”,则实际执行的SQL语句为     select * from table_a where name='abc'  但如果变量是表名,就会出现问题 如 creat...
mybatis 对于生成的sql语句 自动加上单引号的情况
mybatis 对于生成的sql语句 自动加上单引号的情况 mybatis是这样的,如果表的字段跟系统字段冲突,写sql语句的时候必须得加上单引号,这样才会区分 mySQL中replace的用法 1.replace into replace into table (id,name) values(‘1’,‘aa’),(‘2’,‘bb’) 此语句的作用是向表table中插入两条记录。如果主键id为1...
Mybatis中运用小技巧(二) like的使用
假设要找用户姓名中即含“李”又含“香”的用户,mysql中用like可以解决,语句为:SELECT * FROM user WHERE u_name LIKE '%李%' AND u_name LIKE '%香%'; 如果要用JSP+Mybatis来实现的话,首先在UserMapper.java中声明一个selectIllegibilityByName方法:List selectIllegibi
启动tomcat的时候一个奇怪的类找不到的错误研究!
 启动的时候有如下的错误:[WARN ]com.sun.faces.config.rules.ConverterRule.end(ConverterRule.java:127) - [ConverterRule]{faces-config/converter} Merge(OmnipotentConverter,null)java.lang.ClassNotFoundException: [L
mybatis 转义符使用
第一种写法(1):原符号 &amp;lt; &amp;lt;= &amp;gt; &amp;gt;= &amp;amp; ' &quot; 替换符号 &amp;amp;lt; &amp;amp;lt;= &amp;amp;gt; &amp;amp;gt;= &amp;amp;amp; &amp;amp;apos; &amp;amp;quot;例如:sql如下:create_date_time &amp;amp;gt;
Js参数值中含有单引号或双引号问题的解决方法
function Display(LoginEmail, UserName, ID) {         alert(LoginEmail);     }   1.使用单引号传参: Test1   如果其中一个参数有一个值含有单引号,那么这个方法会出错. Test1   改进: 有单引号的加上\', OK。 Test   2.上面解决了单引号的问题,但如果值中
美团2018测开编程题——改卷子&魔法表
魔法表时间限制:C/C++语言 2000MS;其他语言 4000MS 内存限制:C/C++语言 65536KB;其他语言 589824KB 题目描述: 时辰送给了她的女儿凛一块魔法表,但是魔法表的表针总是指向奇怪的地方,所以凛决定修理一下这块表。当前表的指针指向了一个方向n1n1 (在 0 度到 359 度之间,正北方向是 0 度,正东方向是 90 度),她需要将表针调节到方向n2n2 。她可
MyBatis模糊查询不报错但查不出数据的一种解决方案
今天在用MyBatis写一个模糊查询的时候,程序没有报错,但查不出来数据,随即做了一个测试,部分代码如下: @Test public void findByNameTest() throws IOException { String resource = &quot;SqlMapConfig.xml&quot;; InputStream inputStream = Resources.getResource...
mybatis#{}和${}的区别/去除生成的SQL语句的单引号
http://www.cnblogs.com/davidwang456/p/4929426.html
PL/SQL中LIKE函数使用变量 PL/SQL中LIKE函数使用变量
orcal使用的方法: like中使用变量方式为:like '%' || 变量名|| '%'  create or replace procedure edrill_report_day as  re_date date;  re_date_str varchar(20);  begin  re_date := trunc(sysdate) - 1;  re_da
MyBatis 模糊查询-拼接SQL语句
mybatis-模糊查询的方式
ibatis使用in查询加引号
ibatis参数加引号使用in语句
mybatis的 if test 条件判断字符串单双引号解析问题
昨天码代码,掉到坑里,耽误了几个小时才从坑里爬出来-_-|||由于MyBatis是使用的OGNL表达式,所以单个的字符要写到双引号里面才行,改为&amp;lt;if test='takeWay == &quot;1&quot;'&amp;gt;或者改为&amp;lt;if test=&quot;takeWay == '1'.toString() &quot;&amp;gt;.xml文件的部分代码 &amp;lt;insert id=&quot;insertDelivery&quot; param...
【MyBatis】 动态SQL——模糊查询 LIKE
一:LIKE % % SELECT * FROM t_usr WHERE name like '%${name}%'   SQL解析为:SELECT * FROM t_usr WHERE name like '%海%'   可以看到,传参必须用${}不能用#{},所以这样写的弊端就是不安全,不能防sql注入   有关LIKE使用,请参见:https://blog.csdn.net...
sql查询语句中用like中用参数化查询
今天终于学会怎么在like中用参数化查询啦。。哈哈。。再也不用担心sql注入了。。。
PHP定义字符串时单引号和双引号的区别
一般用单引号或双引号标识一个字符串。单引号串与双引号串,在PHP中的处理是不同的。双引号中的内容可以被解释并被替换,单引号串中的内容则被作为普通字符处理。 例如: $str=6; echo "str is $str\n"; echo 'str is $str\n'; 输出结果为 str is 6 str is $str\n 注:单引号中输出的内容是“所见即所得”的,无论有
adt eclipse 中出现了大片奇怪的符号
如题,不知是按到什么键了,eclipse界面出现了很多奇怪的字符,每行都有: 关了重启也还在,怎么去掉这些符号呢?网上查到了答案,来自红黑联盟: 点击打开链接 Window->Preferences->General->Editors->Text Editors->去掉show whitespace characters 该选项是显示空格和制表符。
MyBatis的动态sql的like拼接
<if test="params.nickName!=null"> and o.nick_name like concat(concat('%',#{params.nickName,jdbcType=VARCHAR}),'%') </if>
MyBatis下动态语句使用like进行模糊查询
MyBatis下动态语句使用like进行模糊查询
拼接字符串时,单引号与双引号的问题
在利用JQuery动态的操作DOM时,往往需要添加一些比较复杂的内容,比如:利用JQuery动态生成一个复杂的表头,再给表头的的文字添加一些事件:点击某个列名,对该列进行排序什么的。 如果直接写在HTML中很简单: 序号 但是,如果要用JQuery动态生成表头的话,则比较复杂。 可
Mybatis中动态查询的if test条件判断的单引号和双引号解析问题
在mybatis的动态查询语句中,if test是我们比较常用的,当我们判断一个属性值是否为单个字符的时候。 就不能用&amp;lt;if test=&quot;takeWay == '1'&quot;&amp;gt;。takeWay == “1”处出错,导致不执行if判断中的sql,运行程序不报错,没有任何提示。去掉takeWay == “1” and 则可执行。 因为 MyBatis是使用的OGNL表达式,’1’会被解析成字...
mybatis 解决特殊参数(" ,')输入报错
sql 为: 添加concat 函数解决查询输入框输入特殊字符报错的问题,例如单引号 name like concat('%',#{name},'%')
Mybatis中模糊查询时相关的参数传递及xml配置
Mybatis框架xml中的模糊查询配置
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 学习java一年多了 大数据和机器学习是一个吗