SpringBoot精髓就在于“自动配置”。它能够快速的实现各种框架的整合,并自动配置好大部分的功能。
他不算是一个单独的、为实现某一个特殊功能的框架,它最大的作用就是“整合框架”、“快速开发”。
Spring 框架包含几十个不同的子项目,涵盖应用开发的不同方面。如此多的子项目和组件,一方面方便了开发人员的使用,另外一个方面也带来了使用方面的问题。每个子项目都有一定的学习曲线。开发人员需要了解这些子项目和组件的具体细节,才能知道如何把这些子项目整合起来形成一个完整的解决方案。在如何使用这些组件上,并没有相关的最佳实践提供指导。对于新接触 Spring 框架的开发人员来说,并不知道如何更好的使用这些组件。Spring 框架的另外一个常见问题是要快速创建一个可以运行的应用比较麻烦。
SpringBoot就用于解决以上问题。
他能够快速创建Spring项目,并自动配置 Spring 的各种组件,且不依赖代码生成和 XML 配置文件。Spring Boot 也提供了对于常见场景的推荐组件配置。Spring Boot 可以大大提升使用 Spring 框架时的开发效率。
当我们需要使用一个第三方包的时候,我们需要导入jar。
同理,在springboot中,我们需要使用一个第三方框架的时候,我们需要导入starter。
starter与jar最大的不同就在于,它附加了各种自动配置。
starter | 介绍 |
---|---|
spring-boot-starter-web | 支持 Web 应用开发,包含 Tomcat 和 spring-mvc。 |
spring-boot-starter | 核心 POM,包含自动配置支持、日志库和对 YAML 配置文件的支持。 |
spring-boot-starter-amqp | 通过 spring-rabbit 支持 AMQP |
spring-boot-starter-aop | 包含 spring-aop 和 AspectJ 来支持面向切面编程(AOP)。 |
spring-boot-starter-batch | 支持 Spring Batch,包含 HSQLDB。 |
spring-boot-starter-data-jpa | 包含 spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA。 |
spring-boot-starter-data-mongodb | 包含 spring-data-mongodb 来支持 MongoDB。 |
spring-boot-starter-data-rest | 通过 spring-data-rest-webmvc 支持以 REST 方式暴露 Spring Data 仓库。 |
spring-boot-starter-jdbc | 支持使用 JDBC 访问数据库 |
spring-boot-starter-security | 包含 spring-security。 |
spring-boot-starter-test | 包含常用的测试所需的依赖,如 JUnit、Hamcrest、Mockito 和 spring-test 等。 |
spring-boot-starter-velocity | 支持使用 Velocity 作为模板引擎。 |
spring-boot-starter-websocket | 支持使用 Tomcat 开发 WebSocket 应用。 |
spring-boot-starter-ws | 支持 Spring Web Services |
spring-boot-starter-actuator | 添加适用于生产环境的功能,如性能指标和监测等功能。 |
spring-boot-starter-remote-shell | 添加远程 SSH 支持 |
spring-boot-starter-jetty | 使用 Jetty 而不是默认的 Tomcat 作为应用服务器。 |
spring-boot-starter-log4j | 添加 Log4j 的支持 |
spring-boot-starter-logging | 使用 Spring Boot 默认的日志框架 Logback |
spring-boot-starter-tomcat | 使用 Spring Boot 默认的 Tomcat 作为应用服务器。 |
本项目包含
- 基本的web项目
- 整合log4j2
- 整合druid
- 整合mybatis,并使用逆向工程
- 实现登录功能
打开idea,点击Create New Project ,选择 Spring Initialize,在点击Next。
输入工程信息,我更改了3处,其余没有更改。可能有的将Artifact中内容输入大写英文导致报错,更改为小写即可。
勾选图片右边所需要的驱动和依赖。
修改和保存工程。
最终项目目录如下:
项目创建完成默认使用application.properties作为配置文件,这里推荐将其删除,然后创建一个application.yml作为替换。
因为yml语法干净整洁,配置结构十分清晰。
使用properties的话,当配置多了之后阅读比较困难。
Springboot自带的日志框架是logback,我们改用口碑更好的log4j2
整合原理可以查看这里,在此不赘述,直接使用Springboot提供的最简便的方法。
在pom文件中的任意空白处右键,查看依赖
找到spring-boot-starter-logging,对其右键选择Exclude去除(因为直接查看logback的starter不容易找到,我们这里通过IDEA依赖导图就可以实现去除)
然后在pom中加入spring-boot-starter-log4j2即可
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-log4j2artifactId>
dependency>
Druid是阿里的一个数据库连接池,自带数据库监控后台,非常方便。
导入依赖
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.10version>
dependency>
配置application
注意更改自己的用户名和密码,以及访问地址。我这里配置的用户名是abc,密码是123,访问地址是:项目地址/druid/*
#数据库配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/crud?serverTimezone=UTC
username: root
password: 123456
#druid配置
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 5000
# 监控过滤器
web-stat-filter:
enabled: true
exclusions:
- "*.js"
- "*.gif"
- "*.jpg"
- "*.png"
- "*.css"
- "*.ico"
- "/druid/*"
# 配置druid 监控页面
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: false
login-username: abc
login-password: 123
# 开启sql查询状态监控
filter:
stat:
db-type: mysql
enabled: true
log-slow-sql: true
slow-sql-millis: 2000
配置完毕之后输入项目地址(我这已经改成80端口了,因此访问地址没有端口号,默认端口8080)
可以看到Druid提供了很多功能
以下涉及路径配置,需要根据自己的项目名字进行更改。直接照抄一定无法运行!
我们在创建项目的时候已经选择了mybatis依赖,因此这里不用再导入了。
创建项目运行入口文件(Application)同级目录下(项目目录下)创建model文件夹,并写好User的javabean,然后根据自己的项目名称编写yml配置
mybatis:
mapper-locations: classpath:mapper/*.xml # 修改为mapper映射xml文件的所在路径
type-aliases-package: com.sbdemo.model # 修改为对应实体类的路径
添加逆向工程插件:mybatis genreator以及约束插件(mybatis-generator-core这个是为了约束文件的正常使用)
<plugin>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-maven-pluginartifactId>
<version>1.3.1version>
<configuration> <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xmlconfigurationFile>
<overwrite>trueoverwrite>
<verbose>trueverbose>
configuration>
plugin>
<dependency>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-coreartifactId>
<version>1.3.5version>
dependency>
对应上面的插件配置信息,在src/main/resources中创建generator文件夹,和创建generatorConfig.xml文件。
xml中的jar包地址、数据库名、密码、自动生成的包路径和表名都需要根据自己配置进行修改。
<generatorConfiguration>
<classPathEntry location="C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\8.0.18\mysql-connector-java-8.0.18.jar"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="false"/>
<property name="suppressAllComments" value="true"/>
commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1/crud?serverTimezone=UTC" userId="root" password="123456">
<property name="nullCatalogMeansCurrent" value="true"/>
jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
javaTypeResolver>
<javaModelGenerator targetPackage="com.pb.crud.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
javaModelGenerator>
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.pb.crud.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
javaClientGenerator>
<table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
context>
generatorConfiguration>
添加完成后在run中配置—>Edit Config—>+—>Maven进行配置,在Name中输入:generator,在Command line 中输入:mybatis-generator:generate -e,后点击OK。
将mybatis改为mybatis-plug,只需要把依赖换了,把配置中的mybatis改成mybatis-plug即可
此时Dao层就已经算是写好了,完整的web项目还差 service、controller、view
在resorces包下的mapper的UserMapper.xml中编写sql语句,并确保namespace、resultType、parameterType所对应的路径以及类名正确。
<mapper namespace="com.sbdemo.mapper.UserMapper" >
<select id="userLogin" resultType="com.sbdemo.model.User" parameterType="com.sbdemo.model.User">
select username , password from user where username = #{username} and password = #{password}
select>
mapper>
编写mapper中的UserMapepr.java,我将原来自动生成的代码全部删除。
package com.sbdemo.mapper;
import com.sbdemo.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
@Mapper
@Component
public interface UserMapper {
//用户登录
User userLogin(@Param("username") String username, @Param("password") String password);
}
注意!
Mapper虽然是接口,但是必须加上
@Mapper
@Component
才能实现自动配置
创建Service文件夹,编写UserLoginService.java类。
package com.sbdemo.service;
import com.sbdemo.model.User;
import com.sbdemo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserLoginService {
//注入dao
@Autowired
private UserMapper userMapper;
//用户登录
public User userLogin(String username, String password){
User user = userMapper.userLogin(username,password);
return user;
}
}
package com.sbdemo.controller;
import com.sbdemo.model.User;
import com.sbdemo.service.UserLoginService;
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;
@Controller
@RequestMapping(value = {"/user"})
public class UserLoginController {
@Autowired
private UserLoginService userLoginService;
//访问登录页面:/user/loginPage
@RequestMapping(value = {"/loginPage"})
public String userLogin(){
return "UserLogin";
}
@RequestMapping(value = {"/userLogin"})
public String userLogin(@RequestParam("username")String username,@RequestParam("password")String password){
User user = userLoginService.userLogin(username,password);
if(user != null){
return "Success"; //跳转成功界面Success.html
}
return "Error";
}
}
最后编写登录页面UserLogin.html,成功页面Success.html,错误页面Error.html,注意名字是否与controller返回值一致,和跳转链接是否正确。
登录页面UserLogin.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
用户登录
<form action="/user/userLogin" method="post">
账号:<input type="text" name="username"/><br>
密码:<input type="password" name="password" /><br>
<input type="submit" value="登录" /><a href="#" >注册a>
form>
body>
html>
成功页面
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录成功title>
head>
<body>
<h1>恭喜你成功登录h1>
body>
html>
错误页面Error.htm
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录失败title>
head>
<body>
<h1>登录失败,请重新<a href="/user/loginPage">登录a>h1>
body>
html>
Alt+回车 导入包,自动修正
Ctrl+N 查找类
Ctrl+Shift+N 查找文件
Ctrl+Alt+I 格式化代码
Ctrl+Alt+O 优化导入的类和包
Alt+Insert 生成代码(如get,set方法,构造函数等)
Ctrl+E或者Alt+Shift+C 最近更改的代码
Ctrl+R 替换文本
Ctrl+F 查找文本
Ctrl+Shift+Space 自动补全代码
Ctrl+空格 代码提示
Ctrl+Alt+Space 类名或接口名提示
Ctrl+P 方法参数提示
Ctrl+Shift+Alt+N 查找类中的方法或变量
Alt+Shift+C 对比最近修改的代码
Shift+F6 重构-重命名
Ctrl+Shift+先上键
Ctrl+X 删除行
Ctrl+D 复制行
Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/…/ )
Ctrl+J 自动代码
Ctrl+E 最近打开的文件
Ctrl+H 显示类结构图
Ctrl+Q 显示注释文档
Alt+F1 查找代码所在位置
Alt+1 快速打开或隐藏工程面板
Ctrl+Alt+ left/right 返回至上次浏览的位置
Alt+ left/right 切换代码视图
Alt+ Up/Down 在方法间快速移动定位
Ctrl+Shift+Up/Down 代码向上/下移动。
F2 或Shift+F2 高亮错误或警告快速定位
代码标签输入完成后,按Tab,生成代码。
选中文本,按Ctrl+Shift+F7 ,高亮显示所有该文本,按Esc高亮消失。
Ctrl+W 选中代码,连续按会有其他效果
选中文本,按Alt+F3 ,逐个往下查找相同文本,并高亮显示。
Ctrl+Up/Down 光标跳转到第一行或最后一行下
Ctrl+B 快速打开光标处的类或方法
单击+Shift+单击可选中两次单击之间的内容