Mybatis 的常见面试题

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

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

#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。

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

第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种: 通过<resultMap>来映射字段名和实体类属性名的一一对应的关系 
    <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 = “ordernocolumn =”order_no”/> 
        <result property=”price” column=”order_price” /> 
    </reslutMap>

3、 模糊查询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>

4、通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象。

Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

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

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

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

答:第一种是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。

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

7、如何执行批量插入?

首先,创建一个简单的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(); 
    } finally { 
     sqlsession.close(); 
    }

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

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

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

第1种:
//DAO层的函数

Public UserselectUser(String name,String area);  
//对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。

<select id="selectUser"resultMap="BaseResultMap">  
    select *  fromuser_user_t   whereuser_name = #{0} anduser_area=#{1}  
</select>  
第2种:    使用 @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>

10、Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。
Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。
其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

11、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。

原因就是namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

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

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

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

<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>  
MyBatis常见面试题 /动态代理原则Id和方法名相同,id是不允许重载的//1.动态代理的返回值要和sqlMapper中的resultType一致//2.接口中的入参要和sqlMapper中的parmameterType一致//3.接口中的方法名要和sqlMapper中的id一致(dao层不允许写方法的重载)//4.sqlMapper中的namespace指向接口的类路径//5.接口要和sqlMapper同包//6.接口要和sqlMapper同名1. 阅读详情

相关推荐

Mybatis经典面试题汇总

一、什么是Mybatis? 1. Mybatis是一个半orm(对象映射)框架,它内部封装了JDBC,开发时只需要关注SQL的本身,不需要 加载驱动、创建连接、写statement的过程,程序员直接编写原生的sql,灵活性高。 2. Mybatis可以使用XML 或注解来配置和映射原生信息,将POJO映射成数据库的记录(对象的属性字段),避免了所有JDBC代码和手动设置参数以及...

Dream_it_possible!的博客 2万+

MyBatis最经典的20道面试题,你都会了吗?

MyBatis是一款优秀的持久层框架,在Java开发中广受欢迎。下面是一些常见MyBatis面试题,以及相应的案例分析,希望对你的学习和面试有所帮助。MyBatis是一款基于Java的持久层框架,它通过XML描述符或注解将对象与存储过程或SQL语句进行映射,实现了面向对象编程与关系数据库的映射。动态SQL是MyBatis中的一项强大功能,它可以根据条件判断动态拼接SQL语句,避免硬编码。例如,动态SQL可以在条件成立时插入WHERE子句:

私聊前往站内信:https://i.csdn.net/#/msg/chat/weixin_44976692 3万+

2021年MyBatis面试题30道

文章目录前言面试题系列文章传送门MyBatis面试题内容1. 模糊查询like语句该怎么写?2. MyBatis 框架适用场合?3. MyBatis是如何进行分页的?分页插件的原理是什么?4. Dao 接口里的方法,参数不同时,方法能重载吗?5. MyBatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?6. Mybaits 的优缺点?7. 谈谈你对MyBatis的理解?8. MyBatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?9. #{}和${}的区别是什么?

码农阿斌的博客 1万+

MyBatis常见面试题汇总(超详细回答)

java面试相关,MyBatis常见面试题汇总

qq_33129875的博客 3万+

Mybatis常见面试题总结

1、什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。 (2)MyBatis 可以使用XML 或注解来配置和映射原生信息,将POJO映射成数据库中的记录,避免了几乎所...

张维鹏的博客 61万+

Mybatis常见面试题

Mybatis常见面试题 #{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是预编译处理,${}是字符串替换。 使用#{}可以有效的防止SQL注入,提高系统安全性。 当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 当实体类中的属性名和表中的字段名不一样 ,怎么办...

cowbin2012的专栏 1万+

Spring和MyBatis常见面试题总结

Before(前置通知):目标对象的方法调用之前触发After(后置通知):目标对象的方法调用之后触发(返回通知):目标对象的方法调用完成,在返回结果值之后触发(异常通知):目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。Around(环绕通知):编程式控制目标对象的方法调用。

夏日 の blog 3094

MyBatis常见的概念性面试题汇总

@MyBatis概念性面试题整理 MyBatis常见的概念性面试题 一、概念性填空题 1、#{}和$ {}的区别是什么?#{}是_____,${}是_____。 2、四个核心接口是()用于执行CRUD操作、()处理SQL的参数、()处理返回结果集、()用于执行SQL语句。 3、MyBatis中提供了一级缓存和二级缓存,其中()默认存在,不可控制,同一SqlSession范围内的操作共享该缓存,增、...

Dokikilililiya 4200

MyBatis-常见面试题-总结

注:我出的答:虽然 MyBatis 解析 xml 映射文件是按照顺序解析的,但是,被引用的 B 标签依然可以定义在任何地方,MyBatis 都可以正确识别。原理是,MyBatis 解析 A 标签,发现 A 标签引用了 B 标签,但是 B 标签尚未解析到,尚不存在,此时,MyBatis 会将 A 标签标记为未解析状态,然后继续解析余下的标签,包含 B 标签,待所有标签解析完毕,MyBatis 会重新解析那些被标记为未解析的标签,此时再解析 A 标签时,B 标签已经存在,A 标签也就可以正常解析完成了。

Java程序员的知识博客 1274

mybatis常见面试题

Mybatis常见面试题 1、#{}和${}的区别是什么? 是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如{}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如{driver}会被静态替换为com.my...

你就像甜甜的益达 6047

MyBatis 常见的十个面试题以及详细解释!

解释:MyBatis 的 Mapper 接口是没有实现代码的接口,通过 XML 或注解的方式与 SQL 语句关联。当你调用接口方法时,MyBatis 会使用 JDK 动态代理为 Mapper 接口生成代理对象,代理对象会拦截接口方法,转换为执行 SQL 语句的操作。下面是 MyBatis 常见的十个面试题以及详细解释,并在适当的情况下提供代码和注释来进行说明。{}` 是字符串替换,MyBatis 将直接将替换变量的值进行拼接操作,如果是用户输入的内容,可能导致 SQL 注入安全问题。用户可以创建自定义的。

飞迪 621

4-MyBatis常见面试题

MyBatis提供了一级缓存和二级缓存。一级缓存(SqlSession级别的缓存)是默认开启的,它是基于SqlSession对象的。当在同一个SqlSession中执行相同的SQL语句时,MyBatis会直接从缓存中获取结果,而不会再次发送SQL语句到数据库。例如,在一个SqlSession中先查询一次用户信息,然后再次查询相同用户信息时,第二次查询会直接从缓存中获取数据。但是,当SqlSession执行了插入、更新或删除操作后,会清空一级缓存,因为这些操作可能会导致数据的改变。

weixin_36873225的博客 1222

MyBatis 常见面试题有哪些?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。延迟加载的原理的是调用的时候触发加载,而不是在初始化的时候就加载信息。比如调用 a. getB(). getName(),这个时候发现 a. getB() 的值为

m0_57290404的博客 1615

mybatis 插入返回id_27 个 Mybatis 常见面试题总结及答案

Java社区回复【520社区】领取500G资源今年预计 7 月份会引来大招聘,建议要面试的朋友,多看一下面试题,做到心中有数。今天整理了 27 个 Mybatis 常见面试题总结及答案送给大家!1、什么是Mybatis?1、Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement...

weixin_39692847的博客 119

30.MyBatis常见面试题有哪些?

MyBatis框架的面试中,面试官通常会问一些关于MyBatis的基本概念、配置、使用和性能优化等方面的问题。

ADbyCool的博客 483

##待写【MyBatis面试】10道不得不会的MyBatis常见面试题

作为后端开发工程师,MyBatis 几乎人人都要涉及到,这里10道必会面试题。 以下都是 MyBatis 常见面试题,相信大家都会有种及眼熟又陌生的感觉、看过可能在短暂的面试后又马上忘记了。JavaPub 在这里整理这些容易忘记的重点知识及解答,建议收藏,经常温习查阅。 文章目录1. #{}和${}的区别是什么? 1. #{}和${}的区别是什么? 最常见的一道题 #{}是预编译处理,${}是字符串替换。 当然是预编译处理更安全,使用#{}可以有效的防止SQL注入,提高系统安全性。 ...

JavaPub 739

27 个 Mybatis 常见面试题总结及答案

编辑:业余草来源:https://www.xttblog.com/?p=4877今年预计 4 月份会引来大招聘,清明节前,建议要面试的朋友,多看一下面试...

xmt1139057136的专栏 592
上一篇: hibernate 一级缓存、一级缓存快照区、二级缓存
下一篇: Lucene 搜索方式
eaphy
博客等级 码龄11年 245粉丝 83原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值