对于SpringBoot框架介绍大家可以看看这个这篇文章,SpringBoot优缺点以及如何安装使用
以下我是按照老师给的安装方法进行安装使用SpringBoot框架:
大家安装SpringBoot框架时候,最好安装3.0以下的,不然需要对应较高版本的JDK版本(Java Development ToolKit )以及较高版本的tomcat版本,会出现一些列问题,所以最好使用3.0以下的版本不要用最新的SpringBoot版本。
以下老师推荐使用2.x的SpringBoot,安装Tomcat9.0的版本。
由于要使用SpringBoot,我们准备新建一个聚合项目,以下图片仅仅只为记录我之前的项目的春出位置。
首先创建一个maven的聚合项目,命名framework,然后GroupId填写一下一般是com.+公司英文简称
由于这个项目我们不希望在里面写代码,主要的作用是聚合,我们主要是想在里面建子项目,为了不在IDEA中打开很多个项目而建的,所以我们就直接把src给直接去掉。
然后右键单击建子项目。
还是和之前一样的创建界面:
点击next之后我们能够发现和之前的还是有一定的区别,因为此次,我们是在framework下建的子项目,所有正在建的项目和framework实际上是父子关系,会有一个parent选项:
我们给子项目取一个名字:01-springboot-helloword,GroupId是直接继承framework项目的GroupId,即com.neuedu,如下图所示:
然后按照以下步凑进行:
1.首先引入引入springboot的parent
springboot项目文件的pom.xml是可以直接用外层的framework项目的pom.xml中的配置文件和依赖
也就是说我们不用一个一个添加dependency依赖,我们只需要最外层的项目的pom.xml添加dependency等需要的配置文件,内层的pom.xml就可以不用一一添加了,都可以直接使用parent项目中的pom.xml中的所有内容。只需要在parent项目中添加完依赖,子项目就都可以使用了。类似于java中的继承的关系。
我们先在最外层的framework项目中的pom.xml文件中编写如下代码
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.14</version>
</parent>
放置的位置如下
注意,在ctrl + shift +o之前的代码是红色的是正常的,并且IDEA会显示报错:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.14</version>
</parent>
实际上我们可以看到 <artifactId>spring-boot-starter-parent</artifactId>里面内嵌了很多东西,已经给我们定义好了启动mvc,tomcat,等的,所以只需要启动这一个就可以了。我们可以点进去看看ctrlr然后点进去看看内部结果:
不需要再像之前学校老师上课还需要启动tomcat容器,这里已经启动好了。
配置完成之后,就正常了,就不会报错了,如下所示:
然后我们需要在内部springboot项目中的pom.xml中添加一个
<dependencies></dependencies>,我们想要用SpringBoot,就得在<dependencies></dependencies>启动一个MVC的框架。
=========================================================================
这里有个小的提示事项:我们之所以要写成parent加子类的形式,是因为为了对应版本号,父类的<parent></parent>中需要对应版本号,而子类中的<dependencies></dependencies>就不需要写版本号了,由于继承关系会自动对应相应的版本号,保证不会出现版本问题;这是写成一个父项目加子项目的一个重要原因,避免因为版本问题,项目跑不起来。
framework中的<parent></parent>中的一个最大的作用就是,统一jar包的版本号,避免程序因为版本问题跑不起来。
=========================================================================
然后我们将以下代码加到内层springboot项目中的pom.xml的之前写的<dependencies></dependencies>中,进行springMVC框架的配置,然后ctrl +shift+o即可完成配置:
<!-- mvc的框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
这里我要说明一下一般来说<dependency></dependency>由三部分组成,即<groupId><artifactId><version>,但是这里之所以没有写version,前面有提到过,是为了避免版本错误,让framework中的pom.xml中的<parent></parent>自动为我们对应版本,以避免因为项目与项目之间的版本对应不上,项目而无法执行。
然后我们在spring项目的java源文件中,写一个main函数启动前面配置的springMVC中的框架。
我们在蓝色java文件中创建一个com.neuedu包,然后创建一个App的java class文件:
我们在主函数中启动一个容器,用于替换掉servlet API,不需要我们自己写servlet(Servlet是java语言编写的运行在服务器端的程序)了
这个App.class上面需要一个注解@SpringBootApplication
然后我们就需要写之前介绍的三层架构了,controller ,service ,dao(已经被mybatis代替 )
首先我们写一下controller,创建在com.neuedu下面
然后我们添加一个注解@RestController
controller(相当于原来的servlet,实际上还是servlet那些东西只是做了一些封装而已)层能够访问我们的数据库 (也可以写service层,调用dao,调用JDBC)
我们先写一个测试的代码:
比如我们想要从数据库查询一个集合,然后放到一个页面上去。我们模拟一下从数据库中查询出阿里的信息。
我们添加一个@RequestMapping的注解用于建立请求URL和处理请求方法之间的对应关系。
URL是Uniform Resource Locator(统一资源定位器) 它是专为表示网路上资源位置而设的一种编码方式。
URL一般是由三部分组成
1,应用层协议。
2,主机IP地址或域名。
3,资源所在路径/文件名。
URL的格式如下:
应用层协议://主机IP或者域名/资源所在路径/文件名
我们先写一个List类型的数,模拟是从数据库上面取出的(实际上是我们自己手动插入的数据)
然后我们启动一下:
首先进入App java class文件中启动SpringBoot的一个容器:
执行代码之后,我们可以看到他启动了一个容器叫做Tomcat
正常我们访问servlet得有一个URL,这里需要我们去构造一下。
我们可以首先在UserController的的注释里面写:
其中文本注释的快速写法是:
先写一个/**
然后回车就可以形成可以写注释的区域:
然后可以通过以下url访问刚刚发布的list文件里面的资源:
http://localhost:8080/list
如下图所示:
同理我们也可以将数据库中的数据打印在网页上面
以下演示一下利用SpringBoot框架打印出数据中的内容。
我们创建一个entity实体层用来接收从数据库中去取出的数据。
在实体层中创建一个User对象
编写几个简单的属性,
利用generate生成set get方法。
然后再利用generate生成函数的构造方法:
有参的构造函数和无参的构造函数都写一下,
先生成有参的构造方法:ctrl按住不放一个一个选中然后点击ok就可以了
即生成了有参的构造方法;
然后再点击generate中的constructor生成无参的构造方法:
只需要点击selec none即可生成无参的构造方法:
然后我们就可以将之前的list以user实体对象的形式,插入实体对象了。
以下仍然是模拟从数据库中查出来的数据:
然后我们重新启动一下容器:
然后,我们再看看http://localhost:8080/list是否发布成功了:
http默认的端口号就是tomcat的端口号。
https 实际上就是http+SSL 端口号为443.
如何将8080容器改成80端口的容器,然后敲击地址的时候80可以省略、
==========================================================
然后我们就需要在resources文件中配置SpringBoot配置所需要的配置文件了。
首先我们需要在resource里面创建一个后缀名为properties或者yml /yaml的文件。
我们可以在新创建的properties.properties文件中将端口号改成我们自己设置的一个数值,比如说70,以后我们访问的时候就不用8080了而是用70
按照一下路径访问:http://localhost:70/list
我们还可以使用
server.port=70 server.servlet.context-path=/springboot
输入的时候用http://localhost:70/springboot/list
输入网址进去之后,
由于没有80端口被占用了,无法启动,所以就没有使用80端口作为替换,80端口输入后,浏览器上会省略。例如输入http://localhost:80/springboot/list回车之后,浏览器上就只有localhost:springboot/list了。但是换成其他端口不行。例如换成70,回车之后还是会出现端口号:
然后我们还可以在yml文件下进行书写,我们可以将application.properties中的注释掉,然后再yml文件下进行书写,yml文件下写和在properties文件下写法有些不同。
yml文件中的server的配置是以树形结构的形式进行配置的。
port之前还有两个空格,然后port和90之间还有1个空格。
然后我们重新启动一下,报错了,原因是context:path:和后面新加的路径也要空一格,不空格的话,不会出现橙色高亮,也就不能执行,如下图所示就不行
我们在context:path:和后面新加的路径添加空格之后,context:path就变成高亮
然后再重新启动容器就可以发布了:
然后我们以http://localhost:90/springboot/list就可以访问发布的数据了
=========================================================================
当然以上操作全都使用默认的也行,即http://localhost:8080/list,以上操作是为了和后面的mybatis整合做铺垫。
下面我们就开始将mybatis整合到SpringBoot里面了
补充这个注解才能加载application.properties
下面我们模拟一下三层架构:
先构造一个包,controller包已经之前构建了,我们在构建一个service包
service里面我们模拟的是用户的业务逻辑。在service我们创建一个java class 类UserService。
我们在UserService里面写一个用户的查询,之前在controller里面我们写的是假的查询(手动插入数据)
现在我们写一个真的访问数据库的用户查询。
但是service层之前我们说了是负责业务的,负责跟JDBC打交道的是dao。(data access object)
于是除了三层架构之外,我们再加一个dao层
然后在这下面建一个UserDao 的java class文件
其实这两步一步就可以完成点击创建java class文件然后输入dao.UserDao即可创建一个dao包,然后再在dao的包下面创建一个UserDao的java class文件。
以下现用UserService模拟调用UserDao访问数据库(实际上还是在访问手动插入的数据,后面会换成访问JDBC)
大家可以看到我们在使用userDao的时候使用了new 对象,但是实际上,我们可以通过依赖,将new封装到容器中,按照以下方式进行即可。
在UserDao java class文件中的函数类头部,添加一个注解,这就在容器中声明了UserDao这个对象了,
然后再在UserService对象里面添加一个注解@Autowired
然后直接就可以直接申明容器里面已经有的对象了,即从容器中拿一个userDao对象放到UserService里面。
那么UserService也是需要一个容器管理起来,所以我们可以写一个@service然后UserService和UserDao都可以被容器管理起来了。
其实@Service和注解@Repository我们可以统一地用@Component来表示容器,之所以用@Service和注解@Repository @Controller来表示容器,实际上还是体现了一种三层架构的概念,区分3个不同的层。
为什么写一个@Service和注解@Repository @Controller,就好使了,是因为App java class文件下的@SpringBootApplication的作用,我们点进去看,可以看到加载@SpringBootApplication注解之后,就能够进行构建扫描看是service,repository,controller中的哪一种。
@SpringBootApplication的扫描方式是扫描com.neuedu包,以及com.neuedu的子包。
我们尝试一下,如何从容器中获取对象。我们可以在test中写一个测试的方法。这里又要运用到单元测试的方法了。首先需要我们需要添加一个依赖——添加devtools的依赖:
找到springboot的项目的pom.xml文档加依赖,记得ctrl + shift +o,我们可以看到我们仍然没有写版本号<version></version>因为在父项目里面我们已经规定好了。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
如下图所示:
在安装好的配置文件里面我们可以看到含有junit(单元测试)需要的配置文件。
然后我们就可以创建Test的java class文件进行测试了:
首先我们想要测试的是UserService对象从容器中能否获取到。
在service中想要用容器中的dao,应该@Autowired
如下所示:
但是要想不在main进行测试,就需要添加注解启动容器。
@SpringBootTest其实和之前使用@Test进行单元测试原理差不多。
@SpringBootTest是加载容器入口类App
然后再编写测试函数,仍然要添加@Test注解
然后我们执行一下进行测试。
因为这个过程需要加载容器,因此是比较慢的,右下角是绿色的,说明执行成功了,然后控制台上面也是打印出了相应的对象。
上到这里实际上Springboot主要就说了两件事,一个是自动配置,一个容器,都是以App入口的注解作为启动,
该注解里面具有扫描包的作用的类。
========================================================================
然后下面我们开始将mybatis整合到SpringBoot中。
我们在framework框架之下新建一个项目,整合mybatis。
我们先将springboot-01项目中使用的pom.xml中,添加的springboot的配置依赖以及单元测试所需要的依赖,添加到springboot-02所需要的依赖当中。
以下是新建的APP02填写的代码:注意controller,service一定要放在com.neuedu.mp中否则扫描不到比较麻烦。
然后下面编写UserController java class文件
@RestController //@Controller + @ResponseBody实际上是这两个的集合,返回到浏览器
然后我们编写以下函数到UserController函数体中:
然后我们执行一下,可以看到是能够执行成功的。
在浏览器中打开也是没有问题的;
证明我们mvc的程序是okk的,接下来我们整合mybatis
首先用到数据库了,我们得把mysql的驱动装上。
安装这几个依赖
<!-- 连接数据库,需要用到数据源-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 简化sqlsessionfactory重复的模块,需要添加自动配置-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!--mysql的驱动的安装-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
然后我们运行一下会发现报错,是因为连接数据的url没有给出。
连接数据库肯定是需要数据源的,因此我们需要在配置文件里面写url。
添加之后我们在执行就没有问题了
加上之后我们就执行成功了:
以下代码,我们后期将不用再重复写,我们直接会用其他的一句代替。
我们只需要写方框之下的mapper对象了,于是我们创建一个mapper包的对象。
‘’
然后我们还需要写一个代码对应的sql语句:我们创建一个包和com.neuedu.mp同名方便对应 。
将以下代码复制到UserMapper.xml文件中,然后进行调试:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.neuedu.mybatis.mapper.UserMapper">
<select id="list" resultType="map">
select * from ums_user
</select>
</mapper>
然后修改成一一对应
然后表的名字也换一下:换成nefu中表格
然后再APP02中写上注解,
@MapperScan("com.neuedu.mp.mapper")
然后再UserMapper中添加上
@Repository
APP02就可以直接使用UserMapper中的代理对象了。