前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java高频面试题- 每日三连问?【Day4】 — MyBatis篇

Java高频面试题- 每日三连问?【Day4】 — MyBatis篇

作者头像
浩说编程
发布2021-08-16 17:37:08
4550
发布2021-08-16 17:37:08
举报
文章被收录于专栏:Java经验之谈

问题导读

一、MyBatis中的#{}和${}有哪些区别?

二、你常用的MyBatis标签有哪些?

三、说一下Hibernate 和 MyBatis 的区别吧

01

MyBatis中的#{}和${}有哪些区别?

正经回答:

代码语言:javascript
复制
-- #{}
<select id="userLogin" parameterType="java.util.Map" resultMap="userResMap">
select id, username, password, role
from user
where username = #{username}
and password = #{password}
</select>

-- ${}
<select id="userLogin" parameterType="java.util.Map" resultMap="userResMap">
select id, username, password, role
from user
where username = ${username}
and password = ${password}
</select>

1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号

如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username=“111”, 如果传入的值是id,则解析成的sql为where username=“id”。

2、$将传入的数据直接显示生成在sql中

如:where username=${username},如果传入的值是111,那么解析成sql时的值为where username=111;

那么,如果传入的值是:;drop table user;会怎么样?

解析后的sql为:(sql注入问题,直接删表了)

代码语言:javascript
复制
select id, username, password, role from user where username=;drop table user;

3、#方式能够很大程度防止sql注入,$方式无法防止Sql注入。

综上,我们在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式来防止SQL注入。

02

你常用的MyBatis标签有哪些?

正经回答:

1、增删改查

<select>、<insert>、<delete>、<update>

2、if判断

<if>

3、<where>

where标签经常跟if标签搭配使用,where标签会判断if标签里的条件是否成立,如果有条件成立则会拼接执行该条件下的sql语句。

where标签避免所有条件都为空的时候出现“select * from user where ”这种会出错的情况,当然我们也可以在where后面加入“1=1”简单的解决。

4、<set>

set标签一般用在update语句中,set标签与where标签类似,当我们在update语句里碰到多个字段相关的问题。

在这种情况下我们就会用到set标签,他也是判断if标签里的条件是否成立,然后拼接执行sql语句。

5、<choose>

相比于if标签二选一,choose标签就有了第三种选择,或者更多的选择。

在映射器的动态语句中使用choose..when..otherwise..这三个元素就能满足不同的业务要求。

Mybatis会根据参数的设置进行判断,来拼接组装sql语句,当when标签下无满足条件,则会执行otherwise标签里的语句。

6、<foreach>

foreach元素是一个循环语句,他的作用是遍历集合,他能够很好的支持数组和List的集合。

并对此提供遍历,foreach标签常用于in这样的语法里,进行批量处理

03

说一下Hibernate 和 MyBatis 的区别吧

正经回答:

相同点

都是对jdbc的封装,都是持久层的框架,都用于dao层的开发。

不同点

1、映射关系

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

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

2、SQL优化和移植性

Hibernate 对SQL语句封装,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供 HQL(Hibernate Query Language)操作数据库,数据库无关性支持好,但会多消耗性能。如果项目需要支持多种数据库,代码开发量少,但SQL语句优化困难。

MyBatis 需要手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。开发工作量相对大些。直接使用SQL语句操作数据库,不支持数据库无关性,但sql语句优化容易。

开发难易程度和学习成本

3、规模

Hibernate 是重量级框架,学习使用门槛高,适合于需求相对稳定,中小型的项目,比如:办公自动化系统

MyBatis 是轻量级框架,学习使用门槛低,适合于需求变化频繁,大型的项目,比如:互联网电子商务系统

总结

MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,

Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。

每日小结

今天我们复习了面试中常考的Mybatis三个问题,你做到心中有数了么?

对了,如果你的朋友也在准备面试,请将这个系列分享给他,如果他认真对待,肯定会感谢你的!!

好了,今天就到这里,学废了的同学,记得三连,也会给我继续更新的动力。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩说编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正经回答:
  • 正经回答:
  • 正经回答:
  • 每日小结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档