秋招面试题系列- - -Java工程师(三)

简介: 秋招面试题系列- - -Java工程师(三)

MyBatis面试题


11、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。


第二种是使用 sql列的别名功能,将列的别名书写为对象属性名。


有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。


12、如何执行批量插入?

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

id=”insertname”>
insert into names (name) values (#{value})

然后在 java代码中像下面这样执行批处理插入:

list < string > names = new arraylist();
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();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
throw e;
}
finally {
sqlsession.close();}

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

insert方法总是返回一个 int值,这个值代表的是插入的行数。

如果采用自增长策略,自动生成的键值在 insert方法执行完后可以被设置到传入的参数对象中。

示例:

id=”insertname” usegeneratedkeys=”true” keyproperty=”
id”>
insert into names (name) values (#{name})
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());

14、在 mapper中如何传递多个参数?

1、第一种:

DAO层的函数


publicUserselectUser(Stringname,Stringarea);


对应的 xml,#{0}代表接收的是 dao层中的第一个参数,#{1}代表 dao层中第二参数,更多参数一致往后加即可。

id="selectUser"resultMap="BaseResultMap">
select * fromuser_user_t whereuser_name = #{0}anduser_area=#{1}

2、第二种:使用@param

注解:

public interfaceusermapper{
user selectuser(@param(“username”) string
username,@param(“hashedpassword”) string hashedpassword);}

然后,就可以在 xml像下面这样使用(推荐封装为一个 map,作为单个参数传递给mapper):

id=”selectuser” resulttype=”user”>
select id, username, hashedpassword
from some_table
where username = #{username}
and hashedpassword = #{hashedpassword}

3、第三种:多个参数封装成 map

try{
//由于我们的参数超过了两个,而方法中只有一个 Object参数收集,因此我们使用 Map集合来装载我们的参数
MapString,Object>map= newHashMap();
map.put("start", start);
map.put("end", end);
returnsqlSession.selectList("StudentID.pagination", map);
}catch(Exception e) {
e.printStackTrace();
sqlSession.rollback();
throwe;
}finally{
MybatisUtil.closeSqlSession();

15、Mybatis动态 sql有什么用?执行原理?有哪些动态 sql?

Mybatis动态 sql可以在 Xml映射文件内,以标签的形式编写动态 sql,执行原理是根据表达式的值完成逻辑判断并动态拼接 sql的功能。


Mybatis提供了 9种动态 sql标签:trim | where | set | foreach | if | choose| when | otherwise | bind。

相关文章
|
8天前
|
Java
Java面向对象实践小结(含面试题)(下)
Java面向对象实践小结(含面试题)(下)
20 1
|
8天前
|
设计模式 Java
Java面向对象实践小结(含面试题)(上)
Java面向对象实践小结(含面试题)
13 1
|
10天前
|
JavaScript 前端开发 Java
【JAVA面试题】什么是引用传递?什么是值传递?
【JAVA面试题】什么是引用传递?什么是值传递?
|
10天前
|
Java 程序员
【JAVA面试题】基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?
【JAVA面试题】基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?
|
10天前
|
Java
【JAVA面试题】什么是深拷贝?什么是浅拷贝?
【JAVA面试题】什么是深拷贝?什么是浅拷贝?
|
12天前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
12天前
|
Java
[Java 面试题] ArrayList篇
[Java 面试题] ArrayList篇
|
12天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
39 1
|
12天前
|
监控 Java 测试技术
面试准备不充分,被Java守护线程干懵了,面试官主打一个东西没用但你得会
面试准备不充分,被Java守护线程干懵了,面试官主打一个东西没用但你得会
22 1
|
12天前
|
Java
Java面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有1种
Java面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有1种
19 1