2022年Java备战秋招,程序员求职必看的Mybatis面试题

181

前言

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

小编分享的这份2022年Java秋招备战面试题总计有1000多道面试题,包含了MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Java 并发编程、Java基础、Spring、微服务、Linux、Spring Boot 、Spring Cloud、RabbitMQ、kafka等16个专题技术点,都是小编在今年金三银四总结出来的面试真题,已经有很多粉丝靠这份PDF拿下众多大厂的offer,今天在这里总结分享给到大家!【已完结】

序号专题技术内容地址
1MyBatisMybatis面试题juejin.cn/post/711014…
2ZooKeeperZooKeeper面试题juejin.cn/post/711126…
3DubboDubbo面试题juejin.cn/post/711355…
4ElasticsearchElasticsearch 面试题juejin.cn/post/711540…
5MemcachedMemcached面试题juejin.cn/post/711903…
6RedisRedis 面试题juejin.cn/post/711903…
7MySQLMySQL 面试题juejin.cn/post/711903…
8Java并发编程Java并发编程面试题juejin.cn/post/711903…
9Java基础Java基础面试题juejin.cn/post/711903…
10SpringSpring面试题juejin.cn/post/711904…
11微服务微服务面试题juejin.cn/post/711904…
12LinuxLinux面试题juejin.cn/post/711904…
13Spring BootSpring Boot面试题juejin.cn/post/711904…
14Spring CloudSpring Cloud面试题juejin.cn/post/711904…
15RabbitMQRabbitMQ面试题juejin.cn/post/711904…
16kafkakafka面试题juejin.cn/post/711904…

1、什么是Mybatis?

2、Mybaits的优点:

3、MyBatis框架的缺点:

4、MyBatis框架适用场合:

5、MyBatis与Hibernate有哪些不同?

6、#{}和${}的区别是什么?

7、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第 1 种: 通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类 的属性名一致。

<select id=”selectorder” parametertype=”int” resultetype=”
me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price form
orders where order_id=#{id};
</select>

第 2 种: 通过来映射字段名和实体类属性名的一一对应的关系

<select id="getOrder" parameterType="int"
resultMap="orderresultmap">
select * from orders where order_id=#{id}
</select>
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
<!–用 id 属性来映射主键字段–>
<id property=”id” column=”order_id”>
<!–用 result 属性来映射非主键字段,property 为实体类属性名,column
为数据表中的属性–>
<result property = “orderno” column =”order_no”/>
<result property=”price” column=”order_price” />
</reslutMap>

8、 模糊查询like语句该怎么写?

**第 1 种:**在 Java 代码中添加 sql 通配符。

string wildcardname = “%smi%”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like #{value}
</select>

**第 2 种:**在 sql 语句中拼接通配符,会引起 sql 注入

string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like "%"#{value}"%"
</select>

9、通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?

10、Mybatis是如何进行分页的?分页插件的原理是什么?

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

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

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

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

12、如何执行批量插入?

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

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

然后在 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、如何获取自动生成的(主)键值?

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

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

try {
//映射文件的命名空间.SQL 片段的 ID,就可以调用对应的映射文件中的
SQL
//由于我们的参数超过了两个,而方法中只有一个 Object 参数收集,因此
我们使用 Map 集合来装载我们的参数
Map < String, Object > map = new HashMap();
map.put("start", start);
map.put("end", end);
return sqlSession.selectList("StudentID.pagination", map);
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
throw e;
} finally {
MybatisUtil.closeSqlSession();
}

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

16、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有什么?

18、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

19、 一对一、一对多的关联查询 ?

<mapper namespace="com.lcb.mapping.userMapper">
<!--association 一对一关联查询 -->
<select id="getClass" parameterType="int"
resultMap="ClassesResultMap">
select * from class c,teacher t where c.teacher_id=t.t_id and
c.c_id=#{id}
</select>
<resultMap type="com.lcb.user.Classes" id="ClassesResultMap">
<!-- 实体类的字段名和数据表的字段名映射 -->
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher"
javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>
<!--collection 一对多关联查询 -->
<select id="getClass2" parameterType="int"
resultMap="ClassesResultMap2">
select * from class c,teacher t,student s where c.teacher_id=t.t_id
and c.c_id=s.class_id and c.c_id=#{id}
</select>
<resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher"
javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
<collection property="student"
ofType="com.lcb.user.Student">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
</collection>
</resultMap>
</mapper>

20、MyBatis实现一对一有几种方式?具体怎么操作的?

21、MyBatis实现一对多有几种方式,怎么操作的?

22、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

23、Mybatis的一级、二级缓存:

24、什么是MyBatis的接口绑定?有哪些实现方式?

25、使用MyBatis的mapper接口调用时有哪些要求?

26、Mapper编写有哪几种方式?

**第一种:**接口实现类继承 SqlSessionDaoSupport:使用此种方法需要编写 mapper 接口,mapper 接口实现类、mapper.xml 文件。

第二种:使用 org.mybatis.spring.mapper.MapperFactoryBean:

1、在 sqlMapConfig.xml 中配置 mapper.xml 的位置,如果 mapper.xml 和 mappre 接口的名称相同且在同一个目录,这里可以不用配置

<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>

2、定义 mapper 接口:

1、mapper.xml 中的 namespace 为 mapper 接口的地址

2、mapper 接口中的方法名和 mapper.xml 中的定义的 statement 的 id 保持一 致

3、Spring 中定义

<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper 接口地址" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

第三种:使用 mapper 扫描器:

4、使用扫描器后从 spring 容器中获取 mapper 的实现对象

27、简述Mybatis的插件运行原理,以及如何编写一个插件。