每天五个java相关面试题(2)

这次主要是mybatis部分的

1、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注入攻击的风险。另外,字符串替换在处理复杂类型也可能常常发生问题,如日期类型。由于这些因素,我们建议您尽可能地使用 #{…} 这种方式。

2、有两种使用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>  

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

3、如何执行批量插入?

首先,创建一个简单的insert语句:

01.<insert id="insertName">
02.  insert into names (name) values (#{value})
03.</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();
}  

4、如何获取自动生成的(主)键值?

答:

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());  

5、在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>  

版权声明:本文为博主原创文章,未经博主允许不得转载。请多多指教~

时间: 2024-10-10 02:45:47

每天五个java相关面试题(2)的相关文章

每天五个java相关面试题(1)--struts2部分

好啦 好啦.过不了多久我要参加社招啦,每天在博客更新五个java方面的面试题以及参考回答的答案. 最近先来框架部分. 首先是struts2: 开始! 1.Struts2工作机制? 答: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求: 2.这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin): 3.接着FilterD

每天五个java相关面试题(10)--java基础详解篇2

好勒好勒.一起加油 一.HashMap和Hashtable的区别. 答: HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable. HashMap允许将null作为一个entry的key或者value,而Hashtable不允许. HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey.因

每天五个java相关面试题(8)--spring篇

首先呢,假设有从事前端开发的大神或者准备从事前端开发的小伙伴无意看到我这篇博客看到这段文字欢迎加我的QQ:[ 845415745 ].即将走入社会的菜鸟大学生有关于前端开发的职业问题想请教或者一起探讨一下,谢谢谢谢. 今天依然不变的每日五个 1使用Spring框架的优点是什么? 答: 轻量: Spring 是轻量的,主要的版本号大约2MB. 控制反转: Spring通过控制反转实现了松散耦合,对象们给出它们的依赖.而不是创建或查找依赖的对象们. 面向切面的编程(AOP): Spring支持面向切

每天五个java相关面试题(6)

今天七夕节,苦逼的我还在写网页看面试题...早点看完睡觉拜拜啊 开始吧 1.forward 和 redirect 的区别 答: forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址. redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都

每天五个java相关面试题(4)

每天五个题咯 今天继续: 1. int和Integer有什么区别? 答: int是JAVA八大基本数据类型(byte,shor,int,long,char,boolean,float,double)之一. JAVA语言为八大基本数据提供了包装类,Integer对应是int类型的包装类,就是把int类型包装成Object对象. 2.DOM解析与SAX解析的不同? 答: SAX:只能读,不能修改,只能顺序访问,适合对大型的XML的解析,解析速度快! DOM:不仅能读,还能修改,而且能够实现随机访问,

每天五个java相关面试题(7)--线程篇

首先关于线程能够先看我之前这篇博文熟悉一下线程生命周期的图示以及文字说明 好開始了: 1.java 中有几种方法能够实现一个线程? 答:有两种实现方法.各自是继承 Thread类与实现Runnable接口. 1.线程类继承Thread类的语法: (public) class 类名 extends Thread{ public void run(){//这里写线程的内容}} 2.线程类实现java.lang.Runnable类的语法: (public) class 类名 implements Ru

每天五个java相关面试题(3)

1. Servlet的生命周期是什么? 答: 第一次请求: 构造方法->init() -> service() -> doGet()/doPost() 以后的请求:service() -> doGet()/doPost(); Servlet是单实例的. 2. 说出ArrayList,Vector, LinkedList的存储性能和特性HashMap和Hashtable的区别 答: ArrayList Vector:以数组的方式存储,增.删慢,查.改快 ArrayList:线程不安全

每天五个java相关面试题(5)--主要关于网络协议(重点)

今天主要是网络线程方面的,内容有点多慢慢记...但是是面试中非常重要的知识点.所以需要多加记忆和理解. 1.OSI七层模型,每一层的功能 (osi开放式系统接口) 答: 物理层:主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流(就是由1.0转化为电流强弱来进行传输,到达目的地后在转化为1.0,也就是我们常说的数模转换与模数转换).这一层的数据叫做比特. 数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问.这一层通

Java相关面试题总结

本文分为十九个模块,分别是: Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring Cloud.Hibernate.MyBatis.RabbitMQ.Kafka.Zookeeper.MySQL.Redis.JVM ,如下图所示: [Java基础] 1. JDK 和 JRE 有什么区别?2. == 和 equals 的区别是什么?3. 两个对象的 hashCode() 相同,则 equals