前言
项目主体源码可以从SpringBoot获得,喜欢的朋友可以点个star~。
一、Spring Boot入门
Spring Boot简介
简化Spring应用开发的一个框架;
整个Spring技术栈的一个大整合;
J2EE开发的一站式解决方案;
YAML语法简介
properties和yaml方式对比
properties方式
environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
yaml方式
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
my:
servers:
- dev.bar.com
- foo.bar.com
yaml快速入门
YAML中允许表示三种格式,分别是常量值,对象和数组
#即表示url属性值;
url: http://www.wolfcode.cn
#即表示server.host属性的值;
server:
host: http://www.wolfcode.cn
#数组,即表示server为[a,b,c]
server:
- 120.168.117.21
- 120.168.117.22
- 120.168.117.23
#常量
pi: 3.14 #定义一个数值3.14
hasChild: true #定义一个boolean值
name: '你好YAML' #定义一个字符串
#对象
key:
child-key: value
child-key2: value2
语法规范
1、YAML大小写敏感;
2、使用缩进代表层级关系;
3、缩进只能使用空格,不能使用TAB,不要求空格个数,只需要相同层级左对齐(一般2个或4个空格);
Mac 搭建Mysql
Mysql默认安装位置/usr/local/mysql/bin,在安装的过程中会自动生成Mysql密码,可以在消息通知查阅。
vim ~/.bash_profile,编辑bash_profile,配置环境变量,PATH=$PATH:/usr/local/mysql/bin。
source ~/.bash_profile,此命令使得环境变量配置生效。(注: 可以关闭 terminal 再重新打开)。
SET PASSWORD FOR ‘root’@‘localhost’ = PASSWORD(‘root’);可以通过此命令设置新密码。
application全局配置
application.yml
person:
lastName: admin
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lishi
- zhaoyun
dog:
name: 小狗
age: 12
pom.xml
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
Person.java
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog;
}
Dog.java
public class Dog {
private String name;
private Integer age;
}
加载指定的配置文件使用如下注解
@PropertySource(value = {"classpath:person.properties"})
Profile
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境
方法一(多Profile文件)
文件名application.{profile}.properties/yml
默认使用application.properties的配置
方法二(yml支持多文档块方式)
server:
port: 8081
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
sp传入
profiles: prod
方法三(激活指定profile)
在配置文件中指定spring.profiles.active=dev
命令行: java -jar XXX.jar --spring.profile.active=dev;可直接在测试的时候传入命令行参数。
虚拟机参数: -Dspring.profiles.active=dev
thymeleaf基本语法
template fragments模板 th:fragment,接着我们可以使用th:include或者th:replace属性来使用它,其中th:include中的参数格式为templatename::[domselector],其中templatename是模板名(如footer),domselector是可选的dom选择器。如果只写templatename,不写domselector,则会加载整个模板。
也可以如下形式
<div th:include="footer :: (${user.isAdmin}? #{footer.admin} : #{footer.normaluser})"></div>
也可以通过dom选择器引用模板
<div th:include="footer :: #copy-section">
th:remove 删除代码
在HTML配置命名空间
<html xmlns:th="http://www.thymeleaf.org" >
国际化
第一步 添加properties(login.properties、login_zh_CN.properties、login_en_US.properties)
#login.properties
login.password=请输入用户密码~
login.signIn=登录
login.tip=请登录
login.username=请输入用户名~
#login_zh_CN.properties
login.password=请输入用户密码~
login.signIn=登录
login.tip=请登录
login.username=请输入用户名~
#login_en_US.properties
login.password=Please input password
login.signIn=Sign In
login.tip=Please sign in
login.username=Please input username
第二步 aplication.yml添加
spring:
messages:
basename: i18n.login
第三步 MyLocaleResolver添加
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
String l = httpServletRequest.getParameter("l");
Locale locale = Locale.getDefault();
if(!StringUtils.isEmpty(l)){
String[] split = l.split("_");
locale = new Locale(split[0],split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
第四步 MvcConfig添加
@Component
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/");
}
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
}
第五部 login.html添加
<html lang="en" xmlns:th="http://www.thymeleaf.org" >
<head>
<meta charset="UTF-8">
<title>登录</title>
<style type="text/css">
.inputDiv{
width:80%;
margin: 10px auto;
background:azure;
margin-left: 10%;
height:40px;
text-indent: 2em;
color:dimgray;
}
.divClz{
width:100%;
}
.btcSubmit{
width:40%;
height: 40px;
font-weight: bold;
background: cornflowerblue;
color:#fff;
border: 0px;
margin-left: 30%;
margin-bottom: 10px;
}
.loginClz{
width:30%;
background-color: #ccc;
margin: 100px auto;
margin-bottom: 0px;
}
</style>
</head>
<body>
<div class="loginClz">
<form style="width:100%;background:cadetblue;" action="" method="post">
<strong style="text-align: center;display: block;color: white;" th:text="#{login.tip}">Please sign in</strong>
<div class="divClz">
<input class="inputDiv" type="text" name="username" id="username" th:placeholder="#{login.username}" placeholder="请输入用户名!" />
</div>
<div class="divClz">
<input class="inputDiv" type="password" name="password" id="password" th:placeholder="#{login.password}" placeholder="请输入密码!" />
</div>
<div class="divClz">
<input class="btcSubmit" type="submit" id="signIn" th:value="#{login.signIn}" value="登录" />
</div>
</form>
</div>
<div class="loginClz" style="margin: 10px auto;text-align: center;height:30px;line-height: 30px;">
<a th:href="@{/login.html(l='zh_CN')}">中文</a>
<a th:href="@{/login.html(l='en_US')}">English</a>
</div>
</body>
</html>
简单登录&拦截器的实现
第一步 编写login.html、index.html
login.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" >
<head>
<meta charset="UTF-8">
<title>登录</title>
<style type="text/css">
.inputDiv{
width:80%;
margin: 10px auto;
background:azure;
margin-left: 10%;
height:40px;
text-indent: 2em;
color:dimgray;
}
.divClz{
width:100%;
}
.btcSubmit{
width:40%;
height: 40px;
font-weight: bold;
background: cornflowerblue;
color:#fff;
border: 0px;
margin-left: 30%;
margin-bottom: 10px;
}
.loginClz{
width:30%;
background-color: #ccc;
margin: 100px auto;
margin-bottom: 0px;
}
</style>
</head>
<body>
<div class="loginClz">
<form style="width:100%;background:cadetblue;" th:action="@{/user/login}" method="post">
<strong style="text-align: center;display: block;color: white;" th:text="#{login.tip}">Please sign in</strong>
<p style="text-align: center;line-height: 26px;color:darkred;" th:text="${message}" th:if="${not #strings.isEmpty(message)}"></p>
<div class="divClz">
<input class="inputDiv" type="text" name="username" id="username" th:placeholder="#{login.username}" placeholder="请输入用户名!" />
</div>
<div class="divClz">
<input class="inputDiv" type="password" name="password" id="password" th:placeholder="#{login.password}" placeholder="请输入密码!" />
</div>
<div class="divClz">
<input class="btcSubmit" type="submit" id="signIn" th:value="#{login.signIn}" value="登录" />
</div>
</form>
</div>
<div class="loginClz" style="margin: 10px auto;text-align: center;height:30px;line-height: 30px;">
<a th:href="@{/login.html(l='zh_CN')}">中文</a>
<a th:href="@{/login.html(l='en_US')}">English</a>
</div>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" >
<head>
<meta charset="UTF-8">
<title>首页</title>
<style type="text/css">
#head{
width:100%;
height:60px;
line-height: 60px;
text-indent: 2em;
background:#666666;
color:#ffffff;
}
</style>
</head>
<body>
<div id="head">[[${session.loginUser}]]</div>
</body>
</html>
为了方便页面调试可以在yaml文件配置thymeleaf缓存关闭
#页面重新编译command+F9
thymeleaf:
cache: false
第二步 编写LoginController.class
@Controller
public class LoginController {
@PostMapping(value = "user/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
Map<String, Object> map,
HttpSession session){
if(!StringUtils.isEmpty(username) && "123456".equals(password)){
//登录成功,防止表单重复提交,可以配置重定向到主页
session.setAttribute("loginUser", username);
return "redirect:main.html";
}else{
map.put("message", "用户名或密码错误!");
return "login";
}
}
}
第三步 编写登录拦截器,LoginHandlerInterceptor.class
/**
* 登录拦截器
*/
public class LoginHandlerInterceptor implements HandlerInterceptor {
//方法执行前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("loginUser");
if(user == null){
//未登录返回到登录页面
request.setAttribute("message", "没有权限请登录!");
request.getRequestDispatcher("/login.html").forward(request, response);
return false;
}else{
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
第四步 启用拦截器,MvcConfig.class
@Component
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/");
}
@Bean
public WebMvcConfigurer webMvcConfigurer(){
WebMvcConfigurer wmc = new WebMvcConfigurer() {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/user/main.html").setViewName("index");
}
//注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//在springboot静态资源不需要做映射,*.css、*.js这些资源都已经自动映射好了
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/login.html", "/", "/user/login");
}
};
return wmc;
}
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
}
springboot与mybatis的整合
application需要加上@SpringBootApplication和@MapperScan
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@MapperScan({"pers.springboot.dao"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
pom.xml配置需要注意的是mybatis-spring-boot-stater不要和mybatis-spring进行重复了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>compile</scope>
</dependency>
<!-- 通用 mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.7</version>
</dependency>
<!-- commons -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!--支持使用 JDBC 访问数据库-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--添加适用于生产环境的功能,如性能指标和监测等功能。 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Mysql / DataSource-->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<!--Json Support-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.43</version>
</dependency>
<!--Swagger support-->
<dependency>
<groupId>com.mangofactory</groupId>
<artifactId>swagger-springmvc</artifactId>
<version>0.9.5</version>
</dependency>
application.yaml配置,注意mybatis需要配置扫描,数据库连接池com.mysql.cj.jdbc.Driver新版本好像com.mysql.jdbc.Driver
server:
port: 8000
servlet:
context-path: /xipiker
spring:
messages:
basename: i18n.login
#页面重新编译command+F9
thymeleaf:
cache: false
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
#druid相关配置
druid:
#监控统计拦截的filters
filters: stat
driver-class-name: com.mysql.cj.jdbc.Driver
#基本属性
url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
username: root
password: root
#配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
#mybatis 配置
mybatis:
# type-aliases扫描路径
type-aliases-package: pers.springboot.domain
# mapper xml实现扫描路径
mapper-locations: classpath:mapper/*.xml
mybatis自动化
pom.xml 需要注意里面的内容为项目generatorConfig.xml所在的路径
<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.2</version>
<configuration>
<configurationFile>
/Users/mac/Desktop/ideaWork/SpringBootDemo/src/main/resources/config/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
</build>
generatorConfig.xml 需要注意
<?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>
<!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包-->
<classPathEntry location="/Users/mac/.m2/repository/mysql/mysql-connector-java/8.0.13/mysql-connector-java-8.0.13.jar"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1/springboot" userId="root" password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="pers.springboot.demo.domain" 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>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="pers.springboot.demo.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
<table tableName="t_user" domainObjectName="tUser" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
执行自动生成,命令:mybatis-generator:generate