Mybatis基金会: 经常问的问题FAQ
Mybatis基金会: #{...} 和 ${...} 差额
MyBatis将 #{…} 解释为JDBC prepared statement 参数标记。而将 ${…} 解释为一个字符串替换。非常实用的, 由于在某些SQL语句中并不能使用參数标记(parameter markers)。
比方,我们不能在表名(table name)的位置使用參数标记。
如果有以下的代码:
Map<String, Object> parms = new HashMap<String, Object>();
parms.put("table", "foo"); // 表名
parms.put("criteria", 37); // 查询过滤条件
List<Object> rows = mapper.generalSelect(parms);
<select id="generalSelect" parameterType="map">
select * from ${table} where col1 = #{criteria}
</select>
MyBatis生成的SQL语句(prepared statement)例如以下所看到的:
select * from foo where col1 = ?
重要提示: 请注意,使用$ {…} (字符串替换)时可能会有SQL注入攻击的风险。
另外,字符串替换在处理复杂类型也可能经常发生故障,如日期类型。由于这些因素,我们建议您尽可能地使用 #{…} 这样的方式。
要使用LIKE语句该怎么写?
有两种使用LIKE的方法。(推荐使用)第一种方法是,在Java代码中加入SQL通配符。
演示样例一:
String wildcardName = "%Smi%";
List<Name> names = mapper.selectLike(wildcardName);
<select id="selectLike">
select * from foo where bar like #{value}
</select>
另外一种方式是在SQL语句中拼接通配符。
这样的方法相对来说安全性要低一些,由于可能会被SQL注入攻击。
演示样例二:
String wildcardName = "Smi";
List<Name> names = mapper.selectLike(wildcardName);
<select id="selectLike">
select * from foo where bar like '%' || '${value}' || '%'
</select>
重要提示: 请注意两种方式中 $ 和 # 的使用!
怎样运行批量插入?
首先,创建一个简单的insert语句:
<insert id="insertName">
insert into names (name) values (#{value})
</insert>
然后在Java代码中像以下这样运行批处理插入:
List<String> names = new ArrayList<String>();
names.add("Fred");
names.add("Barney");
names.add("Betty");
names.add("Wilma"); // 注意这里 ExecutorType.BATCH
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
NameMapper mapper = sqlSession.getMapper(NameMapper.class);
for (String name : names) {
mapper.insertName(name);
}
sqlSession.commit();
} finally {
sqlSession.close();
}
怎样获取自己主动生成的(主)键值?
insert 方法总是返回一个int值 - 这个值代表的是插入的行数。而自己主动生成的键值在 insert 方法运行完后能够被设置到传入的參数对象中。
演示样例:
<insert id="insertName" useGeneratedKeys="true" keyProperty="id">
insert into names (name) values (#{name})
</insert>
Name name = new Name();
name.setName("Fred"); int rows = mapper.insertName(name);
// 完毕后,id已经被设置到对象中
System.out.println("rows inserted = " + rows);
System.out.println("generated key value = " + name.getId());
在mapper中怎样传递多个參数?
Java的反射机制并不能让框架获取到參数的名字(方法签名中仅仅有參数类型,能够说是为了优化,也能够说设计就是如此,总之名字无意义), 所以MyBatis默认的命名为: param1,param2……
如果想给他们指定名称,能够使用 @param 注解:
import org.apache.ibatis.annotations.Param;
public interface UserMapper {
User selectUser(@Param("username") String username,
@Param("hashedPassword") String hashedPassword);
}
然后,就能够在xml像以下这样使用(推荐封装为一个Map,作为单个參数传递给Mapper):
<select id=”selectUser” resultType=”User”>
select id, username, hashedPassword
from some_table
where username = #{username}
and hashedPassword = #{hashedPassword}
</select>
原文链接: What is the difference between #{...} and ${...}?
原始日期: 2013-11-10
翻译日期: 2014-09-28
翻译者: 锚的
Mybatis基金会: 经常问的问题FAQ的更多相关文章
- Mybatis经常被问到的面试题
1. #{}和${}的区别是什么? #{}是预编译处理,${}是字符串替换. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值: ...
- 整合最优雅SSM框架:SpringMVC + Spring + MyBatis
我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...
- 最优雅SSM框架:SpringMVC + Spring + MyBatis
在写代码之前我们先了解一下这三个框架分别是干什么的? 相信大以前也看过不少这些概念,我这就用大白话来讲,如果之前有了解过可以跳过这一大段,直接看代码! SpringMVC:它用于web层,相当于con ...
- 手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis
在写代码之前我们先了解一下这三个框架分别是干什么的? 相信大以前也看过不少这些概念,我这就用大白话来讲,如果之前有了解过可以跳过这一大段,直接看代码! SpringMVC:它用于web层,相当于con ...
- SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)
1. 前言 最近在写毕设过程中,重新梳理了一遍SSM框架,特此记录一下. 附上源码:https://gitee.com/niceyoo/jeenotes-ssm 2. 概述 在写代码之前我们先了解一下 ...
- 整合最优雅SSM框架:SpringMVC + Spring + MyBatis 基础
在写代码之前我们先了解一下这三个框架分别是干什么的? 相信大以前也看过不少这些概念,我这就用大白话来讲,如果之前有了解过可以跳过这一大段,直接看代码! SpringMVC:它用于web层,相当于con ...
- 一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程重要
前言 SSM(Spring+SpringMVC+Mybatis)是目前较为主流的企业级架构方案,不知道大家有没有留意,在我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教 ...
- PHP连接sql server 2005环境配置
一.Windows下PHP连接SQLServer 2005 设定:安装的Windows操作系统(Win7 或XP均可.其它系统暂未測试),在C盘下:PHP的相关文件位于c:/PHP以下,其配置文件ph ...
- 手把手教你 基础 整合最优雅SSM框架:SpringMVC + Spring
我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...
随机推荐
- Easyui 异步树直接所有展开
初始化异步树直接所有展开代码: $(function(){ $('#tt').tree({ url:'<%=request.getContextPath()%>/treeInit', li ...
- AC自己主动机 总结
模板--参考六如家培训指南 /*===============================*\ 依照训练指南写的 \*===============================*/ #incl ...
- ZOJ 3734 LIKE vs CANDLE
题目意思:(13年长沙站的一道水DP,本人也去了,当时太水笔) 说俩个人竞争选票,每个人可以随机选择支持谁.每个人带有权重不同. 现在已经结束了投票阶段,你一个骇客 支持LIKE 你写了一个软件可以 ...
- quick 2.23 它们的定义c++代码lua与总结的一些细节
它们的定义c++代码lua与总结的一些细节 参考:点击打开链接 1.自己定义 XXX.cpp .XXX.h 2.D:\quick\quick-cocos2d-x-2.2.3-rc\lib\cocos2 ...
- TCP和UDP的差别
简单的差别: TCP提供面向连接的.可靠的数据流传输,而UDP提供的是非面向连接的.不可靠的数据流传输. TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报. TCP注重数据安全性,UDP传 ...
- 最常用的动态sql语句梳理Mybatis(转)
公司项目中一直使用Mybatis作为持久层框架,自然,动态sql写得也比较多了,最常见的莫过于在查询语句中使用if标签来动态地改变过滤条件了.Mybatis的强大特性之一便是它的动态sql,免除了拼接 ...
- Android Stuido怎样查看快捷键冲突?
看了这篇文章Android Studio怎样查看资源或者函数在哪些类中被引用.知道了快捷键失效的原因,当中有一个原因就是快捷键冲突.那怎样查看快捷键哪些项冲突了呢? Android Studio要查看 ...
- 一个不错的 png压缩工具 pngquant 使用介绍 批量压缩png
1.Png 简介. 我们知道Png 有4个通道,RGBA, 多了一个表示透明的.png 有 png 32, 24, 8 等. 大致我理解的是表示颜色的多少. 数字越小,文件就越小.常见的压缩方式是导入 ...
- 手提wifi双卡配置+window7同时多用户远程+有些公司限制网络环境方案
该公司只提供几台机器,同时限制并连接到内部办公网络的机, 我们更多的临时工作人员,项目紧张,而另一种是太麻烦了申请, 当被问及其他网络管理,说没有变通方法. 在我的尝试,最后,找到一个解决方案; 解决 ...
- MAC随机修改批处理
原文:MAC随机修改批处理 @echo off mode con cols=70 lines=20 title MAC随机修改工具 color 3F setlocal enabledelayedexp ...