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 容器中获得使用即可