实训Day05

昨日回顾

在这里插入图片描述

有关上图的一些Q&A

Q:

我已经知道@Autowired通过依赖注入将UserMapper实例对象注入到userMapper字段中,但是UserMapper实例对象是如何创建的,是通过@SpringBootTest(classes = MainApp.class) @RunWith(SpringRunner.class)注解吗,如果是通过这两个注解那么具体过程又是怎么样的呢?

A:

在上面提供的测试类中,使用了@SpringBootTest(classes = MainApp.class)@RunWith(SpringRunner.class)这两个注解来进行Spring集成测试。这些注解的作用如下:

  1. @SpringBootTest(classes = MainApp.class)

    • 这个注解用于指定Spring Boot应用程序的入口类,即MainApp.class是Spring Boot应用程序的启动类。
    • 当使用@SpringBootTest注解时,Spring Boot会自动加载应用程序的上下文,并创建一个完整的Spring应用程序上下文,包括所有的bean和配置。
    • 在测试过程中,会模拟整个Spring应用程序的运行环境,包括数据库连接、事务管理等。
  2. @RunWith(SpringRunner.class)

    • 这个注解用于指定使用Spring提供的测试运行器来运行测试类。
    • SpringRunner是Spring提供的测试运行器,用于在测试开始前初始化Spring上下文,并在测试结束后关闭Spring上下文。
    • 使用@RunWith(SpringRunner.class)可以确保在测试过程中能够正确加载Spring上下文,从而可以使用依赖注入等Spring特性。

具体的过程如下:

  1. 当执行测试类时,Spring会根据@SpringBootTest(classes = MainApp.class)注解指定的入口类MainApp.class来启动Spring Boot应用程序。
  2. Spring会扫描应用程序中的所有组件,并创建相应的Bean实例。
  3. 在测试类中使用@Autowired注解将UserMapper实例对象注入到userMapper字段中。
  4. 在测试方法中调用userMapper的方法进行查询、删除、插入、更新等操作。
  5. 执行测试方法时,Spring会处理依赖注入、事务管理等操作,并在测试结束后关闭Spring上下文。

通过这种方式,可以在测试过程中模拟整个Spring应用程序的运行环境,确保测试的准确性和可靠性。这种集成测试方式可以验证整个系统的行为是否符合预期,并且可以检查各个组件之间的协作是否正确。

Q:

Spring扫描组件然后创建bean实例,其中包括了UserMapper实例对象吗?

A:

在Spring中,组件扫描是指Spring容器在启动时自动扫描指定包下的类,识别带有特定注解的类,并将其实例化为Bean。默认情况下,Spring会扫描带有@Component@Service@Repository@Controller等注解的类,并将其实例化为Bean。

对于UserMapper实例对象,如果UserMapper类上添加了Spring的组件注解(例如@Repository@Component等),并且在扫描的包路径下,Spring会扫描到UserMapper类,并将其实例化为Bean。然后可以通过@Autowired注解将UserMapper实例注入到其他类中使用。

如果UserMapper类没有添加Spring的组件注解,但是在配置类中使用@MapperScan注解指定了UserMapper所在的包路径,Spring也会扫描到UserMapper类,并将其实例化为Bean,以便在其他地方使用。

总之,如果UserMapper类符合Spring组件扫描的条件,Spring会扫描到UserMapper类并创建其实例对象作为Bean。否则,需要通过其他方式(如配置类中的@MapperScan注解)告诉Spring如何处理UserMapper类。

1.Spring的Ioc和DI

Spring的IoC(Inversion of Control)和DI(Dependency Injection)是Spring框架的两个核心概念。

  1. IoC(Inversion of Control):IoC是一种设计原则,它将控制权从应用程序代码转移到了框架或容器中。在传统的程序设计中,应用程序控制程序之间的流程,而在IoC中,控制权反转,由框架或容器来控制程序之间的关系和流程。Spring框架通过IoC容器来管理对象的生命周期和依赖关系,使得开发者只需关注业务逻辑的实现,而不需要关心对象的创建和管理。

  2. DI(Dependency Injection):DI是IoC的一种实现方式,它是指通过外部注入的方式来传递对象之间的依赖关系。在Spring框架中,依赖注入是通过IoC容器来实现的,开发者只需要在需要注入的地方标注@Autowired@Resource等注解,Spring容器会自动将依赖的对象注入进来。这样可以降低对象之间的耦合度,提高代码的可维护性和可测试性。

总的来说,IoC是一种设计原则,而DI是IoC的一种具体实现方式。Spring框架通过IoC容器和依赖注入来实现控制反转和依赖注入,帮助开发者更加方便地管理对象之间的关系。

2.@Resource和@Autowired的区别

  1. @Resource注解是JavaEE提供的注解,而@Autowired是Spring框架提供的注解。

  2. @Resource注解是按照名称进行注入的,如果指定了name属性,则按照指定的名称进行注入;如果没有指定name属性,则按照属性名称进行注入。而@Autowired注解是按照类型进行注入的。

  3. @Resource注解可以注入任何类型的bean,包括基本数据类型和String类型,但@Autowired注解只能注入bean类型。

  4. @Resource注解是J2EE的标准注解,而@Autowired注解是Spring框架特有的注解。

总的来说,@Resource注解更加通用,可以用于任何场景,而@Autowired注解更加专门用于Spring框架中的依赖注入。

今日所学

更新项目目录

今日只进行了条件构造器的test,所以只更新了一个UserMapperWithWrapperTest的测试类

在这里插入图片描述

条件构造器

1.为什么要使用条件构造器

1.1.登陆
where phone=? and pwd=?
1.2.统计分析
count() ... group by 
1.3.分页查询
... limit 0,5
1.4.时间段查询
... between ... and ...
1.5.带条件的删除
where reg_time < ...
1.6.更加使用

参考网址https://baomidou.com

在这里插入图片描述

2.使用方法

2.1.构建一个条件构造器的对象
2.2.构建条件
2.3.根据条件对象去使用方法
public class UserMapperWithWrapperTest{
  @Autowried
  private UserMapper userMappper;
  
  @Test
  public void testQuery(){
    //select * from tb_user where phone=?
    
    //1.构建条件构造器对象
    //2.条件构造器的类型Query类型和Update类型
    //3.查询类型的条件构造器:QueryWapper和LambdaQueryWrapper(推荐后者)
    //4.通过API来找到对应的方法
    
    /*User user = new User();
    QueryWrapper<User> query = Wrappers.query(user);
    query.eq("phone","1234321");*/
    
    LambdaQueryWrapper<User> lambdaQueryWrapper = Wrappers.lambdaQuery(User.class);
    
    //构建条件
    //lambdaQueryWrapper.eq(User::getPhone,"1234321");
    
    //带有条件判断的拼接
    String phone="1234321";
   //如果 String phone=""
    lambdaQueryWrapper.eq(!StringUtils.isEmpty(phone),User::getPhone,phone);
    //那么执行sql语句select * from tb_user,没有条件
    
    User user = userMapper.selectOne(lambdaQueryWrapper);
    System.out.println(user);
  }
  
      @Test
    public void testList(){
        LambdaQueryWrapper<User> userLambdaQueryWrapper = Wrappers.lambdaQuery(User.class);

        userLambdaQueryWrapper.like(User::getPhone,"1234321");

        List<User> users = userMapper.selectList(userLambdaQueryWrapper);
        users.forEach(System.out::println);
    }
  
      @Test
    public void testLogic(){
        LambdaQueryWrapper<User> userLambdaQueryWrapper = Wrappers.lambdaQuery(User.class);

        //默认使用逻辑与
        //userLambdaQueryWrapper.eq(User::getName,"肖恩");
        //userLambdaQueryWrapper.eq(User::getPhone,"1234321");


        //逻辑或的使用
        //userLambdaQueryWrapper.eq(User::getName,"肖恩");
        //userLambdaQueryWrapper.or();
        //userLambdaQueryWrapper.eq(User::getId,"100");
      
      	//采用链式调用
      	userLambdaQueryWrapper.eq(User::getName,"肖恩").or().eq(User::getId,"100");
      	//注意select是selectOne()所以查询结果不能有两个用户及以上的信息
        User user = userMapper.selectOne(userLambdaQueryWrapper);
        System.out.println(user);
    }
}

明日预习

1.IService 和 ServiceImpl的作用

1.1IService接口

  • 作用:IService接口通常用于定义业务逻辑方法的契约,即定义了Service层需要实现的方法列表,但不包含具体的实现逻辑。
  • 命名约定:通常以"I"开头,表示Interface的缩写,如UserService接口可以定义为IUserService

1.2ServiceImpl实现类

  • 作用:ServiceImpl实现类用于实现IService接口中定义的业务逻辑方法,包含具体的业务逻辑实现。
  • 命名约定:通常以"Impl"结尾,表示实现类的缩写,如UserService接口的实现类可以定义为UserServiceImpl

通过使用IService接口和ServiceImpl实现类的组合,可以实现业务逻辑的分层和解耦,使代码结构更清晰、易于维护和扩展。IService接口定义了业务逻辑的契约,ServiceImpl实现类负责具体的业务逻辑实现。

2.常用的CRUD方法有哪些(Service CRUD接口)

增:Save SaveOrUpdate(修改插入)

删:Remove

改:Update Chain Update(链式更改)

查:Get(单查询) List(多查询) Page(分页查询) Count(查询总记录) Chain Query(链式查询)

以下是一个简单的C语言万年历的实训报告,供您参考: 一、实训目的 本次实训的主要目的是通过编写一个简单的C语言万年历程序,巩固C语言基本语法和编程思想,提高编程能力和解决问题的能力。 二、实训要求 1、能够使用C语言基本语法和控制语句编写程序。 2、能够使用数组来存储和操作数据。 3、能够使用函数来实现模块化编程。 4、能够使用指针来操作内存中的数据。 5、能够使用文件来读取和写入数据。 三、实训内容 1、程序功能 本程序实现了一个简单的万年历功能,可以通过输入年份和月份来显示该月的日历。 2、程序实现 以下是本程序的主要代码实现: ```c #include <stdio.h> // 判断是否为闰年 int is_leap_year(int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { return 1; } else { return 0; } } // 获取某个月份的总天数 int get_days(int year, int month) { int days[] = {31, 28 + is_leap_year(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; return days[month - 1]; } // 获取某个日期是星期几 int get_weekday(int year, int month, int day) { if (month == 1 || month == 2) { year--; month += 12; } int c = year / 100; int y = year % 100; int w = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1; w = (w % 7 + 7) % 7; return w; } // 显示日历 void show_calendar(int year, int month) { int days = get_days(year, month); int weekday = get_weekday(year, month, 1); printf(" 日 一 二 三 四 五 六\n"); int i; for (i = 0; i < weekday; i++) { printf(" "); } for (i = 1; i <= days; i++) { printf("%2d ", i); if ((weekday + i) % 7 == 0) { printf("\n"); } } if ((weekday + days) % 7 != 0) { printf("\n"); } } int main() { int year, month; printf("请输入年份:"); scanf("%d", &year); printf("请输入月份:"); scanf("%d", &month); if (month < 1 || month > 12) { printf("月份输入错误!\n"); return 1; } printf(" %d年%d月\n", year, month); show_calendar(year, month); return 0; } ``` 四、实训总结 通过本次实训,我学会了如何使用C语言来编写一个简单的万年历程序,巩固了C语言基本语法和编程思想,加强了对函数、数组、指针、文件等概念和用法的理解,提高了编程能力和解决问题的能力。同时,我也意识到在编程过程中需要注重代码的规范、可读性和可维护性,这对于日后的开发工作非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值