java面试题含答案总结八

1、MQ 是什么?为什么使用?

MQ(Message Queue)消息队列,是 “先进先出” 的一种数据结构。

MQ 的作用:一般用来解决应用解耦,异步处理,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。

异步处理:用户注册后,发送注册邮件和注册短信。用户注册完成后,提交任务到 MQ,发送模块并行获取 MQ 中的任务。

系统解耦:比如用注册完成,再加一个发送微信通知。只需要新增发送微信消息模块,从 MQ 中读取任务,发送消息即可。无需改动注册模块的代码,这样注册模块与发送模块通过 MQ 解耦。

流量削峰:秒杀和抢购等场景经常使用 MQ 进行流量削峰。活动开始时流量暴增,用户的请求写入 MQ,超过 MQ 最大长度丢弃请求,业务系统接收 MQ 中的消息进行处理,达到流量削峰、保证系统可用性的目的。

日志处理:日志采集方收集日志写入 kafka 的消息队列中,处理方订阅并消费 kafka 队列中的日志数据。

消息通讯:点对点或者订阅发布模式,通过消息进行通讯。如微信的消息发送与接收、聊天室等。

2、介绍一下 MyBatis

MyBatis 是一款优秀的持久层框架。

支持自定义 SQL、存储过程以及高级映射
免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO为数据库中的记录

优点:
消除 JDBC 中的重复代码
可以在 XML 或注解中直接编写 SQL 语句,比较灵活,方便对 SQL 的优化与调整
SQL 写在 XML 中,与代码解耦,按照对应关系方便管理
XML 中提供了动态 SQL 的标签,方便根据条件拼接 SQL
提供了 XML、注解与 Java 对象的映射机制
与 Spring 集成比较方便

缺点:
字段较多、关联表多时,编写 SQL 工作量较大
SQL 语句依赖了数据库特性,会导致程序的移植性较差,切换数据库困难

3、#{} 和 ${} 的区别

MyBatis 在处理 #{} 时,会将 SQL 中的 #{} 替换为 ?,预编译 SQL,通过 PreparedStatement 的 setXxxx 的方法进行参数赋值。使用 #{} 可以有效地防止 SQL 注入。
MyBatis 在处理 ${} 时,会直接把 ${} 替换为参数值,存在 SQL 注入的风险。
#{} 比 ${} 安全,但还是提供了 ${} 这种动态替换参数的方式,是因为有些复杂的 SQL 使用场景通过预编译的方式比较麻烦,且在代码中完全可以做到控制非法参数,有些参数可能是一些常量或字段值。

4、Spring 中如何配置 MyBatis?

单纯使用 spring-context 和 spring-jdbc 集成 MyBatis,配置步骤:

加载 spring-context、spring-jdbc、MyBatis、MyBatis-Spring 的 jar 包
spring 集成 MyBatis 的 xml 配置文件,配置 dataSource、sqlSessionFactory、Mapper 接口包扫描路径
Mapper 接口代理 bean 直接从 spring ioc 容器中获得使用即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值