SpringBoot开发及学习

Easter79
• 阅读 321

SpringBoot是Spring新出的一个框架,他的目的一如始初- 简化开发。我们开发项目的时候,为了让项目运行起来,我们要考虑很多架构、配置、依赖等问题,这些问题其实每个项目都要考虑,而且每个项目的开发都有固定的模版,这些重复的工作是每个项目的样板代码,SpringBoot做的就是帮我们完成这些重复行的工作,让我们只关注业务逻辑。

主要帮我们完成了以下几个部分:

1、自动装配:针对Spring应用程序常见的应用功能,SpringBoot自动提供相关的配置。

2、起步依赖:告诉SpringBoot需要什么功能后,他能帮我们引入需要的jar包。

3、命令行界面:这个这里不介绍。

4、Actuator:监控观察你的程序运行。

接下来,我们创建一个简单的SpringBoot应用:

一、创建骨架

我们要使用Spring Initializr 来生成一个项目框架,可以通过sts、idea、SpringBoot CLI和web界面来完成Spring Initializr 的工作,我们这里选用的是web界面,访问网址:http://start.spring.io/

SpringBoot开发及学习

根据你的情况,填写表单,点击generate Project 按钮,生成项目框demo.zip并下载到本地。这个框架除了业务代码,该有的都有了。将demo.zip复制到sts工作空间,解压后,删除多余的代码,只留下src文件夹和pom.xml文件,在sts中通过引入maven项目的方式引入demo项目。

SpringBoot开发及学习         SpringBoot开发及学习

SpringBoot开发及学习

pom.xml报错,原因是spring-boot-starter-parent默认用的是2.1.3,这里有的jar我的私服上下载不到,改成低点的版本2.0.2问题就解决了。如果你连接的是中央仓库,且网络通畅,是不会有这个问题的。

我们在Spring initializr中选择了web和mysql,给我们生成的pom.xml如下:

SpringBoot开发及学习 SpringBoot开发及学习

<?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 http://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.0.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

pom.xml

我们看的他给我们生成的项目结构是这样的,使用的jdk版本是1.8。(需要强调的是,SpringBoot使用的jdk版本要是1.8或高于1.8)

SpringBoot开发及学习

和我们以往的web项目比,最大的不同应该就是我们的项目里居然没有了web.xml,打包类型也变成了jar。那这样行不行呢?我们写个简单的action,启动一下应用试试。

SpringBoot开发及学习                       SpringBoot开发及学习

这里要注意的是,springBoot已经给我们内嵌了一个tomcat,所以我们不需要自己再搭建一个,因为是内置tomcat,我们的项目访问也有一点不同就是,访问的时候不需要加上项目名了,直接访问资源就可以,这里我们直接访问http://localhost:8080  就可以进入我们action。

启动:选中项目-> 右键debug as -> spring Boot app (其他启动方式可以参考https://my.oschina.net/oosc/blog/1627384)

SpringBoot开发及学习      打开浏览器,输入:http://localhost:8080      SpringBoot开发及学习

既然成功了,我们来逐一介绍一下,他给我们生成的东西都是干啥的:

1、SpringBoot开发及学习   2、application.properties默认是空的    3、SpringBoot开发及学习

这是为我们生成了一个基本骨架,那我们接下来要看,怎么在其中开发,开发之后怎么部署应用。我们来通过开发一个ssm框架的web项目来介绍具体操作。

二、开发应用

1、自定义配置springBoot,使其支持jsp(SpringBoot虽然支持JSP,但是官方不推荐使用,推荐使用thymeleaf)

  1)、配置application.properties

#关闭默认模板引擎
spring.thymeleaf.cache=false
spring.thymeleaf.enabled=false

#jsp 支持
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

  2)、加入依赖(切记:这三个依赖都是必须的)

SpringBoot开发及学习 SpringBoot开发及学习

<!--jsp支持  start-->
        <!-- servlet 依赖. -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <!--jsp支持  end-->

pom.xml添加依赖

  3)、控制层建议使用@Controller,不要使用@RestController,毕竟不是每一个方法都返回JSON的,有的需要跳转到界面。

SpringBoot开发及学习 SpringBoot开发及学习

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * @author thc
 * @E-mail  2353635701@qq.com
 * @date 2019年2月19日 下午3:12:03 
 * @Description 类描述
 */
@Controller
public class DemoController {

    @RequestMapping(value = {"/", "/view"} ,method=RequestMethod.GET)
    public String helloworld() {
        System.out.println("helloworld!!");
        return "index";
    }
}

java action代码

  4)、 像往常的web项目一样,在文件夹src下创建main\webapp\WEB-INF\views\index.jsp测试页面。

        SpringBoot开发及学习

SpringBoot开发及学习 SpringBoot开发及学习

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>index</title>
<!-- Tell the browser to be responsive to screen width -->
<meta
    content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
    name="viewport">
</head>
<body class="hold-transition login-page">
    <center>
        <h3>你好,欢迎 !!!</h3>
    </center>
</body>
</html>

index.jsp 页面代码

启动应用,访问http://localhost:8080,测试成功!!

2、支持mybatis做数据库持久化

  1)、添加依赖

SpringBoot开发及学习 SpringBoot开发及学习

<!-- mybatis start -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!-- mysql 连接 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- mybatis end -->

支持mybatis的相关依赖

备份程序!!!

    2)、添加自定义配置(添加mybatis支持方法一,本人不支持使用,官方配置文档不好找,反正我是没找到全部的数据库连接池配置参数)

    修改application.properties,添加mybatis和dataSource相关配置

SpringBoot开发及学习 SpringBoot开发及学习

#使用mybatis连接数据库信息
#mybatis自定义配置信息
mybatis.mapper-locations = classpath:mybatis/mapper/*Mapper.xml
mybatis.config-location = classpath:mybatis/mybatis_config.xml
mybatis.type-aliases-package = com.example.demo.dao.db
#数据库连接信息
spring.datasource.driver-class-name= com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = 123

添加使用mybatis连接数据库信息

    写样例测试,数据库表可以随意创建两张,添加测试程序

    a、在src/main/resources下创建mybatis文件夹,在mybatis文件夹下创建mybatis_config.xml(内容如下)文件、generator_test.xml文件(方向工程生成文件内容如下)和mapper文件夹(这个要与application.properties中的配置一致classpath:mybatis/mapper),在src/main/java创建com.example.demo.dao.db包,使用mybatis方向工程生成数据代码。

SpringBoot开发及学习 SpringBoot开发及学习

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>        
    
</configuration>

mybatis_config.xml

SpringBoot开发及学习 SpringBoot开发及学习

<?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">

<!-- 配置Run As Maven build : Goals 参数 : mybatis-generator:generate -Dmybatis.generator.overwrite=true -->
<!-- 配置 tableName,使用 Run As Maven build 生成 dao model 层 -->
<generatorConfiguration>
    <!-- 配置文件路径 -->
    <!-- <properties url="${mybatis.generator.generatorConfig.properties}"/> -->
    <!-- <properties resource="generatorConfig.properties"/> -->

    <!--数据库驱动包路径 -->
    <classPathEntry
        location="E:\m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar" />
    <context id="EditionManagerTables" targetRuntime="MyBatis3">
        <!-- mybatio分页插件 -->
        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"></plugin>
        <!--关闭注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" /><!-- 是否取消注释 -->
            <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳 -->
        </commentGenerator>

        <!--数据库连接信息 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/test" userId="root"
            password="123">
        </jdbcConnection>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!--生成的model 包路径 -->
        <javaModelGenerator targetPackage="com.example.demo.dao.db.model"
            targetProject="demo/src/main/java">
            <!-- 是否在当前路径下新加一层schema,eg:fase路径cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] -->
            <property name="enableSubPackages" value="ture" />
            <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
            <property name="trimStrings" value="true" />
            <!-- <property name="rootClass" value="com.sinosig.xb.rms.base.BaseEntity"/> -->
        </javaModelGenerator>

        <!--生成xml mapper文件 路径 -->
        <sqlMapGenerator targetPackage="mybatis.mapper"
            targetProject="demo/src/main/resources">
            <!-- 是否在当前路径下新加一层schema,eg:fase路径cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] -->
            <property name="enableSubPackages" value="ture" />
        </sqlMapGenerator>

        <!-- 生成的Dao接口 的包路径 -->
        <javaClientGenerator type="XMLMAPPER"
            targetPackage="com.example.demo.dao.db" targetProject="demo/src/main/java">
            <property name="enableSubPackages" value="ture" />
            <!-- baseDao -->
            <!-- <property name="rootInterface" value="com.xb.alert.platform.db.dao.BaseDao" 
                /> -->
        </javaClientGenerator>

        <!--对应数据库表名 -->
        <!-- schema即为数据库名 tableName为对应的数据库表 domainObjectName要生成的实体类名 enable*ByExample是否生成 
            example类 -->
        <!-- <table tableName="ts_user" schema="" enableInsert="true" -->
        <!-- <table tableName="tp_%" schema="" enableInsert="true" useGeneratedKeys="true" 
            keyProperty="id" -->
        <!-- <table tableName="te_employee_info" schema="" enableInsert="true" -->
        <!-- <table tableName="%" schema="" enableInsert="true" -->
        <table tableName="%" schema="" enableInsert="true"
            enableCountByExample="true" enableUpdateByExample="true"
            enableDeleteByExample="true" enableSelectByExample="true"
            selectByExampleQueryId="true">
            <!-- enableCountByExample="true" enableUpdateByExample="false" enableDeleteByExample="false" -->
            <!-- enableSelectByExample="true" selectByExampleQueryId="true"> -->
            <!-- 忽略列,不生成bean 字段 <ignoreColumn column="FRED" /> -->
            <!-- 指定列的java数据类型 <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" 
                /> -->
        </table>
    </context>
</generatorConfiguration>

mybatis方向工程文件generator_test.xml

    SpringBoot开发及学习

    b、创建service层:创建包com.example.demo.service、com.example.demo.service.impl及接口TestDemoService和实现类TestDemoServiceImpl如下:

     SpringBoot开发及学习

SpringBoot开发及学习 SpringBoot开发及学习

package com.example.demo.service;

import com.example.demo.dao.db.model.TsUser;

public interface TestDemoService {

    public boolean testTransactional();
    public TsUser selectByPrimaryKey(int id);
}

service层接口TestDemoService.java代码

SpringBoot开发及学习 SpringBoot开发及学习

package com.example.demo.service.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.example.demo.dao.db.TdScoreMapper;
import com.example.demo.dao.db.TsUserMapper;
import com.example.demo.dao.db.model.TdScore;
import com.example.demo.dao.db.model.TsUser;
import com.example.demo.service.TestDemoService;

@Service
public  class TestDemoServiceImpl implements  TestDemoService{
    @Resource
    TsUserMapper mapper;
    
    @Resource
    TdScoreMapper scMapper;
    
    public TsUser selectByPrimaryKey(int id){
        return mapper.selectByPrimaryKey(id);
    }
    
    
    @Transactional
    public boolean testTransactional(){
        
        try {
            TsUser tu = new TsUser();
            tu.setId(1);
            tu.setName("张三100");
            mapper.updateByPrimaryKey(tu);
            TdScore sc = new TdScore();
            sc.setId(1);
            sc.setScore(100);
            scMapper.updateByPrimaryKey(sc);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return true;
    }
}

Service层实现类TestDemoServiceImpl代码

    c、添加修改action代码如下

SpringBoot开发及学习 SpringBoot开发及学习

package com.example.demo.controller;


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.RequestMethod;

import com.example.demo.dao.db.model.TsUser;
import com.example.demo.service.TestDemoService;

/**
 * @author thc
 * @E-mail  2353635701@qq.com
 * @date 2019年2月19日 下午3:12:03 
 * @Description 类描述
 */
@Controller
public class DemoController {
    @Autowired
    TestDemoService service;

    @RequestMapping(value = {"/", "/view"} ,method=RequestMethod.GET)
    public String helloworld() {
        System.out.println("helloworld!!");
        service.testTransactional();
        // 查询数据库
        TsUser tu = service.selectByPrimaryKey(1);
        System.out.println("数据库查出用户名" + tu.getName());
        return "index";
    }
}

DemoController 测试数据库连接成功代码

     d、修改应用启动入口DemoApplication.java,添加@EnableTransactionManagement注解,用来支持spring事物;添加@MapperScan("com.example.demo.dao.db"),用来配置扫描**Mapper接口,也可以使用@Mapper注解,二选一(注解写法如下第二张截图)

   SpringBoot开发及学习         SpringBoot开发及学习

  e、启动测试:控制台打印用户名,成功!!

    SpringBoot开发及学习

  备份程序!!!! 因为这个也是用来支持mybaits的介绍,和上面的操作重复了,所有我们导入之前备份的程序,再做之下操作。

  3)、支持读取自定义的配置文件(添加mybatis支持方法二,这个学习成本很小,老方式配置DataSource参数就可以了)

    这个操作就是使用springBoot对xml配置文件的支持,直接用程序读我们原来的mybaits配置文件(官方文档  https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/htmlsingle/#using-boot-importing-xml-configuration)

    SpringBoot开发及学习

    a、在src/main/resources下创建mybatis文件夹,在mybatis文件夹下创建mybatis_config.xml(内容如下)文件、generator_test.xml文件(方向工程生成文件内容如下)和mapper文件夹(这个要与application.properties中的配置一致classpath:mybatis/mapper),在src/main/java创建com.example.demo.dao.db包,使用mybatis方向工程生成数据代码。

SpringBoot开发及学习

SpringBoot开发及学习 SpringBoot开发及学习

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">


    <!-- 自动扫描 -->
    <!-- <context:component-scan base-package="com.sinosig.xb.em.*" /> -->

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <!-- 基本属性 url、user、password -->
        <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull" /> 
        <property name="username" value="root" />
        <property name="password" value="123" />
        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="1" />
        <property name="minIdle" value="1" />
        <property name="maxActive" value="20" />
        <property name="maxIdle" value="20"></property>
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000" />
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <property name="validationQuery" value="SELECT 'x'" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />

        <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="false" />
        <!-- 配置监控统计拦截的filters -->
    </bean>


    <!-- MyBatis配置 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
        <!-- <property name="typeAliasesPackage" value="com.hjf.boot.api.domain" 
            /> -->
        <!-- 显式指定Mapper文件位置 -->
        <property name="mapperLocations" value="classpath*:mybatis/mapper/*Mapper.xml" />
    </bean>
    <!-- 扫描basePackage下所有以@MyBatisRepository标识的 接口 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.example.demo.dao.db" />
        <!-- <property name="annotationClass" value="com.hjf.boot.demo.boot_mybatis.dao.Mapper" 
            /> -->
    </bean>

    <!-- 开启事务注解驱动 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>


    <!-- 自动扫描,多个包以 逗号分隔 <context:component-scan base-package="com.sinosig.xb.em"/> -->
    <context:component-scan base-package="com.example.demo.dao.db"/>
    <aop:aspectj-autoproxy />




</beans>

mybatis_config.xml

SpringBoot开发及学习 SpringBoot开发及学习

<?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">

<!-- 配置Run As Maven build : Goals 参数 : mybatis-generator:generate -Dmybatis.generator.overwrite=true -->
<!-- 配置 tableName,使用 Run As Maven build 生成 dao model 层 -->
<generatorConfiguration>
    <!-- 配置文件路径 -->
    <!-- <properties url="${mybatis.generator.generatorConfig.properties}"/> -->
    <!-- <properties resource="generatorConfig.properties"/> -->

    <!--数据库驱动包路径 -->
    <classPathEntry
        location="E:\m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar" />
    <context id="EditionManagerTables" targetRuntime="MyBatis3">
        <!-- mybatio分页插件 -->
        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"></plugin>
        <!--关闭注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" /><!-- 是否取消注释 -->
            <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳 -->
        </commentGenerator>

        <!--数据库连接信息 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/test" userId="root"
            password="123">
        </jdbcConnection>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!--生成的model 包路径 -->
        <javaModelGenerator targetPackage="com.example.demo.dao.db.model"
            targetProject="demo/src/main/java">
            <!-- 是否在当前路径下新加一层schema,eg:fase路径cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] -->
            <property name="enableSubPackages" value="ture" />
            <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
            <property name="trimStrings" value="true" />
            <!-- <property name="rootClass" value="com.sinosig.xb.rms.base.BaseEntity"/> -->
        </javaModelGenerator>

        <!--生成xml mapper文件 路径 -->
        <sqlMapGenerator targetPackage="mybatis.mapper"
            targetProject="demo/src/main/resources">
            <!-- 是否在当前路径下新加一层schema,eg:fase路径cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] -->
            <property name="enableSubPackages" value="ture" />
        </sqlMapGenerator>

        <!-- 生成的Dao接口 的包路径 -->
        <javaClientGenerator type="XMLMAPPER"
            targetPackage="com.example.demo.dao.db" targetProject="demo/src/main/java">
            <property name="enableSubPackages" value="ture" />
            <!-- baseDao -->
            <!-- <property name="rootInterface" value="com.xb.alert.platform.db.dao.BaseDao" 
                /> -->
        </javaClientGenerator>

        <!--对应数据库表名 -->
        <!-- schema即为数据库名 tableName为对应的数据库表 domainObjectName要生成的实体类名 enable*ByExample是否生成 
            example类 -->
        <!-- <table tableName="ts_user" schema="" enableInsert="true" -->
        <!-- <table tableName="tp_%" schema="" enableInsert="true" useGeneratedKeys="true" 
            keyProperty="id" -->
        <!-- <table tableName="te_employee_info" schema="" enableInsert="true" -->
        <!-- <table tableName="%" schema="" enableInsert="true" -->
        <table tableName="%" schema="" enableInsert="true"
            enableCountByExample="true" enableUpdateByExample="true"
            enableDeleteByExample="true" enableSelectByExample="true"
            selectByExampleQueryId="true">
            <!-- enableCountByExample="true" enableUpdateByExample="false" enableDeleteByExample="false" -->
            <!-- enableSelectByExample="true" selectByExampleQueryId="true"> -->
            <!-- 忽略列,不生成bean 字段 <ignoreColumn column="FRED" /> -->
            <!-- 指定列的java数据类型 <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" 
                /> -->
        </table>
    </context>
</generatorConfiguration>

generator_test.xml

    b、添加依赖

SpringBoot开发及学习 SpringBoot开发及学习

<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.3.12.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.12.RELEASE</version>
        </dependency>

pom.xml添加依赖

    c、修改应用启动入口DemoApplication.java

 SpringBoot开发及学习

  d、重复上面的测试方法,成功!!!!

3、支持logback配置(有两种读取方式) ,logback的依赖是springBoot的默认起步依赖,所以我们不需要单独引入依赖。

  1)、application.properties直接配置logback日志设置

SpringBoot开发及学习 SpringBoot开发及学习

# LOGGING
logging.config= # Location of the logging configuration file. For instance `classpath:logback.xml` for Logback
logging.exception-conversion-word=%wEx # Conversion word used when logging exceptions.
logging.file= # Log file name. For instance `myapp.log`
logging.level.*= # Log levels severity mapping. For instance `logging.level.org.springframework=DEBUG`
logging.path= # Location of the log file. For instance `/var/log`
logging.pattern.console= # Appender pattern for output to the console. Only supported with the default logback setup.
logging.pattern.file= # Appender pattern for output to the file. Only supported with the default logback setup.
logging.pattern.level= # Appender pattern for log level (default %5p). Only supported with the default logback setup.
logging.register-shutdown-hook=false # Register a shutdown hook for the logging system when it is initialized.

官方文档介绍

SpringBoot开发及学习 SpringBoot开发及学习

#=========== 日志配置·简易(spring boot已经集成logback日志)=========  
#controller层日志 WARN级别输出  
#logging.level.com.example.demo.controller=WARN  
#mapper层 sql日志 DEBUG级别输出  
#logging.level.com.example.demo.service.impl=DEBUG  

#logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n  
#logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n  
#打印运行时sql语句到控制台  
spring.jpa.show-sql=true  
# 同时使用,则只有logging.file生效
# 绝对路径或者相对路径
logging.file=logs/spring-boot-logging.log  
# 设置目录
logging.path=/var/log
# 级别控制
# 默认级别为:ERROR、WARN、INFO,10MB时会切分一次
# 格式logging.level.* = LEVEL
# TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
logging.level.root=info
logging.level.com.example.demo=info
logging.level.com.example.demo.controller=WARN

application.properties文件添加日志配置

  2)、application.properties配置读取logback xml配置文件

    a、application.properties添加配置读取logback.xml

# 自定义日志配置路径
logging.config=classpath:logging-config.xml

    b、创建logback.xml文件

      SpringBoot开发及学习

SpringBoot开发及学习 SpringBoot开发及学习

<?xml version="1.0" encoding="UTF-8"?>  
<configuration>      
    <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->      
    <!-- appender是configuration的子节点,是负责写日志的组件。 -->  
    <!-- ConsoleAppender:把日志输出到控制台 -->  
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">      
        <encoder>      
            <pattern>%d %p (%file:%line\)- %m%n</pattern>    
            <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->  
            <charset>UTF-8</charset>     
        </encoder>      
    </appender>      
    <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->  
    <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是demo.log -->  
    <!--             2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名-->  
    <appender name="demolog" class="ch.qos.logback.core.rolling.RollingFileAppender">      
        <File>log/demo.log</File>      
        <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->  
        <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">      
            <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->  
            <!-- 文件名:log/demo.2017-12-05.0.log -->  
            <fileNamePattern>log/demo.%d.%i.log</fileNamePattern>   
            <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->   
            <maxHistory>30</maxHistory>     
            <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">      
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成1KB看效果 -->    
                <maxFileSize>1KB</maxFileSize>      
            </timeBasedFileNamingAndTriggeringPolicy>      
        </rollingPolicy>      
        <encoder>      
            <!-- pattern节点,用来设置日志的输入格式 -->  
            <pattern>      
                %d %p (%file:%line\)- %m%n    
            </pattern>      
            <!-- 记录日志的编码:此处设置字符集 - -->  
            <charset>UTF-8</charset>  
        </encoder>      
    </appender>      
    <!-- 控制台输出日志级别 -->  
    <root level="info">      
        <appender-ref ref="STDOUT" />      
    </root>      
    <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->  
    <!-- com.example.demo为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->  
    <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->
    <!-- <logger name="com.example.demo.controller" level="info"> -->
    <logger name="com.example.demo" level="debug">     
        <appender-ref ref="demolog" />      
    </logger>      
</configuration>

logback配置文件logback.xml

4、支持读profile

三、部署应用

1、jar包配置

对于web项目,springBoot默认的打包方式配置的是jar包,他帮我们内嵌了一个tomcat,我们只需要使用我们常用的打包工具打包,通过部署jar包的方式部署到服务器上即可。

2、war包配置

 虽然使用内置tomcat在开发上很方便,但是当我们在企业中开发的时候,有可能公司就是规定我们使用运维统一部署的tomcat服务器,那么我们就必须把项目打包成部署在tomcat中的war包,,这有有一个问题,我们的项目没有servlet容器的加载入口——web.xml文件。

  这时候,我们就需要对程序做些修改:

  1、修改pom.xml中的打包配置:war  

    SpringBoot开发及学习

  2、创建一个servlet初始化入口:springBoot给我们提供了一个SpringBootServlertInitializer类。

    官方文档:https://docs.spring.io/spring-boot/docs/2.1.4.BUILD-SNAPSHOT/reference/htmlsingle/       ctrl+f 搜索:SpringBootServletInitializer

    SpringBoot开发及学习

    我们要在我们的项目中写一个SpringBootServlertInitializer类的子类,重写他的configure()方法来完成配置,实现代码如下:

SpringBoot开发及学习 SpringBoot开发及学习

package com.example.demo;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class DemoServletInitializer extends SpringBootServletInitializer {

    @Override
    public SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // DemoApplication 程序入口,指定Spring的配置
        return builder.sources(DemoApplication.class);
    }
}

SpringBootServletInitializer子类DemoServletInitializer.java代码

  3、使用maven打包命令打包  

 这个时候打成的war包既可以部署在tomcat中,也可以使用"java -jar 项目名.war"来作为jar包部署。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
2年前
SpringBoot开发及学习
SpringBoot是Spring新出的一个框架,他的目的一如始初简化开发。我们开发项目的时候,为了让项目运行起来,我们要考虑很多架构、配置、依赖等问题,这些问题其实每个项目都要考虑,而且每个项目的开发都有固定的模版,这些重复的工作是每个项目的样板代码,SpringBoot做的就是帮我们完成这些重复行的工作,让我们只关注业务逻辑。主要帮我们完成了以下
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
8个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k