Mybaits知识点

142 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


ac.nowcoder.com/discuss/827…

1.  Mybaits的优点****

基于SQL语句编程,相当灵活

与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接

很好的与各种数据库兼容

能够与Spring很好的集成

提供映射标签,支持对象与数据库的ORM字段关系映射

2. MyBatis的功能架构****

我们把Mybatis的功能架构分为三层:

API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层接收到调用请求会调用数据处理层来完成具体的数据处理。

数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

3. MyBatis框架的缺点:****

SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求

SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

4. MyBatis与Hibernate有哪些不同****

MyBatis 是一个半自动映射的框架,配置Java对象与sql语句执行结果的对应关系,多表关联关系配置简单

Hibernate 是一个全表映射的框架,配置Java对象与数据库表的对应关系,多表关联关系配置复杂

 

Hibernate 对SQL语句封,消耗额外性能,数据库无关性支持好,但SQL语句优化困难

MyBatis 需要手动编写 SQL,开发工作量相对更大,但sql语句优化容易

 

5.  #{}和${}的区别是什么?****

 

(1)  ${}是字符串替换,#{}是预处理;****

 

Mybatis在处理时,就是把{}时,就是把{}直接替换成变量的值。

而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?,然后调用PreparedStatement的set方法来赋值;

 

如:select * from user where name = #{userName};预处理将#{userName}替换成了?,即select * from user where name = ?

如果是 select * from user where name = ${userName};处理时直接编程 select * from user where name = 真正的值

 

使用#{}可以有效的防止SQL注入,提高系统安全性。

 

(2) 类似的,如模糊查询like,使用也要注意****

应该将like的值全部放在#{}中,而不是在sql拼接%%符号

正确:select * from user where username like #{name}

错误:select * from user where username like '%${username}%'

 

6. Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?****

 

答案:不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;

原因:就是namespace+id是作为Map的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。

有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

 

7. 实体类中的属性名和表中的字段名不一样,怎么办?****

第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。   image.png

第2种: 通过来映射字段名和实体类属性名的一一对应的关系【手动映射】。

image.png