文章目录
一、写在前面
对于我而言,在此之前没接触过SpringBoot,也从来没用IDEA写过东西,没用过postgresql,也没用过MyBatis,本来是想自己试着用SSM写一个登录Demo的,但是Spring的注解注入也没怎么接触过,也从来没有自己从头到尾用过SpringMVC,实习的时候接触过一点,但都是在别人代码的基础上进行开发。在这么多新的东西面前,报错变得很难解决,因为我没办法确定是IDEA配置问题还是某段代码问题,甚至连怎么在IDEA中进行打包部署都不清楚,所以最后我选择了在看文字材料速成的同时看一个视频,先简单地跟着视频敲。
现在只是跟着视频对整个框架有个大概的了解,很多知识点也并不是十分清楚为什么,之后有空的话我也会去阅读一下官方文档,并整理成博客。写这篇博客是因为我喜欢看文字多于视频,并且也会对一些自己需要的内容进行补充,希望也能给和我一样新入坑的人带来一点帮助。
最后,放上我参考的视频链接:SpringBoot构建电商基础秒杀项目
二、安装IDEA并配置Maven
在开发前,希望你已经完成了对IDEA的Maven配置,如果没有,请参考使用intellij idea创建maven项目,在这篇博客里也有链接指向如何安装IDEA,因此在本文中我不再赘述如何安装IDEA并进行Maven的配置。
三、SpringBoot是做什么的?
1、简化Maven依赖配置
我们只要在创建SpringBoot项目时勾选自己想要集成的例如MyBatis,SpringBoot就会自动在pom文件中引入对应的依赖包,且会自动选择相应的版本。
2、简化被整合的框架配置(自动配置Spring)
Spring Boot 会根据在类路径中的 jar 包、类,为 jar 包里的类自动配置 Bean,这样会极大地减少我们要使用的配置。如果对Spring自动装配的bean不满意也可以通过复制代码段到自己的内容中并添加@Bean注解使其变成可控代码(可进行修改),此时自动装配不会生效。
3、简化部署运维
SpringBoot内嵌Tomcat,运行即可启动,并默认将项目打包成可执行jar,无需对项目进行local server的配置再以war包形式部署。且SpringBoot的配置项集中在application.properties中,大大减少了xml配置。提供了各种endpoint以便运维。
四、创建一个SpringBoot工程
1、通过IDEA的SpringInitializr创建
左上角 File-New-Project-Spring Initializr
Next->名称啥的自己设一下->Next->选择需要的依赖包,这里暂时是选择了Spring Web相关、mybatis相关以及postgresql相关包。
其他没什么特别的,项目建成之后目录结构是这样的:
这里会有一个叫xxxApplication的启动类,然后pom.xml里会有刚刚设置过的相关依赖包,不需要自己再引入,同时resources下会有一个application.properties,此时它是空的。到这里一个SpringBoot项目就这么简单地创建好了,非常方便,当然现在还是不能启动的,这个后面再说。
注:如果生成的pom文件有部分依赖为红色,那么先reload project(即reimport),如果还没有解决则检查自己的maven设置,无误则可能是镜像设置问题,可以多配几个国内镜像试试,可以参考IDEA中部分依赖包下载失败 提示cannot resolve plugin xxx
2、通过官网创建
官网网址:https://start.spring.io ->点击此处链接到官网
在serch for dependency中输入想搜索的依赖包并选择,选择完成后点击下方的绿色按钮Generate Project即可创建一个springboot工程,并且自动下载到本地,接下来直接在idea或者eclipse打开该工程就可以了。
五、安装并创建PostgreSQL数据库
1、安装地址
PostgreSQL下载地址
安装比较容易,不多说了,但是记得顺便把pgAdmin装一下。
2、建表
pgAdmin这个东西呢,我也是第一次接触,但是现在就是想简单地建个表,就随便建了一个。结构如下图哈,其中postgres是数据库名,在Tables处右键-create-table,在弹出来的框里填写表名然后增加column的name和datatype就可以了。
在这里我新建了一张叫my_user的表,两列为username和password,数据类型都为text。
3、插入数据及设置主键
接下来就是插入数据并设置username为主键。
右键表名->Query Tool,在右边的Query Editor中编写SQL语句并执行就可以了(当然直接右键-查询,在查询结果处点击也可以方便地插入数据),这里我们简单地插入一条数据,SQL语句如下
INSERT INTO my_user
VALUES('yogi','123456')
主键可以不需要写sql,直接在Constaints上右键选择Primary Key,输入key的名字并选择column即可。
数据库创建完毕,但是有一个注意事项
4、注意事项!非常重要!
PostgreSQL本身大小写不敏感,但是在这里【非常不推荐】使用大写字母。首先带有大写字母的表的新建和查询时表名都必须带双引号,不然会报【error】postgresql relation does not exist。也即你可以SELECT * FROM "MyUser"
,但是不可以SELECT * FROM MyUser
。如果仅仅是这样也还是没有问题的,但是如果有大写字母,在后面使用Mybatis Generator生成DO类的时候会报错:Table configuration with catalog null, schema public, and table xxx did not resolve to any tables.就是因为有大写字母引起的,我尝试了在my-generator.xml配置中设置表名为tableName=""MyUser""
(我刚开始创建的表名叫MyUser),引入了"的转义字符,但是并没有效果,最后还是新建了一张叫做my_user的表。
六、编写application.properties,启动项目
项目刚刚创建好的时候是不能运行的,运行会报错:Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.
这个错误就是由于没有编写application.properties,找不到数据库的URL。
配置如下,其中Tomcat端口也可以不改,那就是8080,我是为了防止端口冲突,就随便改了一个。url在数据为postgresql时是jdbc:postgresql://localhost:5432/[数据库名]
后面是用户名和密码,我直接postgres登录的。
#更改Tomcat端口
server.port=8087
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=123456
这个时候已经可以成功启动项目了,但是由于啥都还没写,所以访问localhost:8087(注意自己的端口号!)时web页面上显示的会是Whitelabel Error Page。
我们对生成的ExampleApplication 文件稍微做一点修改
生成的文件如下:
package com.yogi.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ExampleApplication {
public static void main(String[] args) {
SpringApplication.run(ExampleApplication.class, args);
}
}
加入注释@RestController,以及根目录下的方法home,重新启动后再次进入就可以看到Hello World了。
package com.yogi.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class ExampleApplication {
@RequestMapping("/")
public String home(){
return "Hello,world!";
}
public static void main(String[] args) {
SpringApplication.run(ExampleApplication.class, args);
}
}
七、Mybatis Generator工具
Mybatis generator工具可以由数据库表自动生成相应的DO类、Dao类和Mapper文件。
1、引入依赖
原有自动生成的pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yogi</groupId>
<artifactId>example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>example</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在<plugins>
标签下添加新的<plugin>
,添加完之后的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yogi</groupId>
<artifactId>example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>example</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1201-jdbc4</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>mybatis generator</id>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 允许移动生成的文件 -->
<verbose>true</verbose>
<configurationFile>
src/main/resources/mybatis-generator.xml
</configurationFile>
</configuration>
</plugin>
</plugins>
</build>
</project>
2、mybatis-generator.xml
在resources目录下创建mybatis-generator.xml,这个文件在官网有示例,copy下来改一改就行。
要改的就是数据库链接地址(如果数据库不同),URL记得换成自己的数据库名,然后用户名和密码也要改。以及后面的targetPackage和targetProject。注意如果targetPackage写的包要存在,如果没有的话先新建包,再把对应的包写上去。在这里我新建了dataobject、mapping以及dao包。
table部分每一张表都要写一个table标签,这里只建了一张表因此就一个示例。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 数据库链接地址及账号密码 -->
<jdbcConnection driverClass="org.postgresql.Driver"
connectionURL="jdbc:postgresql://localhost:5432/postgres"
userId="postgres"
password="123456">
</jdbcConnection>
<!-- 生成Model类(即数据表对应的DTO类)的存放位置 -->
<javaModelGenerator targetPackage="com.yogi.example.dataobject" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成映射文件存放位置 -->
<sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成Dao类存放位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.yogi.example.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 生成对应表及类名 这个是会生成Example的,有一些复杂查询,但很多时候并不需要 -->
<!--
<table tableName="my_user" domainObjectName="MyUserDO"></table>
-->
<!-- 生成对应表及类名 但不生成复杂查询 -->
<table tableName="my_user" domainObjectName="MyUserDO" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
此时的目录结构:
注意添加了mapping之后需要在application.properties中添加:
mybatis.mapper-locations=classpath*:mapping/*.xml
3、自动生成
左上选项 Run->Edit configurations
跳出框框后点击+,选择Maven
输入mybatis-generator:generate,完成。
点击run就可以看到生成的文件了。
八、调用自动生成的方法
在这里我们只是简单地看一下mybatis是否集成成功,所以直接修改ExampleApplication的代码进行调用,未分层,代码如下:
package com.yogi.example;
import com.yogi.example.dao.MyUserDOMapper;
import com.yogi.example.dataobject.MyUserDO;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication(scanBasePackages = {"com.yogi.example"})
@RestController
@MapperScan("com.yogi.example.dao")
public class ExampleApplication {
@Autowired
private MyUserDOMapper userDOMapper;
@RequestMapping("/")
public String home(){
MyUserDO userDO = userDOMapper.selectByPrimaryKey("yogi");
if(userDO == null){
return "用户不存在";
}else{
return userDO.getPassword();
}
}
public static void main(String[] args) {
SpringApplication.run(ExampleApplication.class, args);
}
}
就可以跑程序啦~run的时候记得run application 而不是run刚刚配置过得Maven命令
再次访问http://localhost:8087/,显示123456,成功。
九、使用SpringMVC方式
1、目录结构
设置controller层和service层,其中controller放的就相当于Struts2的Action,应该不难理解。
2、UserService和UserServiceImpl
其实也就是简单地调用一下userDOMapper而已,没什么两样,但是要给这个类加上@Service注解,/不过这里是为了简化直接把userDO返回去了,实际上在实际应用中很少会有这么做的时候,因dataobject只是对数据库的一个映射,而不代表真正的模型,比如和用户相关的信息分散在两张表中,那么真正的模型需要建一个UserModel类,把所有相关信息都放进来。
UserServiceImpl.java:
package com.yogi.example.service.impl;
import com.yogi.example.dao.MyUserDOMapper;
import com.yogi.example.dataobject.MyUserDO;
import com.yogi.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private MyUserDOMapper userDOMapper;
@Override
public MyUserDO getUserByName(String username) {
MyUserDO userDO = userDOMapper.selectByPrimaryKey(username);
return userDO;
}
}
UserService:
package com.yogi.example.service;
import com.yogi.example.dataobject.MyUserDO;
public interface UserService {
MyUserDO getUserByName(String username);
}
3、UserController.java
相当于Struts2的action,需要加注解@Controller
这里其实在实际应用中也并不能直接返回MyUserDO,因为可能有部分内容不适合或者不需要给到前端,比如密码,这时候就要创建VO类(viewobject)去掉这部分属性,再返回VO类即可。但是这里也为了简化,我们就直接返回了。
package com.yogi.example.controller;
import com.yogi.example.dataobject.MyUserDO;
import com.yogi.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/get")
@ResponseBody
public MyUserDO getUser(@RequestParam(name="username") String username){
MyUserDO userDO = userService.getUserByName(username);
return userDO;
}
}
4、启动项目查看结果
到这里一个简单的demo就完成啦。
启动项目后在浏览器地址栏输入http://localhost:8080/user/get?username=yogi
显示{“username”:“yogi”,“password”:“123456”} 则说明成功~