Spring框架说人话版本

这东西简单但是不知道考什么,量又很大,我在此进行说人话版本更新,自行复习加深

Spring框架概述Spring框架概述

Spring框架是一个广泛使用的Java企业级开发框架,其体系结构由多个模块组成,每个模块都有其特定的功能和作用。

简单来说就是这玩意是由各个模块搭建起来的,所以要先知道整体构成

该框架由四个部分完成构建

  • 核心容器(Core Container)
  • 数据访问/集成层(Data Access/Integration)
  • Web层(Web)
  • 其他模块(Other Modules)

而其中包含的模块才是运作的核心

核心容器部分(特殊区域为着重点)

Beans模块:提供了BeanFactory,是工厂模式实现的经典,Spring将管理对象称为Bean。

  • Core核心模块:提供了Spring框架的基本组成部分,包括IoC和DI功能。
  • Context上下文模块:构建于核心模块之上,它是访问定义配置的任何对象的媒介,扩展了BeanFactory的功能,其中ApplicationContext是Context模块的核心接口。

数据访问/集成层部分

JDBC模块:提供了一个JDBC的抽象层,大幅度地减少了在开发中对数据库的操作的编码。

  • ORM模块:提供了与多个第三方持久层框架的良好整合。
  • OXM模块:提供了一个支持对象/XML映射的抽象层实现,如JAXB、Castor、XMLBeans、JiBX和XStream。

web层部分

  • Web模块:提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet监听器进行IoC容器初始化以及Web应用上下文。
  • Servlet模块:也称做Spring-webmvc模块,包含Spring的模型-视图-控制器(MVC)和REST Web Services实现的Web应用程序。
  • WebSocket模块:Spring 4.0以后新增功能,提供了WebSocket和SockJS的实现,以及对STOMP的支持。
  • Portlet模块:类似Servlet模块的功能,提供了Portlet环境下的MVC实现。

其他模块部分

AOP模块:提供了面向方面编程的支持,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。

  • Aspects模块:提供了与AspectJ的集成功能,Aspect是一个功能强大且成熟的面向方面编程的框架。
  • Instrumentation模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
  • Messaging模块:Spring 4.0以后新增的模块,提供了对消息传递体系结构和协议的支持。
  • Test模块:提供了对单元测试和集成测试的支持。

spring的核心机制:依赖注入/控制反转

spring的核心机制:依赖注入/控制反转

这个作用机制,也就是该框架是通过什么机制运作的
依赖注入是实现控制反转的方式这个关系搞清楚

控制反转(IoC)

是一种设计原则它将对象的创建和管理的控制权从应用程序代码转移到框架或容器中。这样,容器负责对象的生命周期管理,使得代码更加灵活和可测试。
控制反转主要通过以下两种方式实现:

1、依赖注入(Dependency Injection,DI):

  • 通过将对象的依赖关系在运行时注入到对象中,而不是在对象内部创建依赖。可以通过构造函数、属性或方法实现。

2、服务定位器(Service Locator):

  • 提供一个集中式的注册表来查找和获取服务(对象)。虽然实现了控制反转,但通常不如依赖注入灵活,因为仍需显式请求服务。

什么是依赖注入?

依赖注入是一种设计模式允许在运行时将对象的依赖关系注入到对象中,而不是在对象内部创建这些依赖。这种方式降低了对象之间的耦合,提高了代码的可测试性和可维护性。
好的,下面我们以AdminInfo类为例,讲解依赖注入的几种主要类型。

依赖注入的类型

依赖注入主要有三种类型:构造函数注入属性注入方法注入
完整代码见其他文章,这部分可以说就是记单词,如果要引入注入另一个类的话,先引入包,然后调用方法即可

构造函数注入(sss)

构造函数注入是通过类的构造函数将依赖对象传递给目标对象。在创建对象时,依赖关系在构造时就被注入

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.ssm.entity;

public class AdminInfo {
private int id;
private String name;
private String pwd;

// 默认构造函数
public AdminInfo() {
}

// 带参数的构造函数
public AdminInfo(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
public class AdminService {
private AdminInfo adminInfo;

// 通过构造函数注入AdminInfo
public AdminService(AdminInfo adminInfo) {
this.adminInfo = adminInfo;
}

其中这段是重点部分,以后的代码不提供完整块

1
2
3
4
// 通过构造函数注入AdminInfo
public AdminService(AdminInfo adminInfo) {
this.adminInfo = adminInfo;
}

AdminInfo是示例类名,自由替换AdminInfo

属性注入(sss)

属性注入是通过公共属性或setter方法将依赖对象注入到目标对象中。这种方式在对象创建后,可以随时修改依赖关系

示例代码:

1
2
3
4
// Setter方法进行属性注入
public void setAdminInfo(AdminInfo adminInfo) {
this.adminInfo = adminInfo;
}

AdminInfo是示例类名,自由替换AdminInfo

方法注入

方法注入是通过方法参数将依赖对象传递给目标对象的方法。这种方式适用于需要在特定方法中使用依赖的情况
示例代码:

1
2
3
4
5
public class AdminService {
public void displayAdminInfo(AdminInfo adminInfo) {
adminInfo.print();
}
}

AdminInfo是示例类名,自由替换AdminInfo

小总结

  • 构造函数注入:在对象创建时通过构造函数传入依赖,适合于必须依赖的情况。
  • 属性注入:通过setter方法注入依赖,适合于可选依赖或需要在对象创建后修改依赖的情况。
  • 方法注入:通过方法参数传入依赖,适合于在特定方法中使用依赖的情况。
    以上代码没有调用的部分,只有创建部分
    需要记住的是AdminServicesetAdminInfodisplayAdminInfo

Spring Bean的装配

在Java Web应用中,ContextLoaderListenerContextLoaderServlet是两种常用的载入方式,用于初始化Spring应用上下文。
这里提一点,先配置再使用

ContextLoaderListener

配置示例

web.xml中配置ContextLoaderListener

只有这部分要动

1
2
3
4
5
6
7
8
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

完整的不是人记的,这是配置文件,不是代码!!
扔个完整版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<!-- 其他配置 -->
</web-app>

使用实例:
applicationContext.xml中定义Bean

1
<bean id="myBean" class="com.example.MyBean" />

ContextLoaderServlet

配置示例:

web.xml中配置ContextLoaderServlet

1
2
3
4
5
6
7
8
9
10
11
12
13

<servlet>
<servlet-name>springDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</context-param>

<!-- 其他配置 -->
</web-app>

使用实例:
applicationContext.xml中定义Bean

1
<bean id="myController" class="com.example.MyController" />

小总结

  • ContextLoaderListener:用于加载根应用上下文,适合于整个应用共享的Bean。
  • ContextLoaderServlet:用于加载Web应用上下文,通常与Spring MVC结合使用,处理特定请求。

六大注解(s)

  • ①@component注解
  • ②@Repository注解
  • ③@ Service注解
  • ④@Controller注解
  • ⑤@ Autowired注解
  • ⑥@resourse注解

1. @Component

  • 作用:标识一个类为Spring的组件,Spring会自动扫描并注册为Bean。
  • 使用场景:用于任何Spring管理的组件,通常用于通用的类。

2. @Repository

  • 作用:标识一个类为数据访问层的组件,通常用于持久化操作。
  • 使用场景:用于DAO(数据访问对象)类,Spring会为其提供异常转换等功能。

3. @Service

  • 作用:标识一个类为服务层的组件,通常用于业务逻辑处理。
  • 使用场景:用于Service类,表示该类包含业务逻辑。

4. @Controller

  • 作用:标识一个类为控制层的组件,通常用于处理请求。
  • 使用场景:用于Spring MVC中的控制器类,负责接收和处理用户请求。

5. @Autowired

  • 作用:用于自动注入Spring容器中的Bean
  • 使用场景:可以用于构造函数、属性或方法上,Spring会根据类型自动注入相应的Bean。

6. @Resource

  • 作用:用于按名称自动注入Bean
  • 使用场景:可以用于属性上,Spring会根据Bean的名称进行注入,通常用于与JNDI结合使用。

Spring ADP

什么是AOP?什么是OOP?

AOP(面向切面编程)是一种通过切面来分离横切关注点(如日志、事务等)的编程范式;
OOP(面向对象编程)是一种通过对象和类来组织代码和数据的编程范式。

Aop和OOP的区别

OOP(面向对象编程)关注对象及其行为的组织,而 AOP(面向切面编程)关注在不改变业务逻辑的情况下处理横切关注点(如日志、事务等)。

AOP的常用术语:

好的,以下是AOP的常用术语及其英文单词:

  1. 切面(Aspect)
  2. 连接点(Join Point)
  3. 切入点(Pointcut)
  4. 通知(Advice
  5. 目标对象(Target Object)
  1. 代理对象(Proxy Object)
  2. 织入(Weaving)

Xml注解:通知-给一段代码问是什么通知?

  1. 返回通知myAfterReturnAdvice
  2. 异常通知MyThrowingAdvice
  3. 环绕通知myAroundAdvice
  4. 前置通知browse
  5. 后置通知After

这些通知分别对应于AOP中的不同切面行为。

Spring的数据库的编程

XML配置Spring JDBC数据源的示例:

1
2
3
4
5
6
7
8
9
10
    <!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <!-- 配置驱动 -->
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/> <!-- 配置地址 -->
<property name="username" value="root"/> <!-- 配置用户名 -->
<property name="password" value="password"/> <!-- 配置密码 -->
</bean>

<!-- 其他Bean配置 -->
</beans>

Spring MVC简介

1. MVC这三个字母代表什么

  • M:Model(模型) - 代表应用程序的数据和业务逻辑。
  • V:View(视图) - 代表用户界面,负责展示数据。
  • C:Controller(控制器) - 处理用户请求,协调模型和视图之间的交互。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!-- 配置处理器 Handle,映射为"/hello"请求 -->
<bean name="/hello" class="com.springmvc.controller.Hellocontroller"/>

<!-- 配置视图解析器,将控制器方法返回的逻辑视图解析为物理视图 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
</bean>
</beans>

核心部分为:

1
2
3
4
5
6
7
<!-- 配置处理器 Handle,映射为"/hello"请求 -->
<bean name="/hello" class="com.springmvc.controller.Hellocontroller"/>

<!-- 配置视图解析器,将控制器方法返回的逻辑视图解析为物理视图 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
</bean>
</beans>

Spring MVC的请求流程

一句话就是请求到达请求映射调用处理器返回模型视图解析渲染视图
@RequestMapping 是 Spring MVC 中用于处理请求的注解,主要用于将 HTTP 请求映射到特定的处理方法或类上。

Spring MVC注解 @RequestMapping

1. 基本用法

  • 类级别:可以在控制器类上使用,表示该类中的所有请求处理方法的公共路径前缀。
  • 方法级别:可以在具体的方法上使用,表示该方法处理的特定请求。
  1. 示例代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;

    @Controller
    @RequestMapping("/user") // 类级别的请求映射
    public class UserController {

    @RequestMapping(value = "/get", method = RequestMethod.GET) // 方法级别的请求映射
    @ResponseBody
    public String getUser() {
    return "获取用户信息";
    }

    @RequestMapping(value = "/create", method = RequestMethod.POST) // 方法级别的请求映射
    @ResponseBody
    public String createUser() {
    return "创建用户成功";
    }
    }
    @RequestMapping 是 Spring MVC 中非常重要的注解,用于定义请求的路由和处理逻辑。
    Spring MVC 标签库主要用于在 JSP 页面中简化与 Spring MVC 的集成,提供了一些方便的标签来处理表单、URL、消息等。以下是一些常用的 Spring MVC 标签库及其功能:

Spring MVC 标签库

1. 引入标签库

在 JSP 页面中使用 Spring MVC 标签库之前,需要引入相关的标签库:
(引库可以不用看)

1
2
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>

2. 常用标签

1. <form:form>

  • 用于创建表单,自动绑定表单数据到模型对象。
  • 示例:
    1
    2
    3
    4
    5
    <form:form modelAttribute="user" action="create" method="post">
    <form:input path="username" />
    <form:input path="password" type="password" />
    <input type="submit" value="提交" />
    </form:form>

2. <form:input>

  • 用于创建输入框,绑定到模型属性。
  • 示例:
    1
    <form:input path="email" />

3. <form:select>

  • 用于创建下拉选择框,绑定到模型属性。
  • 示例:
    1
    2
    3
    4
    <form:select path="gender">
    <form:option value="male">男</form:option>
    <form:option value="female">女</form:option>
    </form:select>

4. <form:checkbox>

  • 用于创建复选框,绑定到模型属性。
  • 示例:
    1
    <form:checkbox path="subscribe" /> 订阅新闻

5. <form:errors>

  • 用于显示表单验证错误信息。
  • 示例:
    1
    <form:errors path="username" cssClass="error" />

标签汇总如下

form:form,form:input,form:select,form:checkbox,form:errors-

类型转换,数抗脆式化和数据校验

1. 类型转换

类型转换是将请求参数转换为控制器方法所需的Java类型的过程。Spring MVC提供了自动类型转换的功能。

  • 使用示例

    1
    2
    3
    4
    5
    @RequestMapping("/submit")
    public String submit(@RequestParam("age") int age) {
    // age参数会自动转换为int类型
    return "success";
    }
  • 自定义类型转换:可以通过实现Converter接口来自定义类型转换。

    1
    2
    3
    4
    5
    6
    7
    public class StringToUserConverter implements Converter<String, User> {
    @Override
    public User convert(String source) {
    // 自定义转换逻辑
    return new User(source);
    }
    }

2. 数据格式化

数据格式化用于将对象属性格式化为字符串,或将字符串解析为对象属性。Spring提供了@InitBinder注解来注册自定义的格式化器。

  • 使用示例

    1
    2
    3
    4
    @InitBinder
    public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
    }
  • 自定义格式化:可以实现PropertyEditor接口或使用@InitBinder来注册格式化器。

3. 数据校验

数据校验用于验证用户输入的数据是否符合预期的格式或规则。Spring MVC支持JSR-303(Bean Validation)规范。

  • 使用示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class User {
    @NotNull
    private String username;

    @Min(18)
    private int age;
    }

    @PostMapping("/register")
    public String register(@Valid @ModelAttribute User user, BindingResult result) {
    if (result.hasErrors()) {
    return "registerForm";
    }
    // 处理注册逻辑
    return "success";
    }

SpringMVC 的文件上传和下载

1. Spring MVC 文件上传的作用与配置

1.1 配置文件扫描

在Spring配置文件中,需要启用文件上传的支持,通常通过MultipartResolver来实现。可以使用CommonsMultipartResolverStandardServletMultipartResolver

1
2
3
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/> <!-- 设置最大上传文件大小 -->
</bean>

1.2 文件解析类

CommonsMultipartResolver是基于Apache Commons FileUpload库的实现,负责解析上传的文件。它会将上传的文件封装为MultipartFile对象,方便后续处理。

2. 上传文件的主要代码

在控制器中处理文件上传时,通常会使用MultipartFile对象。以下是一个简单的文件上传示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@RestController
public class FileUploadController {

@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
try {
// 指定文件保存路径
File destinationFile = new File("/path/to/upload/directory/" + file.getOriginalFilename());
// 将上传的文件保存到指定路径
file.transferTo(destinationFile);
return "文件上传成功:" + destinationFile.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
return "文件上传失败:" + e.getMessage();
}
} else {
return "上传的文件为空";
}
}
}

核心代码部分(记这个):

1
2
3
4
5
6
7
8
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
try {
// 指定文件保存路径
File destinationFile = new File("/path/to/upload/directory/" + file.getOriginalFilename());
// 将上传的文件保存到指定路径
file.transferTo(destinationFile);

代码说明:

  • **@RequestParam("file") MultipartFile file**:接收上传的文件。
  • **file.transferTo(destinationFile)**:将上传的文件保存到指定的路径。

SpingMVC的国际化和拦截器

1. 配置国际化支持

在Spring配置文件中,需要配置MessageSource,通常使用ResourceBundleMessageSource来加载消息资源文件。

1
2
3
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages"/> <!-- 指定资源文件的基础名称 -->
</bean>

2. Spring MVC的拦截器

拦截器用于在请求到达控制器之前或响应返回之前进行处理,常用于日志记录、权限检查等

2. 配置拦截器(拦截器配置代码要考)

在Spring配置文件中配置拦截器。

1
2
3
<mvc:interceptors>
<bean class="com.example.MyInterceptor"/>
</mvc:interceptors>

Mybatis

1. SQL 语句

1.1 根据 ID 查询词数据

使用 <select> 标签来查询数据

1
2
3
<select id="selectWordById" parameterType="int" resultType="Word">
SELECT * FROM words WHERE id = #{id}
</select>
  • id:查询的唯一标识符。
  • parameterType:输入参数的类型。
  • resultType:返回结果的类型。

1.2 新增一条数据

使用 <insert> 标签来插入数据

1
2
3
<insert id="insertWord" parameterType="Word">
INSERT INTO words (word, definition) VALUES (#{word}, #{definition})
</insert>
  • parameterType:传入的对象类型,通常是一个 Java Bean。

1.3 修改数据

使用 <update> 标签来更新数据

1
2
3
<update id="updateWord" parameterType="Word">
UPDATE words SET definition = #{definition} WHERE id = #{id}
</update>

1.4 删除数据

使用 <delete> 标签来删除数据

1
2
3
<delete id="deleteWord" parameterType="int">
DELETE FROM words WHERE id = #{id}
</delete>

2. 映射

p166配置映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.mapper.UserInfoMapper">

<!-- 根据用户编号获取用户信息 -->
<select id="findUserInfoById" parameterType="int" resultMap="userInfoMap">
SELECT *
FROM user_info WHERE id = #{id}
</select>

<resultMap type="UserInfo" id="userInfoMap">
<id property="uid" column="id" />
<result property="uname" column="userName"/>
<result property="upass" column="password"/>
</resultMap>
</mapper>

关联映射

1. 一对一映射

  • 定义:一个对象对应一个对象。
  • 例子:一个用户有一个个人资料。

2. 一对多映射

  • 定义:一个对象对应多个对象。
  • 例子:一个用户可以有多个订单。

3. 多对多映射

  • 定义:多个对象可以对应多个对象。
  • 例子:一个用户可以有多个角色,而一个角色也可以被多个用户拥有。

小总结

  • 一对一:一对一。
  • 一对多:一对多。
  • 多对多:多对多。
    这样好记多了吧。

动态SQL

动态 SQL 是指在 SQL 查询中根据条件动态生成不同的 SQL 语句。在 MyBatis 中,可以使用 <if><where><set> 标签来实现动态 SQL。

1. <if> 标签

功能:根据条件判断是否生成某个 SQL 片段。

使用方法

  • <if> 标签中,可以使用 test 属性来指定条件表达式。
  • 如果条件为 true,则生成 <if> 标签内的 SQL 片段。

示例

1
2
3
4
5
6
7
8
9
10
11
<select id="findUsers" parameterType="User">
SELECT * FROM users
<where>
<if test="userName != null">
AND userName = #{userName}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>

在这个示例中,如果 userNameage 不为 null,则相应的条件会被添加到 SQL 查询中。

2. <where> 标签

功能:自动处理 SQL 查询中的 WHERE 子句,避免手动添加 AND 或 OR。

使用方法

  • <where> 标签会自动在生成的 SQL 语句前添加 “WHERE” 关键字,并在第一个条件前自动添加 “AND” 或 “OR”。

示例

1
2
3
4
5
6
7
8
9
10
11
<select id="findUsers" parameterType="User">
SELECT * FROM users
<where>
<if test="userName != null">
userName = #{userName}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>

在这个示例中,如果 userName 不为 null,WHERE 后面会直接跟上 userName = #{userName},如果 age 不为 null,AND age = #{age} 会被添加。

3. <set> 标签

功能:用于动态生成 UPDATE 语句中的 SET 子句。

使用方法

  • <set> 标签会自动处理 SET 子句中的逗号,避免手动添加。

示例

1
2
3
4
5
6
7
8
9
10
11
12
<update id="updateUser" parameterType="User">
UPDATE users
<set>
<if test="userName != null">
userName = #{userName},
</if>
<if test="age != null">
age = #{age},
</if>
</set>
WHERE id = #{id}
</update>

在这个示例中,如果 userNameage 不为 null,相应的字段会被更新,并且逗号会自动处理。
总结如下

  • **<if>**:根据条件生成 SQL 片段。
  • **<where>**:自动处理 WHERE 子句。
  • **<set>**:自动处理 UPDATE 语句中的 SET 子句。

Spring整合MyBaits

这部分建议直接看书得了p222~223xml配置
p22应用