Springboot demo1项目(一)
2022-09-06 10:19:21

1. 注解有什么用?

  • 注解里面不用写方法变量什么的,只起一个标注的作用,不是具体代码,标识类或方法等需要执行的任务

  • 在编译期间或者运行期间读取程序,通过反射机制去判断及读取相应操作,当程序运行时需要反射机制去获取哪些方法、类、变量等添加了该注解。


  • 自定义注解:

    • 添加一个方法注解InitMethod
1
2
3
4
5
6
7
8
9
   package cn.bdqn.demo1;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) //对方法进行注解
@Retention(RetentionPolicy.RUNTIME) //运行时执行注解
public @interface InitMethod{
}
  • 写一个InitDemo类使用方法注解
1
2
3
4
5
6
7
8
9
10
11
   package cn.bdqn.demo1;
public class InitDemo{
@InitMethod
public void init(){
System.out.println("init.....");
}
@InitMethod
public void test(){
System.out.println("test...");
}
}
  • 在Test类中遍历InitDemo类中所有方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     	package cn.bdqn.demo1;
    import java.lang.reflect.Method;
    public class Test{
    public static void main(String[]args) throws Exception{
    Class clazz=Class.forName("cn.bdqn.demo1.InitDemo");//拿到InitDemo类
    Method[] methods=clazz.getMethods();//遍历InitDemo类中所有方法
    if(methods!=null){
    for(Methodmethod:methods){
    Boolean isInitMethod=method.isAnnotationPresent(InitMethod.class);//isAnnotationPresent判断是否拥有某一个注解,并返回布尔类型
    if(isInitMethod){
    method.invoke(clazz.getConstructor(null).newInstance(null),null);
    }}}}}
    参考:https://www.bilibili.com/video/BV1Py4y1Y77P/?spm_id_from=333.788.recommend_more_video.5&vd_source=e18fd054c638dd62bfe0ba010156eb06

2. 程序中所用到的注解

  • main方法:
    • @SpringBootApplication:申明让Springboot自动给程序进行必要的配置,这个配置等同于:(@Configuration 、@EnableAutoConfiguration 、 @ComponentScan) 三个配置;
    • @MapperScan(value = “cn.bdqn.demo1.mapper”):指定要扫描的Mapper类的包的路径;
  • controller层中:
    • @Controller :用于定义控制器类,在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),
      一般这个注解在类中,通常方法需要配合注解@RequestMapping
    • @Resource:与@Autowired 用法 用法相似,也是做依赖注入的,从容器中自动获取bean。但还是有一定的区别;
    • @RequestMapping(“/list”):提供路由信息,负责URL到Controller中的具体函数的映射
    • @GetMapping(“/updatePage/{id}”):get请求,等价于@RequestMapping(value=”/updatePage/{id}”,method=RequestMethod.GET)
    • @PostMapping(“/update”):post请求,等价于@RequestMapping(value=”/update”,method=RequestMethod.POST)
    • @PathVariable:在@RequestMapping注解方法中获取URL变量
      1
      2
      3
      4
      @RequestMapping(value="/hello/{id}/{name}",method= RequestMethod.GET)
      publicString sayHello(@PathVariable("id") Integer id,@PathVariable("name") String name){
      return"id:"+id+" name:"+name;
      }
  • service层中:
    • @Service:一般用于修饰service层的组件;
    • @Override:重写父类;
  • mapper层/dao层:
    • @Mapper:使用@Mapper注解要定义成一个接口interface;不用写mapper映射文件(xml);为这个接口生成一个实现类,让别的类进行引用;如果有多个类的话,可以使用@MapperScan进行注解,一次性注解多个包;
    • @Select(“select * from user”):选择数据库中的数据
    • @Insert(“ insert into user( username,password ) values (#{username},#{password}) “):插入数据库中的数据
    • @Delete(“ delete from user where id= #{id} “):删除数据库中的数据
    • @Select(“select * from user where id= #{1} “):按id选择数据库中的数据
    • @Update(“update user set username=#{username},password=#{password} where id=#{id} “):更新数据库中的数据

参考:https://blog.csdn.net/fenlin88l/article/details/89466723
https://blog.csdn.net/weixin_40753536/article/details/81285046

3. Model层

1
2
3
4
5
6
@RequestMapping("/list")//路径
public String userList(Model model){
List<User> users=userService.findAll();
model.addAttribute("users",users);
return"index";
}
  • Model是一个接口,包含addAttribute方法,其实现类是ExtendedModelMap。ExtendedModelMap继承了ModelMap类,ModelMap类实现了Map接口。
  • 在控制器中,数据会存放到Model对象中,当需要生成HTML的时候,模板引擎会根据名字来定位数据。从广义上来说,Model指的是MVC中的M,即Model(模型)。从狭义上讲,Model就是个key-value集合。
  • 往Model里放数据还有另外一种方式,使用ModelAndView。正如它的名字一样,ModelAndView将Model和视图名绑定在一起,作为请求处理方法的返回值。

    参考:https://fookwood.com/spring-boot-tutorial-9-model

4. Integer和int的区别

基本数据类型: boolean,char,byte,short,int,long,float,double
封装类类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

4.1 基本使用对比

  • Integer是int的封装类;int是基本数据类型;
  • Integer变量必须实例化后才能使用;int变量不需要;
  • Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
  • Integer的默认值是null;int的默认值是0。

    4.2 深入对比

  • 由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)
    1
    2
    3
    Integer i = new Integer(100);
    Integer j = new Integer(100);
    System.out.print(i == j); //false
  • Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为封装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)
    1
    2
    3
    Integer i = new Integer(100);
    int j = 100;
    System.out.print(i == j); //true
  • 非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。因为非new生成的Integer变量指向的是静态常量池中cache数组中存储的指向了堆中的Integer对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的对象引用(地址)不同
    1
    2
    3
    Integer i = new Integer(100);
    Integer j = 100;
    System.out.print(i == j); //false
  • 对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false
    1
    2
    3
    4
    5
    6
    7
    Integer i = 100;
    Integer j = 100;
    System.out.print(i == j); //true

    Integer i = 128;
    Integer j = 128;
    System.out.print(i == j); //false
  • 自动装箱和拆箱
    • 自动装箱:将基本数据类型重新转化为对象
      // 声明一个Integer对象,用到了自动的装箱:解析为:
      1
      2
         Integer num = Integer.valueOf(9);
      Integer num = 9;
    • 自动拆箱:将对象重新转化为基本数据类型,因为对象时不能直接进行运算的,而是要转化为基本数据类型后才能进行加减乘除
      / /声明一个Integer对象
      Integer num = 9;
      // 进行计算时隐含的有自动拆箱
      System.out.print(num--);

参考:https://blog.csdn.net/chenliguan/article/details/53888018

5. HttpServletRequest和HttpServletReponse

HttpServletRequest对象专门用于封装 HTTP 请求消息,简称 request 对象。

HttpServletReponse 对象用于封装 HTTP 响应信息。