SpringBoot实现增删改查的代码笔记

代码分解

java是如何解析注解的?

首先来看一下Java定义注解的源码:

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {=
 
 /**
  * Declares whether the annotated dependency is required.
  * <p>Defaults to {@code true}.
  */
 boolean required() default true;
 
}

以注解Autowired为例子,可以发现,事实上每一个注解的本质上都是一个接口,当我们在某一个类中用到这个注解的时候,就可以通过java的反射机制知道是哪个类用了这个注解也就可以拿到这个类的类名,然后就可以根据类名使用反射机制创建对象,大致的步骤如下:

  1. 利用反射机制获取一个类的class对象
  2. 通过这个class对象可以去获取他的每一个字段的Field
  3. Field类提供了方法getDeclaredAnnotations来获取这一个字段的所有注解

关键问题:Java反射
JAVA中编译的类型有两种:

  • 静态编译:在编译时确定类型,绑定对象即通过
  • 动态编译:运行时确定类型,绑定对象。动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,降低类之间的耦合度

JAVA反射是java作为动态语言的关键。这个机制允许程序在运行时,通过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifies(诸如public、static等),Object、实现interface,也包括fields和method的所有信息。

  1. Class类:代表一个类
  2. Field类:代表类的成员变量、类的属性
  3. Method类:代表类的方法
  4. Constructor类:代表类的构造方法
  5. Array类:提供了动态创建数组、以及访问数据元素的静态方法

所以说一旦一个类加上了@Autowired注解,那么Spring会在程序运行时,对标记Autowired注解的类进行扫描,这里会用到反射的方法:getDeclaredAnnotations(),假设有一段代码:

@Autowired
UserMapper userMapper;

那么,Spring就知道有一个字段UserMapper userMapper使用了注解@Autowired,那么Spring就知道了我要为这个字段来实现一个在他方法之外的一个额外的逻辑,这个额外的逻辑是什么呢?那就是这个注解本身设置的含义,就比如Autowired注解,这个注解属于spring的容器配置的一个注解,用于自动装配,那么Spring就知道了,我要自动装配UserMapper userMapper,把他放进Bean里面。

main函数

@SpringBootApplication
开启springboot配置注解 ,项目启动入口,用来启动spring容器 , 启动tomcat , 其他包必须与此类在同级目录或者子包下

什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

UserController.java

第一部分函数名部分:

@RestController
@RequestMapping("/user")
public class UserController {

首先来看一下前两行的注解

  • RestController注解 代表返回JSON格式的数据
  • RestController注解的作用等同于 @Controller注解 + @ResponseBody
  • 在一个类上加上@Controller注解,表面这个类是一个控制器类 控制器类的作用是用来处理请求
  • @Controller注解过的类会被注入到Spring容器中,但这只是改类成为控制器的第一步,还需要@RequestMapping来完成进一步的操作
  • @RequestMapping注解用来处理映射请求,即指明处理器可以处理哪些url请求
  • @ResponseBody注解表示方法的返回值直接以指定的格式写入Http response body中,如果要求方法的返回值是json数据格式而不是跳转
    页面,可以直接在类上标注@RestController

从前面的描述中我们可以看到UserController类的作用是:

  1. 控制器处理用户的请求并返回JSON格式的数据(RestController)
  2. 这个类可以处理的请求url为:localhost:8080/user 开头的url请求

第二部分函数体部分:

@Autowired
UserMapper userMapper;

首先看一下注解@Autowired,这个注解属于spring的容器配置的一个注解,用于自动装配->将Spring容器中的bean自动和我们需要这个bean的类组装在一起。

更进一步:Autowired通常存在什么位置?

A:controller下->控制器内。控制器本身十分简单,包含了处理url请求的一些具体实现方法。但是他并没有做太多的事,而是委托UserMapper来持久化数据。

这里出现了DAO曾(数据持久化):

为了避免持久化的逻辑分散到应用的各个组件中,最好将数据访问的功能放到一个或多个专注于此项任务的组件中。这样的组件通常称为数据访问对象(data access object,DAO)或Reposity.
为了避免应用与特定的数据访问策略耦合到一起,编写良好的DAO应该以接口的方式暴漏功能。

一句话总结就是: 将持久层隐藏在接口之后

这个时候就是usercontroller类里需要实现mysql语句操作数据库,这时候DI的作用就出现了,他把实现数据持久化的bean--->usermaoper注入到usercontroller类内「usermapper添加了@mapper注解,他使用了mybatis框架来实现JDBC操作,我们只需要维护注解里的sql语句就可以了」,这样usercontroller就不要再次声明然后new一个usermapper类了。


问题来了,什么是spring容器?

A:在给予Spring的应用中,你的应用对象生存于Spring容器中,Spring容器负责创建对象,装配他们。配置并管理他们的整个生命周期。

Bean是什么?

A:bean是一个由Spirng IOC容器实例化、组装和管理的对象。

  1. bean是对象,一个或多个不限定;
  2. bean由Spring中的IOC管理
  3. 我们的应用程序由一个个bean构成

控制反转(IOC)是什么?

A:IOC是一个对象定义其以来关系而不创建他们的过程 即不适用new来创建一个对象,而是交给Spring去做

关键问题:DI(以来注入)是什么?

A: IOC的一个重点是在系统运行中,动态的想某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A的方法中编写代码来获取一个Connect对象,通过connect对象的方法来链接数据库。但是当我们使用Spring之后,我们就只需要告诉Spring,A中需要一个Connection,至于这个Connection怎么构造的何时去构造,A不需要知道。在系统运行的时候,spring会在适当的时候去制造一个connection,然后像打针一样,注入到A中,这也是依赖注入名字的由来。

关键问题:依赖注入如何实现?

A:Java的反射机制(reflection).他允许程序在运行的时候动态的生成对象、执行对象的方法,改变对象的属性。Spring就是通过反射来实现注入的。


后半段代码相似度很高,这里只介绍其中一段

@RequestMapping("/add")
    String add(User user) {
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        user.setCREATE_DTIME(timestamp);
        user.setQTIME_BEGIN(timestamp);
        user.setQTIME_END(timestamp);
        user.setTASK_BEGIN(timestamp);
        user.setTASK_END(timestamp);
        user.setCREATOR("zyn8492");
        return userMapper.add(user) == 1 ? "success" : "failed";
    }

前面的描述中我们可以知道@RequestMapping的作用,所以String add(User user)方法的调用的url为:

localhost:8080/user/add

函数内部为add方法的具体实现。


User.java

@Data
public class User {

首先是lombok中的@Data注解:
这个注解的作用是JAVA代码中不需要生成getter和setter方法,编译的时候会自动生成getter和setter

我写代码的时候没注意,写了getter和setter方法,这里可以把User.java这个文件简化成:

@Data
public class User {
    private BigInteger TASK_ID;
    private String HIVE_TABLE;
    private Timestamp QTIME_BEGIN;
    private Timestamp QTIME_END;
    private int STATUS;
    private String REASON;
    private String RESULT_PATH;
    private Timestamp TASK_BEGIN;
    private Timestamp TASK_END;
    private Timestamp CREATE_DTIME;
    private String CREATOR;
}

而不需要额外的代码,这会到之前面的UserController.java代码段报红(编辑器发现你没有在User类内定义getter和setter方法),但是没关系,程序可以正常运行。


UserMapper.java

MVC即model view controller

model曾=entity。存放我们的实体类与数据空中的属性值基本保持一致

mapper曾=dao层。对数据库进行持久化操作,他的方法语句是直接针对数据库进行操作的。


UserMapper是作为一个映射文件存在的。Mapper文件中包含的元素有:

  • cache – 配置给定命名空间的缓存。
  • cache-ref – 从其他命名空间引用缓存配置。
  • resultMap – 映射复杂的结果对象。
  • sql – 可以重用的 SQL 块,也可以被其他语句引用。
  • insert – 映射插入语句
  • update – 映射更新语句
  • delete – 映射删除语句
  • select – 映射查询语句

@Mapper
public interface UserMapper {

@Mapper注解一般使用在接口上,表面这是一个mapper映射文件。

@Select("SELECT * FROM learn_task_zyn8492 limit 1000")
    List<User> queryAll();

@select注解,只需要在mapper映射文件中方法上加上@Select(),然后在括号内写入需要实现的SQL语句,就可以完成方法与SQL语句的映射

posted @ 2020-09-29 20:15  一位神秘丐帮  阅读(2035)  评论(0编辑  收藏  举报