• Spring知识总结


    目录

    知识复习

    一.spring

    1.概念

    2.常用注解

    3.@componentsacn

    4.aop

    二.mybatis-plus

    概念:

    1.常见配置yaml

    2.设置雪花主键

    3.分页配置

    4.代码生成器

    5.公共字段自动填充

    6.Lambda查询

    三.Mybatis

    概念:

    1.xmlMapper文件

    2.动态sql

    3.自定义返回类型

    4.mybatis-config.xml核心配置文件

    5.单独使用的示例

    6.在spring中的使用

    8.事务的使用

    9.整合druid连接池

    10.整合druid在配置类中配置

    四.springmvc

    概念:

    1.springmvc的在javaweb中的单独使用

    2.springmvc在spring中的使用

    3.springmvc的参数日期格式转换

    4.全局日期参数自动转换

    5.拦截器

    6.拦截器的路径配置

    7.拦截器和过滤器的区别

    8.跨域配置

    9.放行静态资源

    五.springboot

    概念:

    1.springboot的搭建

    2.springboot中开发web项目的依赖

    (1).引入springmvc依赖

    (2).引入mysql连接依赖**

    (3)引入druid启动依赖

    (4).引入mybatis-plus依赖**

    (5).引入lombok依赖

    3.对以上依赖的相关配置

    (1)对端口配置

    (2).对mysql和druid连接池配置

    (3)对mybatis-plus的配置

    4.springboot的简单示例

    5.分页查询示例

    6.LambdQueryWrapper

    7.springboot中配置跨域


    知识复习

    一.spring

    1.概念

    Spring框架中的核心模块是IoC(Inversion of Control ,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。

    1. IoC(控制反转):IoC是Spring框架的核心特性之一,通过使用依赖注入,将对象的创建和依赖关系管理的责任从应用程序代码中解耦。通过IoC容器,我们可以将对象的创建和组装交由Spring框架来负责,使应用程序更加灵活、可测试和可维护。

    2. AOP(面向切面编程):AOP是Spring框架的另一个核心特性,它通过将与业务逻辑无关的横切关注点(如日志、安全性、事务管理)从业务逻辑中分离出来,实现了关注点的模块化。通过使用AOP,我们可以通过声明方式将这些横切关注点应用到我们的应用程序中,而不需要修改业务逻辑代码。

    2.常用注解

    1. @Configuration: 标记一个类为配置类,用于替代XML配置文件。

      示例:

      1. @Configuration
      2. public class AppConfig {
      3.   // 配置Bean的方法
      4. }

    2. @Bean: 标记一个方法产生一个Bean对象,并由Spring容器进行管理

      示例:

      1. @Configuration
      2. public class AppConfig {
      3.   @Bean
      4.   public UserService userService() {
      5.       return new UserService();
      6.   }
      7. }

    3. @Scope: 定义Bean的作用范围,默认为单例。

      示例:

      1. @Component
      2. @Scope("prototype")
      3. public class UserService {
      4.   // 类的具体实现
      5. }

    4. @Value: 注入一个值到Bean中,可以是基本类型、字符串、引用等。

      示例:

      1. @Component
      2. public class UserService {
      3.   @Value("John Doe")
      4.   private String userName;
      5.    
      6.   // 其他方法
      7. }

    5. @Qualifier: 当存在多个相同类型的Bean时,通过该注解指定注入的Bean。

      示例:

      1. @Autowired
      2. @Qualifier("userRepository")
      3. private UserRepository userRepository;

    6. @PostConstruct: 在Bean实例化后执行初始化方法。

      示例:

      1. @Component
      2. public class UserService {
      3.   @PostConstruct
      4.   public void init() {
      5.       // 初始化逻辑
      6.   }
      7. }

    7. @PreDestroy: 在Bean销毁前执行清理操作。

      示例:

      1. @Component
      2. public class UserService {
      3.   @PreDestroy
      4.   public void cleanup() {
      5.       // 清理逻辑
      6.   }
      7. }

    8.@component注解

    @Component是Spring中最常用的注解之一,用于标记一个类为组件类,并由Spring容器进行管理。

    它的派生注解有以下几种:

    1. @Controller: 标记一个类为控制器(Web MVC)。

      示例:

      1. @Controller
      2. public class UserController {
      3.   // 控制器的具体实现
      4. }

    2. @Service: 标记一个类为服务类,通常用于业务逻辑的处理。

      示例:

      1. @Service
      2. public class UserService {
      3.   // 服务类的具体实现
      4. }

    3. @Repository: 标记一个类为存储库类,用于数据持久化。

      示例:

      1. @Repository
      2. public class UserRepository {
      3.   // 存储库类的具体实现
      4. }

    3.@componentsacn

    @ComponentScan是一个Spring框架提供的注解,用于指定要扫描的包路径,将被@Component、@Controller、@Service、@Repository等注解标注的类注册为Spring容器中的Bean。通过@ComponentScan注解,可以自动扫描并注册指定包路径下的所有符合条件的组件。

    @ComponentScan注解通常用在Spring配置类上,作为配置类的注解之一。通过在配置类上添加@ComponentScan注解并指定要扫描的包路径,Spring容器会自动扫描并注册指定包路径下的所有组件。

    例如:

    1. @Configuration
    2. @ComponentScan("com.example.demo")
    3. public class AppConfig {
    4.    //其他配置信息
    5. }

    上述代码中,使用@ComponentScan注解指定要扫描的包路径为"com.example.demo",Spring容器会自动扫描并注册该包路径下的所有组件,包括被@Component、@Controller、@Service、@Repository等注解标注的类

    需要注意的是,@ComponentScan注解还可以通过其属性basePackages和value来指定多个包路径进行扫描,以及通过excludeFilters和includeFilters属性来指定过滤条件进行筛选注册的组件。

    4.aop

    在Spring中使用AOP,不使用XML配置和Spring Boot。可以按照以下步骤进行配置:

    1. 创建一个切面类,使用@Aspect注解标注,并添加@Component注解使其成为Spring的组件:

    1. @Aspect
    2. @Component
    3. public class LoggingAspect {
    4.    @Before("execution(* com.example.demo.service.*.*(..))")
    5.    public void beforeMethodCall(JoinPoint joinPoint) {
    6.        // 在方法调用前执行的逻辑
    7.        String methodName = joinPoint.getSignature().getName();
    8.        System.out.println("Before method call: " + methodName);
    9.   }
    10.    // 其他通知方法...
    11. }
    1. 创建一个配置类,使用@Configuration注解标注,并添加@ComponentScan注解指定要扫描的包路径:

    1. @Configuration
    2. @ComponentScan(basePackages = "com.example.demo")
    3. public class AppConfig {
    4. }
    1. 在Spring应用上下文中加载配置类并启动:

    1. public class Main {
    2.    public static void main(String[] args) {
    3.        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    4.        // 获取切面类作为bean并使用
    5.        LoggingAspect loggingAspect = context.getBean(LoggingAspect.class);
    6.        // 调用业务方法
    7.        SomeService someService = context.getBean(SomeService.class);
    8.        someService.doSomething();
    9.        context.close();
    10.   }
    11. }

    通过以上配置,可以实现在Spring中使用AOP,切面类中定义的通知方法将在相应的切点被触发时执行 逻辑。

    注意:在配置类中使用@ComponentScan注解指定要扫描的包路径,以确保Spring能够扫描到切面类作为组件进行注册和使用

    二.mybatis-plus

    概念:

    MyBatis-Plus是基于MyBatis的增强工具,提供了更方便、更强大的功能来简化数据库访问的开发。

    以下是MyBatis-Plus的一些主要概念:

    1. 实体(Entity):在MyBatis-Plus中,实体是与数据库中的表相映射的Java对象。实体类通常包含表中的字段对应的属性,并使用注解来指定与数据库表的映射关系。

    2. Mapper:Mapper是用于执行具体SQL操作的接口。使用MyBatis-Plus时,可以通过继承BaseMapper接口来轻松地实现常见的CRUD操作,也可以自定义SQL语句。

    3. Service:Service是用于封装业务逻辑的组件。MyBatis-Plus提供了BaseService接口,可以用于快速创建Service类,也提供了常用的查询、更新等方法。

    4. Wrapper:Wrapper是用于创建查询条件的封装类。MyBatis-Plus中的Wrapper接口提供了一系列的方法,可以根据具体需求灵活地构建查询条件,如eq、like、gt等方法。

    5. 自动填充(MetaObjectHandler):MyBatis-Plus提供了自动填充功能,可以在插入和更新实体时自动填充额外的字段,如创建时间、更新时间等。可以通过实现MetaObjectHandler接口来自定义填充的逻辑。

    6. 分页支持:MyBatis-Plus提供了方便的分页查询功能,可以通过Page对象进行分页查询,并提供了一系列的Pageable方法进行分页参数的设置。

    7. 主键策略:MyBatis-Plus支持多种主键策略,如自增、UUID、雪花算法等。可以通过注解@TableId来指定主键字段,并使用@KeySequence注解来配置主键生成策略。

    通过使用MyBatis-Plus,可以简化数据库访问的开发,提高开发效率,并提供了更多的功能和扩展点,使得开发工作更加便捷。

    1.常见配置yaml

    以下是一个示例的 MyBatis-Plus 的 yaml 配置文件

    1. spring:
    2. datasource:
    3.   url: jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    4.   username: root
    5.   password: 123456
    6.   driver-class-name: com.mysql.cj.jdbc.Driver
    7. mybatis-plus:
    8. configuration:
    9.   map-underscore-to-camel-case: true
    10.   log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    11.  # 分页配置
    12. pagehelper:
    13.   helper-dialect: mysql
    14.   reasonable: true
    15.   support-methods-arguments: true
    16.   params: count=countSql
    17.  # 逻辑删除配置
    18. global-config:
    19.   db-config:
    20.     logic-delete-field: is_deleted
    21.     logic-delete-value: 1
    22.     logic-not-delete-value: 0
    23.  # 主键策略配置
    24. global-config:
    25.   db-config:
    26.     id-type: auto

    2.设置雪花主键

    要在 MyBatis-Plus 中使用注解方式设置雪花主键生成器,可以按照以下步骤进行设置:

    1. 1在实体类中使用 @TableId 注解标注主键字段,并设置主键生成策略为 IdType.ASSIGN_ID,同时指定一个自定义的主键生成器。

    1. @Data
    2. @TableName("your_table")
    3. public class YourEntity {
    4.    @TableId(value = "id", type = IdType.ASSIGN_ID, generator = "snowflake")
    5.    private Long id;
    6.    
    7.    // 其他字段...
    8. }
    1. 2创建一个自定义的主键生成器类,实现 IdentifierGenerator 接口,并重写 nextId 方法来生成雪花算法的主键。

    1. import com.baomidou.mybatisplus.annotation.DbType;
    2. import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
    3. import com.baomidou.mybatisplus.core.toolkit.IdWorker;
    4. public class SnowflakeGenerator implements IdentifierGenerator {
    5.    @Override
    6.    public Number nextId(Object entity) {
    7.        return IdWorker.getId();
    8.   }
    9.    @Override
    10.    public String nextUUID(Object entity) {
    11.        return IdWorker.get32UUID();
    12.   }
    13.    @Override
    14.    public Object nextId(Object entity, String fieldName) {
    15.        return IdWorker.getId();
    16.   }
    17. }
    1. 3启动类或配置类中使用 @Bean 注解来注册自定义的主键生成器。

    1. @Configuration
    2. public class MybatisPlusConfig {
    3.    @Bean
    4.    public IdentifierGenerator snowflake() {
    5.        return new SnowflakeGenerator();
    6.   }
    7. }

    通过以上设置,在使用 MyBatis-Plus 进行插入操作时,会自动调用雪花主键生成器生成全局唯一的 ID 作为主键值,并将其赋给实体类中的 id 字段

    3.分页配置

    要在 MyBatis-Plus 中使用分页插件,可以按照以下步骤进行设置:

    1. 添加依赖:在项目的 POM 文件中添加 MyBatis-Plus 分页插件的依赖。

    1. <dependency>
    2.    <groupId>com.baomidougroupId>
    3.    <artifactId>mybatis-plus-boot-starterartifactId>
    4.    <version>{version}version>
    5. dependency>
    1. 配置分页插件:在启动类或配置类中添加 PaginationInterceptor 的 Bean,来启用分页插件

    1. @Configuration
    2. public class MybatisPlusConfig {
    3.    @Bean
    4.    public PaginationInterceptor paginationInterceptor() {
    5.        return new PaginationInterceptor();
    6.   }
    7. }
    1. 使用分页查询:在需要分页查询的方法中使用 Page 类进行分页操作。

    1. @Service
    2. public class YourService {
    3.    @Autowired
    4.    private YourMapper yourMapper;
    5.    
    6.    public IPage getPageData(Integer pageNum, Integer pageSize) {
    7.        // 创建分页对象
    8.        Page page = new Page<>(pageNum, pageSize);
    9.        
    10.        // 执行分页查询,结果会自动封装在 page 对象中
    11.        IPage pageData = yourMapper.selectPage(page, null);
    12.        
    13.        return pageData;
    14.   }
    15. }
    1. 获取分页结果:通过分页对象的方法可以获取到分页的相关信息和查询结果。

    1. IPage pageData = yourService.getPageData(1, 10);
    2. long total = pageData.getTotal(); // 获取总记录数
    3. List records = pageData.getRecords(); // 获取当前页的记录列表
    4. // 分页信息
    5. long current = pageData.getCurrent(); // 当前页码
    6. long pages = pageData.getPages(); // 总页数
    7. long size = pageData.getSize(); // 每页记录数
    8. boolean hasPrevious = pageData.hasPrevious(); // 是否有前一页
    9. boolean hasNext = pageData.hasNext(); // 是否有下一页

    4.代码生成器

    下面是一个使用 MyBatis-Plus 代码生成器生成代码的示例,不使用 XML 配置文件,并且每行都有注释说明:

    1.依赖

    1. <dependency>
    2.   <groupId>com.baomidougroupId>
    3.   <artifactId>mybatis-plus-generatorartifactId>
    4.   <version>{version}version>
    5. dependency>

    2.示例

    1. import com.baomidou.mybatisplus.annotation.DbType;
    2. import com.baomidou.mybatisplus.annotation.IdType;
    3. import com.baomidou.mybatisplus.core.MybatisConfiguration;
    4. import com.baomidou.mybatisplus.generator.AutoGenerator;
    5. import com.baomidou.mybatisplus.generator.config.*;
    6. import com.baomidou.mybatisplus.generator.config.rules.DateType;
    7. import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    8. import org.apache.ibatis.type.JdbcType;
    9. public class Generator {
    10.    public static void main(String[] args) {
    11.        // 数据源配置
    12.        DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder("jdbc:mysql://localhost:3306/db_name", "root", "root")
    13.               .driver(DbType.MYSQL.getDriver()) // 设置数据库类型
    14.               .type(DbType.MYSQL) // 设置数据库类型
    15.               .build();
    16.        // 全局配置
    17.        GlobalConfig globalConfig = new GlobalConfig.Builder()
    18.               .outputDir(System.getProperty("user.dir") + "/src/main/java") // 设置输出目录
    19.               .author("Your Name") // 设置作者
    20.               .openDir(true) // 生成完成后是否打开输出目录
    21.               .dateType(DateType.ONLY_DATE) // 设置日期类型
    22.               .idType(IdType.AUTO) // 设置主键类型
    23.               .fileOverride(true) // 是否覆盖已有文件
    24.               .build();
    25.        // 包名配置
    26.        PackageConfig packageConfig = new PackageConfig.Builder()
    27.               .parent("com.example") // 设置父包名
    28.               .moduleName("demo") // 设置模块名
    29.               .entity("entity") // 设置实体类包名
    30.               .mapper("mapper") // 设置Mapper接口包名
    31.               .service("service") // 设置Service类包名
    32.               .controller("controller") // 设置Controller类包名
    33.               .build();
    34.        // 策略配置
    35.        StrategyConfig strategyConfig = new StrategyConfig.Builder()
    36.               .naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略,下划线转驼峰命名
    37.               .columnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体类属性的命名策略,下划线转驼峰命名
    38.               .entityTableFieldAnnotationEnable(true) // 是否生成实体类字段注解
    39.               .entityLombokModel(true) // 是否使用Lombok注解
    40.               .controllerRestStyle(true) // 是否生成@RestController风格控制器
    41.               .controllerMappingHyphenStyle(true) // 是否驼峰转连字符
    42.               .build();
    43.        // 代码生成器
    44.        AutoGenerator generator = new AutoGenerator(dataSourceConfig)
    45.               .global(globalConfig)
    46.               .packageInfo(packageConfig)
    47.               .strategy(strategyConfig)
    48.               .template(new TemplateConfig.Builder().build()); // 使用默认模板配置
    49.        // 执行生成的代码
    50.        generator.execute();
    51.   }
    52. }

    5.公共字段自动填充

    下面是一个使用 MyBatis-Plus 实现公共字段自动填充的示例:

    首先,定义一个公共字段填充处理器:

    1. import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    2. import org.apache.ibatis.reflection.MetaObject;
    3. import org.springframework.stereotype.Component;
    4. import java.time.LocalDateTime;
    5. @Component
    6. public class MyMetaObjectHandler implements MetaObjectHandler {
    7.    @Override
    8.    public void insertFill(MetaObject metaObject) {
    9.        // 设置创建时间和更新时间字段的值为当前时间
    10.        this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
    11.        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    12.   }
    13.    @Override
    14.    public void updateFill(MetaObject metaObject) {
    15.        // 设置更新时间字段的值为当前时间
    16.        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    17.   }
    18. }

    然后,在实体类中添加对应的公共字段,并使用 @TableField 注解进行配置:

    1. import com.baomidou.mybatisplus.annotation.*;
    2. import lombok.Data;
    3. import java.time.LocalDateTime;
    4. @Data
    5. @TableName("user")
    6. public class User {
    7.    @TableId(type = IdType.AUTO)
    8.    private Long id;
    9.    private String username;
    10.    private String password;
    11.    @TableField(fill = FieldFill.INSERT)
    12.    private LocalDateTime createTime;
    13.    @TableField(fill = FieldFill.INSERT_UPDATE)
    14.    private LocalDateTime updateTime;
    15. }

    最后,在启动类中将公共字段填充处理器添加到 MyBatis-Plus 的自动填充处理器列表中:

    1. import org.mybatis.spring.annotation.MapperScan;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. @SpringBootApplication
    5. @MapperScan("com.example.mapper")
    6. public class Application {
    7. public static void main(String[] args) {
    8. SpringApplication.run(Application.class, args);
    9. }
    10. }

    6.Lambda查询

    MyBatis-Plus 提供了 Lambd 查询,通过使用 Lambda 表达式,可以更加简洁地进行条件查询。下面是一些常见的 Lambd 查询示例:

    1. 等值查询:

    1. // 使用 lambda 进行等值查询
    2. List userList = userMapper.selectList(Wrappers.lambdaQuery().eq(User::getUsername, "admin"));
    1. 模糊查询:

    1. // 使用 lambda 进行模糊查询
    2. List userList = userMapper.selectList(Wrappers.lambdaQuery().like(User::getUsername, "adm"));
    1. 多条件查询:

    1. // 使用 lambda 进行多条件查询
    2. List userList = userMapper.selectList(Wrappers.lambdaQuery()
    3.   .eq(User::getGender, "男")
    4.   .like(User::getUsername, "adm")
    5.   .lt(User::getAge, 30));
    1. 自定义查询条件:

    1. // 使用 lambda 自定义查询条件
    2. List userList = userMapper.selectList(Wrappers.lambdaQuery()
    3.   .eq(User::getGender, "男")
    4.   .and(queryWrapper -> queryWrapper.like(User::getUsername, "adm").or().like(User::getEmail, "test")));
    5. 在以上示例中,User::getUsername、User::getGender 等方法引用代表了实体类的属性,可使用 lambda 表达式构建查询条件。
    6. 除了查询方法使用了 lambda 之外,还可以使用 UpdateWrapper 进行更新操作,示例代码如下:
    7. // 使用 lambda 进行更新操作
    8. userMapper.update(null, Wrappers.lambdaUpdate()
    9.       .set(User::getUsername, "admin")
    10.       .eq(User::getId, 1));

    以上示例演示了一些常见的 Lambd 查询用法,使用 MyBatis-Plus 的 Lambd 查询可以大大简化查询条件的编写,提高开发效率。

    三.Mybatis

    概念:

    MyBatis是一个开源的持久化框架,简化了数据库访问开发。它提供了一种将SQL语句与Java方法绑定的方式,使开发人员可以轻松地配置和执行数据库操作。

    以下是MyBatis的一些关键概念:

    1. Mapper XML:Mapper XML是配置SQL语句的地方。它包含了与数据库交互的具体SQL语句,以及SQL语句与Java方法之间的映射关系。

    2. Mapper接口:Mapper接口定义了与数据库交互的方法。通过在接口方法上使用注解,可以将SQL语句绑定到方法上。

    3. SqlSession:SqlSession是MyBatis与数据库交互的核心类。它提供了数据库操作的方法,如查询、插入、更新等。开发人员可以通过SqlSession执行Mapper接口中定义的方法。

    4. ParameterHandler:ParameterHandler负责处理SQL语句的参数。它将Java对象转换为符合JDBC标准的参数,并将其传递给底层的JDBC驱动程序。

    5. ResultSetHandler:ResultSetHandler负责处理查询结果。它将JDBC查询结果转换为Java对象,并将其返回给应用程序。

    6. Executor:Executor负责执行SQL语句。它根据配置可以使用不同的执行策略,如简单、批处理或重用等。

    1.xmlMapper文件

    MyBatis 的 XML Mapper 文件是用来定义 SQL 映射关系以及提供 SQL 查询、插入、更新、删除等操作的地方。通常一个实体类对应一个 XML Mapper 文件,其命名规则是实体类名加上 Mapper.xml 后缀。

    XML Mapper 文件的基本结构如下:

    1. mapper
    2.  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3.  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.example.UserMapper">
    5.    
    6.    <select id="selectUser" resultType="User">
    7.       SELECT * FROM user WHERE id = #{id}
    8.    select>
    9.    
    10.    <insert id="insertUser" parameterType="User">
    11.       INSERT INTO user (username, password) VALUES (#{username}, #{password})
    12.    insert>
    13.    
    14.    <update id="updateUser" parameterType="User">
    15.       UPDATE user SET username = #{username}, password = #{password} WHERE id = #{id}
    16.    update>
    17.    
    18.    <delete id="deleteUser" parameterType="int">
    19.       DELETE FROM user WHERE id = #{id}
    20.    delete>
    21. mapper>

    2.动态sql

    在 MyBatis 的 XML Mapper 文件中,可以使用动态 SQL 来根据条件生成不同的 SQL 语句。这样可以实现在同一个 SQL 查询中根据不同的条件进行灵活地拼接和生成不同的查询语句。

    动态 SQL 主要通过以下几个标签来实现:

    1. :用于条件判断,根据给定的条件判断是否包含其中的 SQL 语句。

    1. <select id="selectUser" parameterType="Map" resultType="User">
    2. SELECT * FROM user
    3. WHERE
    4. <if test="username != null">username = #{username}if>
    5. <if test="gender != null">AND gender = #{gender}if>
    6. select>

    在上面的例子中,如果传入的参数 usernamegender 都不为空,那么最终生成的 SQL 语句将是 SELECT * FROM user WHERE username = #{username} AND gender = #{gender}

    1. :用于条

      1. <select id="selectUser" parameterType="Map" resultType="User">
      2. SELECT * FROM user
      3. <choose>
      4. <when test="id != null">WHERE id = #{id}when>
      5. <when test="username != null">WHERE username = #{username}when>
      6. <otherwise>WHERE gender = #{gender}otherwise>
      7. choose>
      8. select>

      件选择,根据给定的条件选择其中的一个分支执行。

     
    

    在上面的例子中,根据传入的参数中的 idusernamegender 的值,选择不同的分支执行,生成不同的 SQL 语句。

    1. :用于循环处理,将一个集合中的元素逐个拼接到 SQL 语句中。

    1. <delete id="deleteByIdList" parameterType="List">
    2. DELETE FROM user
    3. WHERE id IN
    4. <foreach collection="list" item="id" separator="," open="(" close=")">
    5. #{id}
    6. foreach>
    7. delete>

    5:用于条件处理

      SELECT * FROM user      AND username = #{username}    AND gender = #{gender}   

    3.自定义返回类型

    在 XML Mapper 文件中,可以使用 标签来定义自定义的结果映射。通过 标签,可以指定查询结果中的列和对象属性之间的映射关系,并定义如何处理结果。

    以下是一个示例:

    1. <resultMap id="userResultMap" type="com.example.User">
    2.  <id property="id" column="user_id"/>
    3.  <result property="username" column="user_name"/>
    4.  <association property="address" javaType="com.example.Address">
    5.    <id property="id" column="address_id"/>
    6.    <result property="city" column="address_city"/>
    7.    <result property="country" column="address_country"/>
    8.  association>
    9. resultMap>

    在以上示例中, 定义了一个名为 "userResultMap" 的结果映射,指定了 User 类型的结果。通过 标签可以指定列和对象属性之间的映射关系,通过 标签可以描述对象之间的关联关系

    然后,在相应的 SQL 查询语句中,可以使用 标签来引用定义好的结果映射:

    1. <select id="selectUser" parameterType="int" resultMap="userResultMap">
    2. SELECT * FROM user WHERE id = #{id}
    3. select>

    在以上示例中,