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


    前言

    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,今天在这里总结分享给到大家!【持续更新中!】

    序号 专题技术 内容 地址
    1 MyBatis 2022年Java备战秋招,程序员求职必看的Mybatis面试题
    2 ZooKeeper 2022年Java备战秋招,程序员求职必看的ZooKeeper面试题

    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的插件运行原理,以及如何编写一个插件。

  • 相关阅读:
    边缘提取二—实例 行远
    Exp2后门原理与实践
    Exp3免杀原理
    PostgreSQL 查询被锁阻塞的连接
    PostgreSQL中的数组与Any
    [Contest on 2022.4.12] 我又来水博客了
    2022 省选游记
    [省选联考 2020 A 卷] 组合数问题
    [学习笔记] 斯特林数
    LOJ 6515 「雅礼集训 2018 Day10」贪玩蓝月
  • 原文地址:https://www.cnblogs.com/QLCZ/p/16387162.html
Copyright © 2020-2023  润新知