MyBatis详细面试题以及答案

article/2025/10/27 13:25:57

一,什么是MyBatis?

1,MyBatis是一个ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动,创建连接,创建statement等复杂的过程。程序员不需要编写原生态sql,可以严格控制sql执行性能,灵活度高

2,MyBatis可以使用xml或者注解来配置映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置的参数以及获取结果集

二,MyBatis的优点

1,基于SQL语句编程,相对灵活,接触sql与程序代码的藕合,便于统一管理,支持写动态sql语句并可重复使用

2,减少代码量,消除了冗余代码,

3,数据库兼容能够与Spring集成

4,提供映射标签支持字段关系映射

三, MyBatis框架的缺点

1,工作量较大,字段多,关联表多

2,数据库移植性差      

四、MyBatis 框架适用场合

1,DAO层解决方案

2,对性能的要求高,或者需求量变化较多的项目

五,MyBatis 与 Hibernate 有哪些不同?

1,MyBatis它不完全是一个ORM框架,因为MyBatis需要程序员自己编写sql语句

2,MyBatis直接编写sql语句,sql执行性能,灵活度高,适合对关系数据模式要求不高的软件开发,MyBatis无法做到数据库无关性

3,Hibernate 数据库无关性好,对于关系模式要求高的软件

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

1,#{}预编译处理,${}是字符串替换

2,#{}防止SQL注入,提高系统安全性

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

第一种:通过查询的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>

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

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

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

<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>

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

Dao 接口即 Mapper 接口。接口的全限名,就是映射文件中的 namespace 的值; 接口的方法名,就是映射文件中 Mapper 的 Statement 的 id 值;接口方法内的 参数,就是传递给 sql 的参数。 Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符 串作为 key 值,可唯一定位一个 MapperStatement。在 Mybatis 中,每一个 、、、标签,都会被解析为一个 MapperStatement 对象。

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

Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内 存分页,而非物理分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分 页功能,也可以使用分页插件来完成物理分页。 分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件 的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物 理分页语句和物理分页参数。

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

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

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

十二,如何执行批量插入

首先创建一个简单的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();
}

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

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

十四、在 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注解:

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>

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

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

Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql

执行原理是根据表达式的值 完全逻辑判断并动态sql的功能

Mybatis提供了9中动态sql标签:trim | where | set | foreach | if  |choose | when | otherwise|bind
十六,一对一、一对多的关联查询 ?

<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>


http://chatgpt.dhexx.cn/article/8n3jW4Ns.shtml

相关文章

【2022最新Java面试宝典】—— MyBatis面试题(37道含答案)

目录 一、MyBatis简介1. MyBatis是什么&#xff1f;2. Mybatis优缺点3. Hibernate 和 MyBatis 的区别4. 为什么说Mybatis是半自动ORM映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;5. 传统JDBC开发存在什么问题&#xff1f;6. JDBC编程有哪些不足之处&#xff0c;MyB…

MyBatis常见面试题

目录 一、使用方面的问题 1、什么是MyBatis&#xff1f; 2、为什么说MyBatis是半ORM框架&#xff1f;与Hibernate有哪些不同&#xff1f; 3、MyBatis的优缺点&#xff1a;略 4、#{ } 和 ${ } 的区别是什么&#xff1f; 5、MyBatis是怎么解决实体类中的属性名和表中的字段…

【2022最新版】MyBatis面试题总结(38道题含答案解析)

文章目录 1、什么是Mybatis&#xff1f;2、Mybaits的优点&#xff1f;3、MyBatis框架的缺点&#xff1f;4、MyBatis框架适用场合5、MyBatis与Hibernate有哪些不同&#xff1f;6、#{} 和${}的区别是什么&#xff1f;7、当实体类中的属性名和表中的字段名不一样&#xff0c;怎么办…

MyBatis面试题总结

啃下MyBatis源码系列目录 啃下MyBatis源码 - 为什么要看MyBatis源码及源码结构 啃下MyBatis源码 - org.apache.ibatis.logging包源码分析 啃下MyBatis源码 - org.apache.ibatis.datasource包源码分析 啃下MyBatis源码 - org.apache.ibatis.cache包源码分析 啃下MyBatis源码 - M…

MyBatis 面试题(附答案解析)

MyBatis的实现逻辑 在 MyBatis 的初始化过程中&#xff0c;会生成一个 Configuration 全局配置对象&#xff0c;里面包含了所有初始化过程中生成对象根据 Configuration 创建一个 SqlSessionFactory 对象&#xff0c;用于创建 SqlSession “会话”通过 SqlSession 可以获取到 …

MyBatis面试题(2020最新版)

Java面试总结&#xff08;2021优化版&#xff09;已发布在个人微信公众号【技术人成长之路】&#xff0c;优化版首先修正了读者反馈的部分答案存在的错误&#xff0c;同时根据最新面试总结&#xff0c;删除了低频问题&#xff0c;添加了一些常见面试题&#xff0c;对文章进行了…

【2021最新版】MyBatis面试题总结(38道题含答案解析)

文章目录 1、什么是Mybatis&#xff1f;2、Mybaits的优点&#xff1f;3、MyBatis框架的缺点&#xff1f;4、MyBatis框架适用场合5、MyBatis与Hibernate有哪些不同&#xff1f;6、#{} 和${}的区别是什么&#xff1f;7、当实体类中的属性名和表中的字段名不一样&#xff0c;怎么办…

Mybatis经典面试题汇总

一、什么是Mybatis? 答: 1. Mybatis是一个半orm&#xff08;对象映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;开发时只需要关注SQL的本身&#xff0c;不需要 加载驱动、创建连接、写statement的过程&#xff0c;程序员直接编写原生的sql,灵活性高。 2. Myba…

MyBatis面试题

目录 硅谷 一 . MyBatis中 #{}和${}的区别是什么&#xff1f; 二 .Mybatis 结果集的映射方式有几种&#xff0c;并分别解释每种映射方式如何使用。 三 .简述MyBatis的单个参数、多个参数如何传递及如何取值。 四 .MyBatis如何获取自动生成的(主)键值? 五. 简述Mybatis的…

2023MyBatis全新面试题【30题】

一、介绍下MyBatis中的工作原理 1。介绍MyBatis的基本情况&#xff1a;ORM 2。原理&#xff1a; MyBatis框架的初始化操作处理SQL请求的流程 1.系统启动的时候会加载解析全局配置文件和对应映射文件。加载解析的相关信息存储在 Configuration 对象 Testpublic void test1(…

马哈鱼数据血缘分析工具

1. 马哈鱼数据血缘分析工具简介 马哈鱼数据血缘分析工具&#xff08;英文名称为 Gudu SQLFlow &#xff09;是一款用于分析 SQL 语句&#xff0c;并发现其中数据血缘关系的分析软件&#xff0c;经常和元数据管理工具一起使用&#xff0c;是企业数据治理的基础工具。 如果你对 …

数据分析师常用工具有哪些?初学者必看

我给你一份数据分析师常用工具指南&#xff0c;按照这份指南&#xff0c;小白也能成为数据分析高手&#xff01; 这是一份入门到熟练的工具指南&#xff0c;并不包含数据挖掘等高阶内容。 Step1&#xff1a;Excel学习掌握 所用的工具正是职场中最常用的Excel&#xff01; ①重点…

京东数据分析工具推荐(京东第三方数据平台)

京东平台的店铺众多&#xff0c;同行数不胜数。作为商家&#xff0c;如果连自己竞争对手的情况都不知道的话,很难在这个平台存活下去。 那么&#xff0c;这次鲸参谋就来重点说一下我们的京东数据分析工具里的“竞品分析”功能。 竞品分析&#xff0c;主要是对京东店铺运营期间竞…

2019商业数据分析软件有哪些

在当下这个快速发展的信息化时代&#xff0c;对于企业经营来讲&#xff0c;掌握一些大数据分析软件工具来支持经营决策也是至关重要的。 2019年商业数据分析软件有哪些呢&#xff1f;本文列出了市面上最主要的几款数据分析软件。 1.FineBI 目前国内数据分析的佼佼者。FineBI是…

京东数据分析工具(京东销售数据如何查询)

相信很多京东或者天猫商家都会有这样的需求&#xff1a;想要查看各品类的销售数据&#xff0c;行业大盘数据、竞品的各项销售数据、各品类下的爆款商品数据、竞品店铺的数据等等&#xff0c;一些商智无法满足的数据不知道去哪里可以看到。 实际上&#xff0c;可以体验一下那些…

常用的5种数据分析方法有哪些?

常用的数据分析方法有5种。 1.对比分析法 对比分析法指通过指标的对比来反映事物数量上的变化&#xff0c;属于统计分析中常用的方法。常见的对比有横向对比和纵向对比。 横向对比指的是不同事物在固定时间上的对比&#xff0c;例如&#xff0c;不同等级的用户在同一时间购买商…

抖音短视频数据分析报告工具

现下&#xff0c;短视频行业的快速发展&#xff0c;产生了许多短视频领域的创业者。大家都知道&#xff0c;想要做一个有价值的抖音账号&#xff0c;内容质量方面必须要好&#xff0c;除此之外&#xff0c;当然每天的日常的数据分析也是非常的重要。可以通过其他专业的辅助分析…

python数据分析工具

文章目录 python数据分析工具NumPyScipyMatplotlibpandasStatsModelsscikit-learnKerasGensim python数据分析工具 python本身的数据分析功能并不强&#xff0c;需要安装一些第三方扩展库来增强其相应的功能。 python数据分析与挖掘相关的扩展库&#xff1b; 扩展库简介NumP…

Python常用数据分析工具

Python数据分析工具 Python 本身的数据分析功能不强,需要安装一些第三方扩展库来增强它的能力。常用 的库有Numpy 、Scipy 、Matplotlib 、Pandas 、Scikit-Learn 、Keras 和Gensim 等,下面将对 这些库的安装和使用进行简单的介绍。如果你安装的是Anaconda 发行版,那么它已经…

wps2019数据分析加载项_wpsexcel数据分析工具在哪里

WPS中Excel表格的功能非常强大&#xff0c;不仅仅能够统计数据&#xff0c;而且还可以分析数据&#xff0c;这也是我们处理大量数据的最快捷的方法&#xff0c;感兴趣的小伙伴可以来看看哦。 WPS中如何将表格中的数据在表格中以柱状图显示 运用条件格式中数据条即可达到效果 如…