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 语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

bash 复制代码
<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种:通过来映射字段名和实体类属性名的一一对应的关系。

bash 复制代码
<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) 使用注解:

bash 复制代码
@Options(useGeneratedKeys =true, keyProperty ="id")
int insert( );

(2) 基于Xml:

bash 复制代码
<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) 第一种

bash 复制代码
// 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 注解:

bash 复制代码
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 文档

相关推荐
吾日三省吾码10 分钟前
JVM 性能调优
java
弗拉唐1 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi772 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
少说多做3432 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀2 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
蓝黑20202 小时前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深2 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
凌冰_2 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
shuangrenlong3 小时前
slice介绍slice查看器
java·ubuntu