转自:http://www.cnblogs.com/huajiezh/p/6415322.html

1、Mybatis基础: #{...} 和 ${...} 的区别
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注入攻击的风险。另外,字符串替换在处理复杂类型也可能常常发生问题,如日期类型。由于这些因素,我们建议您尽可能地使用 #{…} 这种方式。
要使用LIKE语句该怎么写?


2、有两种使用LIKE的方法。(推荐使用)第一种方法是,在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>

第二种方式是在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>

重要提示: 请注意两种方式中 $ 和 # 的使用!

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.}


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中如何传递多个参数?
Java的反射机制并不能让框架获取到参数的名字(方法签名中只有参数类型,可以说是为了优化,也可以说设计就是如此,总之名字无意义), 所以MyBatis默认的命名为: param1,param2……
如果想给他们指定名称,可以使用 @param 注解:
01.import org.apache.ibatis.annotations.Param;  
02.public interface UserMapper {  
03.   User selectUser(@Param("username") String username,   
04.                   @Param("hashedPassword") String hashedPassword);  
05.}

然后,就可以在xml像下面这样使用(推荐封装为一个Map,作为单个参数传递给Mapper):
01.<select id=”selectUser” resultType=”User”>  
02.  select id, username, hashedPassword  
03.  from some_table  
04.  where username = #{username}  
05.  and hashedPassword = #{hashedPassword}  
06.</select>

MyBatis基础面试题的更多相关文章

  1. SSM(Spring + Springmvc + Mybatis)框架面试题

    JAVA SSM框架基础面试题https://blog.csdn.net/qq_39031310/article/details/83050192 SSM(Spring + Springmvc + M ...

  2. 经典的Java基础面试题集锦

    经典的Java基础面试题集锦,欢迎收藏和分享. 问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示”main方法不是public的”. 问题:Java里的传引用 ...

  3. [Unity3D]上海某大型游戏公司的基础面试题

    一个小老乡跟我聊到去上海某大公司的基础面试题,面试结果不尽如人意,但还是分享了下面试的试题,刚刚第一次录制视频,给某人讲课,我感觉讲的还算比较耐心,但发现一些新手入门学习的弊端,可能是很普遍的现象,这 ...

  4. Android开发面试经——3.常见Java基础笔试题

      Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...

  5. Android开发面试经——2.常见Android基础笔试题

     标签: androidAndroid基础Android面试题Android笔试题 2015-03-12 15:04 3361人阅读 评论(3) 收藏 举报  分类: Android开发(29)  版 ...

  6. 非常全面的java基础笔试题

    下面是java基础笔试题,当时我去笔试,做了1个小时(80道选择题,后面的简答题就没时间做了),结果很吓人,太挫了,最后被面试官忽悠去培训去了,呵呵.我偷偷把面试题弄了下来,用来学习吧,也希望能对你们 ...

  7. 几道php基础面试题

    前言 昨晚实验室一师弟在微薄上@我,给我发了几道php的基础面试题,这里把我写的答案贴出来 题目 (1)写一个函数获取URL的文件后缀,例如“http://www.feiyan.info/test.p ...

  8. myBatis 基础测试 表关联关系配置 集合 测试

    myBatis 基础测试 表关联关系配置 集合 测试 测试myelipse项目源码 sql 下载 http://download.csdn.net/detail/liangrui1988/599388 ...

  9. Java基础机试题

    package day8;import java.util.Scanner;/** * Java基础机试题 * @author:lyrand * */public class convert {   ...

随机推荐

  1. GUI学习之十七——QDoubleSpinBox学习总结

    在上一章我总结了QSpinBox的使用方法,QSpinBox是用来操作整数或离散集合的,还有另外一种控件是用来操作浮点类数据的,就是QDoubleSpinBox. 一.描述 QDoubleSpinBo ...

  2. Git之旅(1):安装git

    一.在windows中安装git git官网:https://git-scm.com/downloads 二.在centos系统安装git 2.1 配置base源和epel源 # cat /etc/y ...

  3. 安装suds,提示No module named 'client'

    最近在研究webservice,但是在线安装suds的时候提示No module named 'client' 提示没有client模块,提示这个错误主要还是因为没有安装client模块 在线安装cl ...

  4. 组件通信 Provide&&inject

    在父组件中利用Provide 注入数据,在所有的子组件都可以拿到这个数据 可以在vue 中用来刷新页面 <!DOCTYPE html> <html lang="en&quo ...

  5. quartz 时间配置

    Quartz中时间表达式的设置-----corn表达式 (注:这是让我看比较明白的一个博文,但是抱歉,没有找到原作者,如有侵犯,请告知) 时间格式: <!-- s m h d m w(?) y( ...

  6. Jdbc连接数据库基本步骤详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 Jdbc连接数据库的基本步骤,供大家参考,具体内容如下 package demo.jdbc; import java.s ...

  7. Centos7 离线安装 php7

    问题:因内部管控,机器无法连接公有yum源安装php. 正常安装php7可以参考CentOS7.2 安装 PHP7.2 下面的代码也是一种方法 yum -y install libmcrypt lib ...

  8. Linux新增用户,并设置Root(管理员)权限

    在使用Linux过程中,Root账号拥有最大的操作权限.为保证Root账号安全,一般不直接使用Root账号,而是直接创建一个拥有Root权限的其它账号来使用.详细操作步骤如下 第一步,创建用户,如下图 ...

  9. 快速构建Spring Cloud工程

    spring cloud简介 spring cloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行环境 ...

  10. 微信小程序image组件

    image组件:是小程序专门针对图片的组件,功能强大 image组件的属性: src:类型 字符串 图片资源的路径 mode:类型 字符串 图片裁剪缩放模式 lazy-load:类型 布尔 图片的懒加 ...