SpringBoot基础学习(一)

前言

项目主体源码可以从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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值