Mybatis 相关知识(一)
来源:互联网 发布:和讯网个股数据 编辑:程序博客网 时间:2024/05/16 16:08
1. #{…} 和 ${…}的区别
#{…}是占位符的形式,${}是拼接的方式
MyBatis将 #{…} 解释为JDBC prepared statement 的一个参数标记。而将 ${…} 解释为字符串替换。理解这两者的区别是很有用的, 因为在某些SQL语句中并不能使用参数标记(parameter markers)。
比如,我们不能在表名(table name)的位置使用参数标记。
假设有下面的代码:
01.Map<String, Object> parms = new HashMap<String, Object>(); 02.parms.put("table", "foo"); // 表名 03.parms.put("criteria", 37); // 查询过滤条件 04.List<Object> 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注入攻击的风险。另外,字符串替换在处理复杂类型也可能常常发生问题,如日期类型。由于这些因素,我们建议您尽可能地使用 #{…} 这种方式。
2、要使用LIKE语句该怎么写?
一共包含以下几种写法,但是由于所使用的数据库不同,并不是所有的方法都适合某种数据库,我们需要根据自己的开发环境进行筛选
(1)(推荐使用)第一种方法是,在Java代码中添加SQL通配符。
示例一:
01.String wildcardName = "%Smi%"; 02.List<Name> names = mapper.selectLike(wildcardName);
01.<select id="selectLike"> 02. select * from foo where bar like #{value} 03.</select>
不使用Java代码,直接使用占位符形式如下:”%”#{。。。}”%”,’%’||#{。。。}||’%’
第二种方式是在SQL语句中拼接通配符。这种方法相对来说安全性要低一些,因为可能会被SQL注入攻击。
示例二:
01.String wildcardName = "Smi"; 02.List<Name> names = mapper.selectLike(wildcardName);
01.<select id="selectLike"> 02. select * from foo where bar like '%' || '${value}' || '%' 03.</select>
不使用连接符||:’%${。。。}%’
第三种使用concat进行拼接:CONCAT(‘%’,#{。。。},’%’)
适合mysql数据库的方法:"%"#{。。。}"%"
,'%${。。。}%'
,CONCAT('%',#{。。。},'%')
适合Oracle数据库的方法:'%' || '${value}' || '%'
,'%'||#{。。。}||'%'
,CONCAT('%',#{。。。},'%')
重要提示: 请注意两种方式中 $ 和 # 的使用!
3、如何执行批量插入?
方法一:
首先,创建一个简单的insert语句:
01.<insert id="insertName"> 02. insert into names (name) values (#{value}) 03.</insert>
然后在Java代码中像下面这样执行批处理插入:
01.List<String> names = new ArrayList<String>(); 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. sqlSession.commit(); 15.} finally { 16. sqlSession.close(); 17.}
方法二:使用foreach拼接结果集
具体使用可以参考:http://blog.sina.com.cn/s/blog_6a0cd5e501011snl.html
4、如何获取自动生成的(主)键值?
insert 方法总是返回一个int值 - 这个值代表的是插入的行数。而自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。
示例:
01.<insert id="insertName" useGeneratedKeys="true" keyProperty="id"> 02. insert into names (name) values (#{name}) 03.</insert>
01.Name name = new Name(); 02.name.setName("Fred"); 03. 04.int rows = mapper.insertName(name); 05.// 完成后,id已经被设置到对象中 06.System.out.println("rows inserted = " + rows); 07.System.out.println("generated key value = " + name.getId());
5、在mapper中如何传递多个参数?
- 第一种方案
DAO层的函数
Public User selectUser(String name,String area);
对应的Mapper.xml
<select id="selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{0} and user_area=#{1}</select>
其中,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。
- 第二种方案
此方法采用Map传多参数.
Dao层的函数方法
Public User selectUser(Map paramMap);
对应的Mapper.xml
<select id=" selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR}</select>
Service层调用
Private User xxxSelectUser(){ Map paramMap=new hashMap(); paramMap.put(“userName”,”对应具体的参数值”); paramMap.put(“userArea”,”对应具体的参数值”); User user=xxx. selectUser(paramMap);}
个人认为此方法不够直观,见到接口方法不能直接的知道要传的参数是什么。
- 第三种方案
a的反射机制并不能让框架获取到参数的名字(方法签名中只有参数类型,可以说是为了优化,也可以说设计就是如此,总之名字无意义), 所以MyBatis默认的命名为: param1,param2……
如果想给他们指定名称,可以使用 @param 注解:
Dao层的函数方法
Public User selectUser(@param(“userName”)Stringname,@param(“userArea”)String area);
对应的Mapper.xml
<select id=" selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR}</select>
个人觉得这种方法比较好,能让开发者看到dao层方法就知道该传什么样的参数,比较直观,个人推荐用此种方案。
- Mybatis 相关知识(一)
- MyBatis 知识总结(一)
- mybatis知识汇总(一)
- mybatis知识翻译(一)
- mybatis相关知识
- Struts2相关知识(一)
- Java相关知识(一)
- 线程 相关知识 (一)
- dubbo相关知识(一)
- Maven相关知识(一)
- log4j知识相关(一)
- 生产排程相关知识(一)
- 计算机编码的相关知识(一)
- MySQL Binlog 相关知识(一)
- View相关知识学习(一)
- SQL Server数据库相关知识(一)
- 自定义View(一):相关知识
- Android屏幕相关知识(一)
- LINK : warning LNK4098: 默认库“LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
- JProfiler学习笔记
- spring3使用task注记及task:annotation-driven解决定时问题
- 关于jeesite的陷阱需要注意
- 补充:修改Myeclipse的servlet模板
- Mybatis 相关知识(一)
- JAVA STRING FORMAT 简介
- Eclipse开发Android程序引入第三方jar包的方法
- 常用sql语句
- 算法(二)—分治法Divide-and-conque
- UVA 494-Kindergarten Counting Game
- C++之常量与指针
- HDU 5318(The Goddess Of The Moon-矩阵乘法)[Template:矩阵]
- 九度OJ 题目1075:斐波那契数列