首页 > 其他分享 >MyBatis 框架核心及面试知识要点

MyBatis 框架核心及面试知识要点

时间:2024-07-09 21:31:38浏览次数:20  
标签:语句 映射 sql 要点 接口 面试 SQL MyBatis

1、什么是 MyBatis?
MyBatis 是一款优秀的支持自定义 SQL 查询、存储过程和高级映射的持久层框架,消除了 几乎所有的 JDBC 代码和参数的手动设置以及结果集的检索 。 MyBatis 可以使用 XML,或注解进 行配置和映射,MyBatis 通过将参数映射到配置的 SOL,形成最终执行的 SOL语句 ,最后将执行SOL的结果映射成Java对象返回。
2、Mybatis具有以下优点
(1) 小巧,学习成本低,会写 SQL上手就很快了。
(2) 比 JDBC,基本上配置好了,大部分的工作量就专注在 SQL 的部分。
(3) 方便维护管理,SQL 不需要在Java代码中找,SQL代码可以分离出来,重用。
(4) 接近 JDBC, 灵活,支持动态 SQL。
(5) 支持对象与数据库ORM 字段关系映射
3、Mybatis 的缺点如下
(1) SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
(2) SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
4、MyBatis框架适用场合:
如果你需要一个灵活的、可以动态生成映射关系的框架,如互联网项目,MyBatis将是不错的选择。
5、MyBatis与Hibernate有哪些不同?
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。
Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。
6、#{}和KaTeX parse error: Expected 'EOF', got '#' at position 11: {}的区别是什么? #̲{}是预编译处理,{}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
7、Mybatis 中9个动态标签是?
(1) if:结合 test 属性使用,当参数满足条件才会执行某个条件。
(2) choose(when、oterwise):相当于java 中的 if else,choose标签是按顺序判断其内部when标签中的test条件是否成立,如果有一个成立,则choose结束;如果所有的when条件都不满足时,则执行otherwise中的SQL。类似于java的switch语句。
(3) trim (where、set):辅助条件标签,结合 if 标签使用,用于 SQL拼接问题。
(4) foreach:循环语句,批量操作时遍历使用。
(5) bind:创建一个变量并将其绑定到上下文,防止SQL注入等。
九大标签在项目中的具体使用可参考以下资料,我就不罗列了:
MyBatis的9种动态标签详解
8、xml 映射文件中,有哪些标签?
(1) select:映射查询操作。
(2) insert:映射插入操作。
(3) update:映射更新操作。
(4) delete:映射删除操作。
(5) resultMap:定义结果集映射规则,将数据库查询结果与Java对象属性进行映射。
(6) parameterMap:已废弃,用于旧版的参数映射,现代MyBatis推荐直接在#{}中使用参数名。
(7)selectKey:在插入操作后立即执行一个SELECT语句以获取自动生成的关键字(如序列ID或IDENTITY列),主要用于不支持自动返回主键值的数据库系统。
(8) sql:定义可重用的SQL片段,可以被其他语句引用。
外加上述9个动态标签,一同组成了 xml 文件的标签。
9、当实体类中的属性名和表中的字段名不一样,怎么办 ?
第1种:通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>         
      select order_id id, order_num orderNum ,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 = “orderNum” column =”order_num”/>  
    <result property=”price” column=”order_price” />  
</reslutMap>

10、like模糊查询怎么写?
(1) ‘%${value}%‘不推荐
(2) CONCAT(’%’,#{value},%) 推荐
(3) like '%‘1l #{value}ll’%
(4) 使用bind ,例如 like #{pattern)
11、Mybatis的分页原理
Mybatis 使用 RowBounds 对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,所以一般不会使用。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的原理就是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,然后根据设置的 dialect(方言),和设置的分页参数,重写SQL ,生成带有分页语句的SQL,执行重写后的SQL,从而实现分页。
举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10。
12、如何获取自动生成的(主)键值?
(1) 使用注解:

@Options(useGeneratedKeys =true, keyProperty ="id”)
int insert( );

(2) 基于Xml:

<insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id"
        parameterType="person" >
    INSERT INTO person(name, pswd)
    VALUE (#{name}, #{pswd})
</insert>

13、一个 Xml 映射文件,都会写一个 Dao 接口与之对应,这个 Dao 接口的工作原理是什么?
Dao 接口就是人们常说的 Mapper 接口,接口的全限名,就是映射文件中的 namespace 的值,接口的方法名就是映射文件中 MappedStatement 的 id 值,接口方法内的参数就是传递给 sql 的参数。
接口里的方法是不能重载的,因为是全限名+方法名的保存和寻找策略。
Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行接口方法所对应的MappedStatement所代表的sql,然后将sql执行结果返回。
MappedStatement:MappedStatement维护了一条 <select|update|delete|insert>节点的封装,包括了传入参数映射配置、执行的SQL语句、结果映射配置等信息。
14、在mapper中如何传递多个参数?
(1) 第一种

// DAO层的函数  
Public UserselectUser(String name,String area);  
// 对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。  
<select id="selectUser"resultMap="BaseResultMap">    
  select *  fromuser_user_t where user_name = #{0} and user_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,然后在 xml 中通过 #{map的key}取值
15、什么是MyBatis的接口绑定,有哪些实现方式?
接口绑定,就是在 MyBatis 中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。
接口绑定有两种实现方式:
通过注解绑定,就是在接口的方法上面加上 @Select、@Update 等注解,里面包含Sql语句来绑定;
通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的 namespace 必须为接口的全路径名。当Sql语句比较简单时候,用注解绑定, 当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多。
写在最后,现在有一款 MyBatis-Plus框架, 完美兼容MyBatis,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。具体使用大家可以参考官方文档:MyBatis-Plus 文档

标签:语句,映射,sql,要点,接口,面试,SQL,MyBatis
From: https://blog.csdn.net/qq_39964887/article/details/140233480

相关文章

  • 面试题目分享
    学习目标:从面试了解自己的不足。学习内容:1.你会什么语言?我该如何回答,我会java,c,c++等,在工作中我会用到合适的语言。牛逼吹的大话尊敬的面试官,我精通Java和Python,前者用于企业级后端开发,后者擅长数据分析。我也熟悉前端JavaScript/TypeScript和React。具备跨语言学习......
  • MyBatisPlus基础查询
    MyBatisPlus基础查询使用:1:多条件查询&排序:QueryWrapper<User>queryWrapper=newQueryWrapper<>();queryWrapper.lambda().ge(User::getId,100).orderByDesc(User::getId);list=userService.list(queryWrapper);2:模糊查询:QueryWrapper<User>queryW......
  • 项目管理面试常见问题及答案
    1.项目管理软件工具知识,2.编制项目计划的技术,3.人员管理技能4.沟通技能5.原理体系知识(标生命周期和项目管理)。项目管理软件工具知识 问题1:工期和工作量之间的差异是什么?答案1:工期是商业/日历上的天数,与人数和工作量无关。工作量是与日历天......
  • [Java面试]经典手撕
    多线程循环打印ABC方法一:packageorg.example;importjava.util.TreeMap;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;publicclassPrintABC{ReentrantLocklock=newReentrantLock();Conditiona=lo......
  • 手写MyBatis
    1.前言本篇博客,将使用JDK动态代理、注解、反射等技术,编写一个最简单的MyBatis,可基本实现对象的增删查改2.注解的定义2.1Delete注解/***@ClassNameDelete*@Descriiption删除注解*@Authoryanjiantao*@Date2019/6/2711:03**/@Target(ElementType.METHOD)......
  • 面试官:MySQL死锁是什么,如何解决?
    MySQL死锁概述定义:多个操作相互等待对方释放资源,导致无法继续执行的情况。场景:通常发生在多个事务同时试图锁定对方已锁定的资源时。MySQL锁的分类粒度分类:表级锁:锁定整个表,简单但并发能力低。行级锁:锁定特定行,开销大,可能死锁,但并发度高。页级锁:锁定数据库页,介于表级和......
  • Mybatis -过滤查询
    一、过滤查询过滤查询实则是根据用户传入的条件进行数据的筛选查询,最终返回结果给用户。1、需求及效果图例如:在商品列表中,用户可以根据自己的需要,按照商品的名称和价格范围对商品进行查询。2、原理分析以上条件设计,后台需执行的 SQL会有如下几种: 需求1:查询所有货品......
  • MyBatisPlus的Mapper.xml入参List执行in函数
    使用情景这个是开发过程中比较常见的情景,入参一个list,在Mapper.xml里面执行sql的in函数,今天来记录下这个问题,希望可以给大家一点帮助启发。Mapper文件解决方案xml文件<selectid="get"resultType="com.vo.tVo">SELECTnameFROMus......
  • 快速上手:前后端分离开发(Vue+Element+Spring Boot+MyBatis+MySQL)
    文章目录前言项目简介环境准备第一步:初始化前端项目登录页面任务管理页面第二步:初始化后端项目数据库配置数据库表结构实体类和Mapper服务层和控制器第三步:连接前后端总结......
  • iOS面试题:tableivew上面展示图片的时候,在网络还未回来时,将cell滑走,那被划走的cell还会
    当在UITableViewCell中加载网络图片时,如果在图片下载完成之前用户滑动了UITableView,使得对应的UITableViewCell已经滑出屏幕,那么这个被滑走的UITableViewCell是否还会显示图片,取决于如何处理图片的加载和UITableViewCell的重用。UITableView的重用机制这篇文章写了相关知识图片......