- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
mybatis常见的面试题
1、Mybatis基础: #{...} 和 ${...} 的区别
MyBatis将 #{…} 解释为JDBC prepared statement 的一个参数标记。而将 ${…} 解释为字符串替换。理解这两者的区别是很有用的, 因为在某些SQL语句中并不能使用参数标记(parameter markers)。
?
?
比如,我们不能在表名(table name)的位置使用参数标记。
假设有下面的代码:
?
?
01.MapString, Object parms = new HashMapString, Object(); ?
02.parms.put(table, foo); // 表名 ?
03.parms.put(criteria, 37); // 查询过滤条件 ?
04.ListObject rows = mapper.generalSelect(parms); ?
?
?
01.select id=generalSelect parameterType=map ?
02. ?select * from ${table} where col1 = #{criteria} ?
03./select ?
?
?
MyBatis生成的SQL语句(prepared statement)如下所示:
01.select * from foo where col1 = ? ?
?
?
重要提示: 请注意,使用$ {…} (字符串替换)时可能会有SQL注入攻击的风险。另外,字符串替换在处理复杂类型也可能常常发生问题,如日期类型。由于这些因素,我们建议您尽可能地使用 #{…} 这种方式。
要使用LIKE语句该怎么写?
?
?
?
?
2、有两种使用LIKE的方法。(推荐使用)第一种方法是,在 Java代码中添加SQL通配符。
示例一:
01.String wildcardName = %Smi%; ?
02.ListName names = mapper.selectLike(wildcardName); ?
?
?
01.select id=selectLike ?
02. ?select * from foo where bar like #{value} ?
03./select ?
?
?
第二种方式是在SQL语句中拼接通配符。这种方法相对来说安全性要低一些,因为可能会被SQL注入攻击。
示例二:
01.String wildcardName = Smi; ?
02.ListName names = mapper.selectLike(wildcardName);?
?
?
01.select id=selectLike ?
02. ?select * from foo where bar like % || ${value} || % ?
03./select ?
?
重要提示: 请注意两种方式中 $ 和 # 的使用!
?
?
3、如何执行批量插入?
?
首先,创建一个简单的insert语句:
01.insert id=insertName ?
02. ?insert into names (name) values (#{value}) ?
03./insert ?
?
?
然后在Java代码中像下面这样执行批处理插入:
01.ListString names = new ArrayListString(); ?
02.names.add(Fred); ?
03.names.add(Barney); ?
04.names.add(Betty); ?
05.names.add(Wilma); ?
06. ?
07.// 注意这里 ExecutorType.BATCH ?
08.SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); ?
09.try { ?
10. ?NameMapper mapper = sqlSession.getMapper(NameMapper.class); ?
11. ?for (String name : names) { ?
12. ? ?mapper.insertName(name); ?
13. ?} ?
14. ?sqlSmit(); ?
15.} finally { ?
16. ?sqlSession.close(); ?
17.} ?
?
4、如何获取自动生成的(主)键值?
?
insert 方法总是返回一个int值 - 这个值代表的是插入的行数。而自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。
示例:
01.insert id=ins
文档评论(0)