前言:七月末八月初的时候,秋招正式打响,公司会放出大量的全职和实习岗位。为了帮助秋招的小伙伴们,学长这里整理了一系列的秋招面试题给大家,所以小伙伴们不用太过焦虑,相信你们一定能超常发挥,收到心仪公司的Offer~~
内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux等技术栈
推荐秋招专栏:

目录
11、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
15、Mybatis动态 sql有什么用?执行原理?有哪些动态 sql?
第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用 sql列的别名功能,将列的别名书写为对象属性名。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
首先,创建一个简单的 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();}
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());
DAO层的函数
publicUserselectUser(Stringname,Stringarea);
对应的 xml,#{0}代表接收的是 dao层中的第一个参数,#{1}代表 dao层中第二参数,更多参数一致往后加即可。
- id="selectUser"resultMap="BaseResultMap">
-
- select * fromuser_user_t whereuser_name = #{0}anduser_area=#{1}
注解:
- 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}
- 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();
Mybatis动态 sql可以在 Xml映射文件内,以标签的形式编写动态 sql,执行原理是根据表达式的值完成逻辑判断并动态拼接 sql的功能。
Mybatis提供了 9种动态 sql标签:trim | where | set | foreach | if | choose| when | otherwise | bind。