MyBatis增删改、RESTful API 风格、SpringAOP
增删改操作
- 使用
<insert>
,<update>
,<delete>
标签编写 SQL。 - 示例 (更新操作,包含关联对象属性):
<update id="update">UPDATE t_studentSET stu_id = #{stuId},`name` = #{name},pinyin = #{pinyin}, <!-- 通常属性名与参数名一致 -->sex = #{sex},birthday = #{birthday},phone = #{phone},email = #{email},wechat = #{wechat},description = #{description},class_id = #{classEntity.id} <!-- 引用关联对象属性 -->WHERE id = #{id} </update>
RESTful API 风格 (补充说明)
- REST (Representational State Transfer) 是一种架构风格。
- 常见 HTTP 方法语义:
GET /students
:获取学生列表POST /students
:创建新学生PUT /students/{id}
:更新指定 ID 的学生DELETE /students/{id}
:删除指定 ID 的学生
@RestController
注解表明该类所有方法返回值默认由@ResponseBody
处理 (直接写入响应体,如 JSON/XML)。
Spring AOP (面向切面编程)
- 核心思想: 在方法执行的特定点(切点)横向插入通用逻辑(通知),实现关注点分离(如日志、事务、安全)。
- 实现原理: 动态代理。
- JDK 动态代理: JDK 自带,要求目标类实现接口。
- CGLIB 动态代理: 基于继承,生成目标类的子类代理。要求目标类和方法不能是
final
的。
- 使用步骤 (Spring AOP):
- 引入
spring-boot-starter-aop
依赖。 - 定义切面 (Aspect) 类 (
@Aspect
)。 - 定义切点 (Pointcut) (
@Pointcut
),指定哪些方法需要被切入。 - 定义通知 (Advice) (
@Before
,@After
,@Around
,@AfterReturning
,@AfterThrowing
),包含切入的代码逻辑及执行时机(方法前、后、环绕等)。
- 引入
事务管理 (基于 Spring AOP)
- 事务 (Transaction) 特性 (ACID):
- Atomicity (原子性):操作要么全部成功,要么全部失败回滚。
- Consistency (一致性):事务使数据库从一个一致状态转变到另一个一致状态。
- Isolation (隔离性):并发事务之间相互隔离,防止数据干扰。
- Durability (持久性):事务一旦提交,其结果永久保存。
- 编程式事务 (底层):
Connection conn = DriverManager.getConnection(...); conn.setAutoCommit(false); // 关闭自动提交 try {// ... 执行业务逻辑 (多个SQL) ...conn.commit(); // 手动提交 } catch (Exception e) {conn.rollback(); // 回滚 }
- 声明式事务 (Spring 推荐):
- 引入
spring-boot-starter-aop
(通常已包含在spring-boot-starter-jdbc
或...-data-jpa
中)。 - (可选但推荐) 在主配置类添加
@EnableTransactionManagement
注解 (Spring Boot 通常自动配置)。 - 在业务方法或类上添加
@Transactional
注解。
- 引入
@Transactional
关键属性:isolation
: 事务隔离级别 (依赖于数据库支持):READ_UNCOMMITTED
(读未提交):可能脏读。READ_COMMITTED
(读已提交):解决脏读,可能不可重复读。REPEATABLE_READ
(可重复读):解决不可重复读,可能幻读 (MySQL InnoDB 默认)。SERIALIZABLE
(串行化):最高隔离级别,解决幻读,性能最低。
propagation
: 事务传播行为 (Spring 特有机制,解决事务方法相互调用时的事务边界问题),例如:REQUIRED
(默认):当前有事务则加入,没有则新建。REQUIRES_NEW
:总是新建事务,挂起当前事务(如果存在)。SUPPORTS
:当前有事务则加入,没有则以非事务方式运行。NOT_SUPPORTED
:以非事务方式运行,挂起当前事务(如果存在)。MANDATORY
:必须在事务中运行,否则抛异常。NEVER
:必须在非事务中运行,否则抛异常。NESTED
:在嵌套事务中运行(如果当前存在事务)。