面试题——mybatis相关

Mybatis是什么?

mybatis是一个持久层ORM框架。它内部封装了jdbc,使得开发更简洁,更高效。
Mybatis使开发者只需要关注sql语句本身,简化JDBC操作,不需要在关注加载驱动、创建连接、处理SQL语句等繁杂的过程。
MyBatis可以通过xml或注解完成ORM映射关系配置。

  • ORM框架:对象关系映射框架,Java的JavaBean (对象)与数据库的表(关系) 之间的对应关系。通过对象可以直接操作表。save(User) --> 用户数据进入表中
@Select(“select * from t_user ”)
public List<User> findAll()

Mybatis和JDBC的关系?

JDBC是Java提供的一个操作数据库的API; MyBatis是一个持久层ORM框架,底层是对JDBC的封装。
MyBatis对JDBC操作数据库做了一系列的优化:
(1) mybatis使用已有的连接池管理,避免浪费资源,提高程序可靠性。
(2) mybatis提供插件自动生成DAO层代码,提高编码效率和准确性。
(3)mybatis 提供了一级和二级缓存,提高了程序性能。
(4) mybatis使用动态SQL语句,提高了SQL维护。(此优势是基于XML配置)
(5) mybatis对数据库操作结果进行自动映射
在这里插入图片描述

什么是ORM?

ORM的全称是Object Relational Mapping,即对象关系映射。
描述的是对象和表之间的映射。操作Java对象,通过映射关系,就可以自动操作数据库。
在ORM关系中,数据库表对应Java中的类,一条记录对应一个对象,一个属性对应一个列。
常见的ORM框架:Mybatis、Hibernate

MyBatis的两种配置方式?

注解、XML

MyBatis 注解版增删改查
通常增删改使用通过mapper,@Insert等注解很少使用

  • @Select()
  • @Insert()
  • @Update()
  • @Delete()

多表关系映射

@Results({
	@Result( property=”属性” , column=”列”)
})

Mybatis中#{}和${}的区别是什么?

  1. #{}实现的是sql语句的预处理参数,之后再sql中用?号代替,使用时不需要关注数据类型,Mybatis自动实现数据类型的转换,并且可以防止SQL注入;
  2. ${}实现的是sql语句的直接拼接,不做数据类型转换,需要自行判断数据类型,不能防止SQL注入;
  3. 在某些特定情况下必须使用 , 如 : 在 分 表 存 储 的 情 况 下 , 对 哪 张 表 的 查 询 是 不 确 定 的 , 也 就 是 s q l 语 句 不 能 写 死 , 表 明 是 动 态 的 , 查 询 条 件 是 固 定 的 , 此 时 表 明 只 能 使 用 {},如:在分表存储的情况下,对哪张表的查询是不确定的,也就是sql语句不能写死,表明是动态的,查询条件是固定的,此时表明只能使用 sql,使{}方式进行字符串拼接,这样:slect * from ${tableName} where id = #{id}

总结:#{}占位符,用于参数传递; ${}用于SQL拼接

使用Mybatis过程中当实体类中的属性名和表中的字段名不一样 ,怎么解决?

  1. 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
  2. 使用通用Mapper时,可以通过@Column注解设置
  3. 如果进行自定义查询,可以通过@Result进行设置
  4. 如果使用的xml配置,通过 < resultMap >进行配置

使用Mybatis时Dao接口里的方法能重载吗?

不能重载的,
因为是全限定名+方法名的必须唯一。

XML id值和dao 方法名,进行匹配,要求必须唯一

<select id="findAll">
	select * from...
</select>

Mybatis是如何进行分页的?

使用第三方分页助手:PageHelper
使用方式:
在将要执行查询sql语句之前使用分页助手:PageHelper.startPage(pageNum:页码, pageSize:每页显示数量);

Mybatis分页插件的原理是什么?

使用MyBatis插件(也称为拦截器)机制,对需要使用分页的功能进行增强。也就是重写SQL,根据不同的数据库生产不同的分页语句。
Mysql生成limit语句,Oracle借助rownum生成对应子查询语句。

持续学习,日后更新~~~

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页