JAVA代码审计之SpringBoot、Maven、mybatis浅析

xiao1star2025-12-31文章来源:SecHub网络安全社区


java代码审计之SpringBoot、Maven、mybatis浅析

SpringBoot

是用来解决C/S开发的问题

什么是C/S架构

支持多个客户端同时向服务器发送请求并得到响应的过程,为了更好的引用这种架构就有了SpringBoot,Springboot有一个内置软件是Tomcat

tomcat的端口号是8080

202404011602887.png

快速搭建

202405132100019.png

目录结构

src->用于存放java源码

src/main/java->正式的java代码

src/test/java->测试代码,@Test表示的这是一个测试入口

Module2Application类->入口方法,必须放在contorller,dto,service包的上一层

202404032022731.png

src/main/resource/static->html源码

src/main/resource/application->配置文件

src/main/java/controller->控制器类

src/main/java/dto->一些数据

src/main/java/service->业务逻辑类

web程序的出入输出

输出

一般都是在控制器类中,要与我们的入口方法同级或在下一级

条件

@Controller--标记为控制器类,一般控制器类调用Service类,Service调用Mapper

@Mapper//声明这个是一个专用于增删改查的接口

@RequestMapping("/hello"):控制了url路径和方法之间的关系

@ResponseBody:用来处理方法的返回结果

@Service 加在业务逻辑类上,会自动创建一个对象

202404011623085.png

访问该页面的url

http://localhost/hello

输入

一般是通过web页面进行输入的

在我们的scr/main/resource/static

202404011633710.png

输入和输出的联系

202404011631447.png

打包

打包是为了发布在各个平台

流程

  • 点击右侧的Maven选择框
  • 点击生命周期下的package选项

控制反转

对象的创建权转移到Spring框架,这种思想称为控制反转

  • @Contorller
  • @Service

依赖注入

框架帮助我们找到依赖注入,按一定的规则供给你,成为依赖注入

202404032002525.png

CalculatorController必须依赖下面的Service才可以正常运作,所有我们称这些Service为Controller的依赖

@Autowired:根据类型找Sring中的对象

202404032010648.png

异常处理

在Spring中只需要抛出异常的方法,不需要写try catch语句的处理异常的方法,因为Spring会自动生成try catch语句

202404092056319.png

路径参数

@PathVariable–表示该方法参数要从路径中取代

@RuequesetMapping("/video/{bv}") @ResponseBody public Video t(@PathVariable String bv)//bv由上面的路径中的bv控制 { if(bv.equals("1")){ ..... } if(bv.equals("2")){ .... } }

静态资源映射

如果有大量的视频和图片文件,我们不可能把所有的文件都弄到Spring目录下,因此我们可以将url地址和磁盘目录相关联

  • 在入口文件中(Module1App.java)中继承WebMvcConfigurer接口
  • 使用其中的addResourceHandlers方法去将url路径与磁盘路径相关联

202404102135209.png

表示如果想要访问play路径下的文件就去d盘的aa文件中寻找

Mybatis

前提:需要在pom.xml加入mybaties和mysql的依赖

用于数据库与java代码进行连接,通过java代码对数据库进行增删改查

建立数据库连接

在resource在新建一个application.properties文件(文件名必须是这个)

202404102200542.png

建立增删改查接口

在src/main下创建一个mapper包

@Mapper//声明这个是一个专用于增删改查的接口

@Select用来写查询语句

查询所有

202404102212802.png

调用findall()就会执行@Select语句中的内容,将查询出来的学生数据封装成Student对象,多个Student对象封装成List集合

查询学生编号

202404111101033.png

新增学生

202404111105299.png

mybatis不支持多个参数传参,需要使用@Param说明那个值传递给那个参数

接口利用

实现类来实现这个增删改查接口(由mybatis和spring共同提供),可以通过@Autowired依赖注入获取实现类对象


例如上面是一个StudentMapper接口,我们可以定义一个StudentMapper studentMapper并在上面加一个@Autowired,就会根据StudentMapper这个字段的类型到Spring中去寻找是否有StudentMapper的实现类对象(由mybatis和spring共同提供)


202404111054630.png

Maven

文件分布

pom.xml-->标志当前是一个maven项目,maven的配置文件
main-->主体文件
test-->单元测试文件
java->.java文件
resources->处理.java文件都可以存放,配置文件,静态资源文件

202404131109498.png

Maven是为了让构建过程能够尽可能自动化完成,所以必须约定目录结构的作用

pom文件

在pom.xml中最重要的是

202404131123099.png

<!-- 坐标信息 本工程坐标信息 每个maven项目都有唯一的坐标--> <!--怎么配置本工程坐标信息 项目:(只有一个项目) groupId:(反域名) com.baiidu artifactId:当前项目名 模块:(当前项目中的一个模块) OA(前台、后台、common) groupId:(反域名) com.baiidu.oa artifactId:当前模块名 --> <groupId>org.example</groupId> <artifactId>Test</artifactId> <version>1.0-SNAPSHOT</version>

模块表示只是当前项目中的一个模块,例如有前台和后台,前台和后台又有相同的部分即common,前台后台和common一起成为聚合maven项目

  1. 引用jar包,依赖

一般存放在dependencies标签中

<!--怎么通过一个坐标信息引用一个jar包,通常叫做依赖--> <dependencies> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api 中央仓库--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> </dependency> </dependencies>

jar包的寻找

202404131143039.png

2.属性变量

存放在properties标签中

<!-- 属性 变量 通常设置依赖的版本 好处:同一管理版本--> <properties> <project.build.sourceEncoding> UTF-8</project.build.sourceEncoding> <javax.servlet.version>3.1.0</javax.servlet.version> </properties>

3.设置打包方式,默认是jar包

使用packaging标签,

<!-- tomcat的打包方式是war包, --> <packaging>war</packaging>

4.依赖范围

scope标签去划定范围

范围

  • 编译(main/java)
  • 测试(main/test)
  • 运行打包(包内)

202404131919640.png

因为上述使用了<scope>test</scope>所以引用的serlet依赖只能在test中使用,例如junit

<scope>provided</scope>可以在编译、测试中但是不能用在打包中,例如servlet,因为tomcat的lib中有serlet的依赖

<scope>compile</scope>默认的,编译、测试、打包都可以

<scope>runtime</scope>可以在测试、打包中使用。通常用于反射,数据库驱动class.forName()

<scope>system</scope>等同于provided,但是引用的是本地物理路径的jar包,通常需要使用systemPath标签去指定一个物理路径

5.依赖传递

注意:war包不能被传递

202404131940419.png

创建一个bproject项目作为hello的依赖

202404131944389.png

将bproject的坐标放入hello的pom的dependency标签中,在没有使用<scope>provided</scope>hello就可以使用bproject中的依赖,当然<optional>false</optional>也有类似效果

6.依赖排除和覆盖

  • 可以使用exclusion标签来将不想使用的依赖排除
  • 也可以直接使用新版本中的依赖去覆盖

7.聚合项目

好处:当聚合项目中的一个项目依赖另一个子项目时,我们不需要再次点击install来建立一个本地jar包,提高了效率

  • 把src删除,因为聚合项目通常只是管理子项目

  • 把packaging修改为pom包,表示当前不是一个具体的包

  • 把子工程管理起来

    使用modules标签

202404131958788.png

两个子项目分别为frontend、backend

8.maven继承

idea自动添加继承

202404132005503.png

手动添加

使用parent标签,再将其坐标放入其中

202404132006986.png

子项目的groupId和version可以省略掉,因为都会继承父maven的

对于子工程不需要的依赖可以放到dependencyManagement标签当中,如果想要使用的话可以直接使用dependency标签然后不需要加入version


通常在父maven中管理所有依赖的版本

java项目中的层次

1.DAO层
全称数据访问层,全称data access object,属于一种比较底层,比较基础的操作。具体到对于某个表、某个实体类的增删改查,即用于数据库的增删改查,表达的是对SQL语句的封装,建议对DAO只做原子操作。有多少张表就有多少个DAO层。在mybatis中,方法主要与xxx.xml内一一对应,相互映射。

2.Service层
全称业务逻辑层,在该层进行复杂的业务逻辑处理,且只专注逻辑处理,即对于多个dao层进行封装、处理。其中需要的数据库操作通过DAO层去实现。所以我们再Service层需要事务管理。

3.Controller层

Collertroler层俗称控制层,负责请求转发,接收页面(前端H5或者App)传过来的参数,并调用Service层中定义的方法进行业务操作,再将处理结果返回前端。

正向顺序

前端传入数据–>Controller层->Service层处理业务–>dao层数据库操作,之后依次返回