SpringBoot整合mybatis(注解加配置文件附源码)(springBoot+mybatis+durid+sqlserver2012+Thymeleaf+pageHelper+logback)

  1. https://start.spring.io/ 初始化项目结构
    选择需要整合的依赖,生成project.
    在这里插入图片描述

  2. 将下载的项目解压, 使用idea 导入,分层, 项目结构如图:
    在这里插入图片描述

  3. 添加durid,pageHelper依赖, 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wx</groupId>
    <artifactId>wlcx</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>wlcx</name>
    <description>Demo project for wlcx</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</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>1.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.0.4.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
        </dependency>

        <!--alibaba的druid数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.8</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

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

            <!-- mybatis generator 自动生成代码插件 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
        </plugins>
    </build>


</project>
  1. 创建数据库跟表:
USE [wx]
GO
/****** Object:  Table [dbo].[CM_Company]    Script Date: 2018/11/24 20:14:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[CM_Company](
	[COID] [nchar](16) NOT NULL,
	[NDID] [nchar](16) NULL,
	[CPID] [nchar](12) NULL,
	[CO_Base] [int] NULL,
	[CO_Type] [int] NULL,
	[LG_Code] [nvarchar](12) NULL,
	[CO_Name] [nvarchar](64) NULL,
	[CO_Addr] [nvarchar](96) NULL,
	[CO_Time] [datetime] NULL,
	[CO_State] [int] NULL,
	[CO_Share] [int] NULL,
	[CO_Phone] [nvarchar](32) NULL,
	[CO_Spell] [nvarchar](32) NULL,
	[CO_Linker] [nvarchar](16) NULL,
	[CO_LkCode] [nvarchar](32) NULL,
	[CO_E_Mail] [nvarchar](64) NULL,
	[CO_BkType] [int] NULL,
	[CO_BkCode] [nvarchar](64) NULL,
	[CO_AcName] [nvarchar](64) NULL,
	[CO_VcType] [nvarchar](16) NULL,
	[CO_VcName] [nvarchar](64) NULL,
	[CO_TxCode] [nvarchar](32) NULL,
	[CO_BcFate] [int] NULL,
	[CO_Stable] [int] NULL,
	[CO_VWRate] [float] NULL,
	[CO_Router] [nvarchar](256) NULL,
	[CO_Server] [nvarchar](256) NULL,
	[CO_ReMark] [nvarchar](960) NULL,
	[CO_MapX] [float] NULL,
	[CO_MapY] [float] NULL,
	[CO_LaType] [int] NULL,
	[CO_Starts] [int] NULL,
 CONSTRAINT [PK_CM_Company] PRIMARY KEY CLUSTERED 
(
	[COID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[CM_Matcher]    Script Date: 2018/11/24 20:14:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[CM_Matcher](
	[COID] [nchar](16) NOT NULL,
	[CR_Idx] [int] NULL,
	[CR_Mode] [int] NULL,
	[CT_Mode] [int] NULL,
	[CR_Fate] [float] NULL,
	[RG_Code] [nvarchar](12) NULL,
	[RG_Name] [nvarchar](32) NULL,
	[AR_Code] [nvarchar](12) NULL,
	[AR_Name] [nvarchar](32) NULL,
	[CM_Code] [nvarchar](16) NULL,
	[CM_Name] [nvarchar](32) NULL,
	[CR_Addr] [nvarchar](96) NULL,
	[CR_Style] [int] NULL,
	[CR_Grade] [int] NULL
) ON [PRIMARY]

GO

  1. 利用generator自动生成代码,在pom中我们已经添加插件,这是我们需要生成generate.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="F:\demo\mssql-jdbc-6.4.0.jre8.jar"/>
    <context id="DB2Tables"  targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库链接URL,用户名、密码 -->
        <jdbcConnection driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver" connectionURL="jdbc:sqlserver://localhost:1433;databaseName=wx" userId="sa" password="manager">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- 生成模型的包名和位置-->
        <javaModelGenerator targetPackage="com.wx.wlcx.model" 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.wx.wlcx.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
        <table tableName="CM_Company" domainObjectName="CMCompany" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
        <table tableName="CM_Matcher" domainObjectName="CMMatcher" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
    </context>
</generatorConfiguration>
  1. 修改属性文件,添加数据库连接属性:
## 该配置节点为独立的节点,不要放在spring的节点下,导致配置无法被识别
mybatis.mapper-locations= classpath:mapping/*.xml
mybatis.type-aliases-package= com.wx.wlcx.model

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=wx
spring.datasource.username=sa
spring.datasource.password=manager
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

spring.datasource.name= test

# 使用druid数据源
spring.datasource.type= com.alibaba.druid.pool.DruidDataSource
spring.datasource.filters= stat
spring.datasource.maxActive= 20
spring.datasource.initialSize= 1
spring.datasource.maxWait= 60000
spring.datasource.minIdle= 1
spring.datasource.timeBetweenEvictionRunsMillis= 60000
spring.datasource.minEvictableIdleTimeMillis= 300000
spring.datasource.validationQuery= select 'x'
spring.datasource.testWhileIdle= true
spring.datasource.testOnBorrow= false
spring.datasource.testOnReturn= false
spring.datasource.poolPreparedStatements= true
spring.datasource.maxOpenPreparedStatements= 20


利用IDEA和generate 生成代码:点击 edit configuration
在这里插入图片描述
点击左上角的+号,添加maven插件, 填写如下信息:
在这里插入图片描述
配置好之后选择generate, 点击运行
在这里插入图片描述
运行成功后会生成po类,mapper接口, 以及对应的mapper.xml
CMMatcherMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.wx.wlcx.mapper.CMMatcherMapper" >
  <resultMap id="BaseResultMap" type="com.wx.wlcx.model.CMMatcher" >
    <result column="COID" property="coid" jdbcType="NCHAR" />
    <result column="CR_Idx" property="crIdx" jdbcType="INTEGER" />
    <result column="CR_Mode" property="crMode" jdbcType="INTEGER" />
    <result column="CT_Mode" property="ctMode" jdbcType="INTEGER" />
    <result column="CR_Fate" property="crFate" jdbcType="DOUBLE" />
    <result column="RG_Code" property="rgCode" jdbcType="NVARCHAR" />
    <result column="RG_Name" property="rgName" jdbcType="NVARCHAR" />
    <result column="AR_Code" property="arCode" jdbcType="NVARCHAR" />
    <result column="AR_Name" property="arName" jdbcType="NVARCHAR" />
    <result column="CM_Code" property="cmCode" jdbcType="NVARCHAR" />
    <result column="CM_Name" property="cmName" jdbcType="NVARCHAR" />
    <result column="CR_Addr" property="crAddr" jdbcType="NVARCHAR" />
    <result column="CR_Style" property="crStyle" jdbcType="INTEGER" />
    <result column="CR_Grade" property="crGrade" jdbcType="INTEGER" />
  </resultMap>
  <sql id="Base_Column_List" >
    COID, CR_Idx, CR_Mode, CT_Mode, CR_Fate, RG_Code, RG_Name, AR_Code, AR_Name,
    CM_Code, CM_Name, CR_Addr, CR_Style, CR_Grade
  </sql>

  <insert id="insert" parameterType="com.wx.wlcx.model.CMMatcher" >
    insert into CM_Matcher (COID, CR_Idx, CR_Mode, 
      CT_Mode, CR_Fate, RG_Code, 
      RG_Name, AR_Code, AR_Name, 
      CM_Code, CM_Name, CR_addr, 
      CR_Style, CR_Grade)
    values (#{coid,jdbcType=NCHAR}, #{crIdx,jdbcType=INTEGER}, #{crMode,jdbcType=INTEGER}, 
      #{ctMode,jdbcType=INTEGER}, #{crFate,jdbcType=DOUBLE}, #{rgCode,jdbcType=NVARCHAR}, 
      #{rgName,jdbcType=NVARCHAR}, #{arCode,jdbcType=NVARCHAR}, #{arName,jdbcType=NVARCHAR}, 
      #{cmCode,jdbcType=NVARCHAR}, #{cmName,jdbcType=NVARCHAR}, #{crAddr,jdbcType=NVARCHAR}, 
      #{crStyle,jdbcType=INTEGER}, #{crGrade,jdbcType=INTEGER})
  </insert>
  <insert id="insertSelective" parameterType="com.wx.wlcx.model.CMMatcher" >
    insert into CM_Matcher
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="coid != null" >
        COID,
      </if>
      <if test="crIdx != null" >
        CR_Idx,
      </if>
      <if test="crMode != null" >
        CR_Mode,
      </if>
      <if test="ctMode != null" >
        CT_Mode,
      </if>
      <if test="crFate != null" >
        CR_Fate,
      </if>
      <if test="rgCode != null" >
        RG_Code,
      </if>
      <if test="rgName != null" >
        RG_Name,
      </if>
      <if test="arCode != null" >
        AR_Code,
      </if>
      <if test="arName != null" >
        AR_Name,
      </if>
      <if test="cmCode != null" >
        CM_Code,
      </if>
      <if test="cmName != null" >
        CM_Name,
      </if>
      <if test="crAddr != null" >
        CR_addr,
      </if>
      <if test="crStyle != null" >
        CR_Style,
      </if>
      <if test="crGrade != null" >
        CR_Grade,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="coid != null" >
        #{coid,jdbcType=NCHAR},
      </if>
      <if test="crIdx != null" >
        #{crIdx,jdbcType=INTEGER},
      </if>
      <if test="crMode != null" >
        #{crMode,jdbcType=INTEGER},
      </if>
      <if test="ctMode != null" >
        #{ctMode,jdbcType=INTEGER},
      </if>
      <if test="crFate != null" >
        #{crFate,jdbcType=DOUBLE},
      </if>
      <if test="rgCode != null" >
        #{rgCode,jdbcType=NVARCHAR},
      </if>
      <if test="rgName != null" >
        #{rgName,jdbcType=NVARCHAR},
      </if>
      <if test="arCode != null" >
        #{arCode,jdbcType=NVARCHAR},
      </if>
      <if test="arName != null" >
        #{arName,jdbcType=NVARCHAR},
      </if>
      <if test="cmCode != null" >
        #{cmCode,jdbcType=NVARCHAR},
      </if>
      <if test="cmName != null" >
        #{cmName,jdbcType=NVARCHAR},
      </if>
      <if test="crAddr != null" >
        #{crAddr,jdbcType=NVARCHAR},
      </if>
      <if test="crStyle != null" >
        #{crStyle,jdbcType=INTEGER},
      </if>
      <if test="crGrade != null" >
        #{crGrade,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>
##分页方法,手动添加
  <select id="getAll" resultMap="BaseResultMap">
    SELECT <include refid="Base_Column_List" /> FROM CM_Matcher ORDER BY COID
  </select>

  <!--<select id="getAll" resultMap="BaseResultMap">-->
    <!--SELECT * FROM CM_Matcher-->
  <!--</select>-->
</mapper>

CMMatcherMapper.java

public interface CMMatcherMapper {
    int insert(CMMatcher record);

    int insertSelective(CMMatcher record);

    List<CMMatcher> getAll();
}

CMMatcher.java

public class CMMatcher {
    private String coid;

    private Integer crIdx;

    private Integer crMode;

    private Integer ctMode;

    private Double crFate;

    private String rgCode;

    private String rgName;

    private String arCode;

    private String arName;

    private String cmCode;

    private String cmName;

    private String crAddr;

    private Integer crStyle;

    private Integer crGrade;
//get set
}

MatcherServiceImpl.java

@Service
public class MatcherServiceImpl implements MatcherService {
    @Autowired
    private MatcherMapper matcherMapper;
    @Autowired
    private CMMatcherMapper cmMatcherMapper;

    @Override
    public List<CMMatcher> getAll() {
        return matcherMapper.getAll();
    }

    @Override
    public List<com.wx.wlcx.model.CMMatcher> findAll(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return cmMatcherMapper.getAll();
    }
}

这里分页插件的使用需要在配置文件中加入:

#分页插件
#pagehelper.dialect=sqlserver2012
pagehelper.reasonable=true
#支持通过 Mapper 接口参数来传递分页参数
pagehelper.support-methods-arguments=true
pagehelper.helper-dialect=sqlserver2012
pagehelper.params=count=countsql
pagehelper.pageSizeZero=true

如果是mysql数据库将sqlserver2012替换成mysql即可。
MatcherController.java

@RestController
public class MatcherController {
    @Autowired
    private MatcherService matcherService;

    @GetMapping("/getAll")
    public ResponseEntity<JsonResult> getUserList (){
        JsonResult r = new JsonResult();
        try {
            List<CMMatcher> users = matcherService.getAll();
            r.setResult(users);
            r.setStatus("ok");
        } catch (Exception e) {
            r.setResult(e.getClass().getName() + ":" + e.getMessage());
            r.setStatus("error");
            e.printStackTrace();
        }
        return ResponseEntity.ok(r);
    }

    @GetMapping(value = "/all/{pageNum}/{pageSize}", produces = {"application/json;charset=UTF-8"})
    public ResponseEntity<JsonResult> findAllUser(@PathVariable("pageNum") int pageNum, @PathVariable("pageSize") int pageSize){

        JsonResult r = new JsonResult();
        try {
            List<com.wx.wlcx.model.CMMatcher> users = matcherService.findAll(pageNum, pageSize);
            r.setResult(users);
            r.setStatus("ok");
        } catch (Exception e) {
            r.setResult(e.getClass().getName() + ":" + e.getMessage());
            r.setStatus("error");
            e.printStackTrace();
        }
        return ResponseEntity.ok(r);
    }
}

取出所有数据和分页数据获取如图:
在这里插入图片描述

在这里插入图片描述

分页的使用在server层使用PageHelper.startPage(pageNum, pageSize);
是不是分页就变得很方便了,不过在这里遇到了一个问题,因为sqlsevrer2012使用的分页不是标准的SQl, 所以需要在sql 语句中添加order by 排序,具体情况请参考:https://blog.csdn.net/qq_35623773/article/details/84488990

  <select id="getAll" resultMap="BaseResultMap">
    SELECT <include refid="Base_Column_List" /> FROM CM_Matcher ORDER BY COID
  </select>

mybatis 注解版:
在配置文件中添加配置:

mybatis.type-aliases-package= com.wx.wlcx.model

CMMatcher.java

public class CMMatcher {
    private String coid;
    private int crInx;
    private int crMode;
    private int ctMode;
    private float crFate;
    private String rgCode;
    private String arCode;
    private String arName;
    private String cmCode;
    private String cmName;
    private String crAddr;
    private int crStyle;
    private int crGrade;
   //get set
    }

MatcherMapper.java, 添加@Repository 注解, 而不是@Mapper注解

@Repository
public interface MatcherMapper {

    @Select("select * from CM_Matcher")
    @Results({
                @Result(property = "coid", column = "COID"),
                @Result(property = "crIdx", column = "CR_Idx"),
                @Result(property = "crMode", column = "CR_Mode"),
            @Result(property = "ctMode", column = "CT_Mode"),
            @Result(property = "crFate", column = "CR_Fate"),
            @Result(property = "rgCode", column = "RG_Code"),
            @Result(property = "rgName", column = "RG_Name"),
            @Result(property = "arCode", column = "AR_Code"),
            @Result(property = "arName", column = "AR_Name"),
            @Result(property = "cmCode", column = "CM_Code"),
            @Result(property = "cmName", column = "CM_Name"),
            @Result(property = "crAddr", column = "CR_Addr"),
            @Result(property = "crStyle", column = "CR_Style"),
            @Result(property = "crGrade", column = "CR_Grade")
            })
    List<CMMatcher> getAll();
}

另外还需要在application中添加注解扫描整个mapper包:

@SpringBootApplication
@MapperScan("com.wx.wlcx.mapper")
public class WlcxApplication {

	public static void main(String[] args) {
		SpringApplication.run(WlcxApplication.class, args);
	}
}

controller,service 方法调用已在上面列出,可正常work.

配置druid数据源监控:
修改配置文件:

# 使用druid数据源
spring.datasource.type= com.alibaba.druid.pool.DruidDataSource
spring.datasource.filters= stat
spring.datasource.maxActive= 20
spring.datasource.initialSize= 1
spring.datasource.maxWait= 60000
spring.datasource.minIdle= 1
spring.datasource.timeBetweenEvictionRunsMillis= 60000
spring.datasource.minEvictableIdleTimeMillis= 300000
spring.datasource.validationQuery= select 'x'
spring.datasource.testWhileIdle= true
spring.datasource.testOnBorrow= false
spring.datasource.testOnReturn= false
spring.datasource.poolPreparedStatements= true
spring.datasource.maxOpenPreparedStatements= 20

添加config配置类:
@Configuration
public class DruidConfig {

//访问地址:http://localhost:8080/wx/druid/login.html
@ConfigurationProperties(prefix="spring.datasource")
@Bean
public DataSource durid(){
    return new DruidDataSource();
}

//配置Druid的监控

//1.配置一个管理后台的sevlet
@Bean
public ServletRegistrationBean<StatViewServlet> statViewServlet(){
    ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<StatViewServlet>(new StatViewServlet(),"/druid/*");
    Map<String,String> initParams = new HashMap<String,String>();

    initParams.put("loginUsername", "admin");
    initParams.put("loginPassword", "123456");
    //设置ip白名单
    initParams.put("allow", "");
    //设置ip黑名单。deny优先级高于allow
    initParams.put("deny", "192.168.10.125");

    bean.setInitParameters(initParams);
    return bean;
}

//2.配置一个web监控的filter
@Bean
public FilterRegistrationBean<WebStatFilter> webStatFilter(){
    FilterRegistrationBean<WebStatFilter> bean = new FilterRegistrationBean<WebStatFilter>();
    bean.setFilter(new WebStatFilter());

    Map<String,String> initParams = new HashMap<String,String>();
    //忽略过滤的形式
    initParams.put("exclusions", "*.js,*.css,/druid/*");

    bean.setInitParameters(initParams);
    //设置过滤器过滤路径
    bean.setUrlPatterns(Arrays.asList("/*"));
    return bean;
}

}

使用admin 123456 访问http://localhost:8080/wx/druid/login.html, 登录之后的界面为:
在这里插入图片描述

使用logback 配置日志管理:
创建logback.xml, springboot 官方建议使用 springboot-logback.xml 命名:
具体请看注释 logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration  scan="true" scanPeriod="10 seconds">

    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->

    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="F:/demo/wxwl/log" />

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>


    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!--输出到文件-->

    <!-- 时间滚动输出 level为 DEBUG 日志 -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_debug.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档 -->
            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_info.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 WARN 日志 -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_warn.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--
        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
        以及指定<appender>。<logger>仅有一个name属性,
        一个可选的level和一个可选的addtivity属性。
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
              如果未设置此属性,那么当前logger将会继承上级的级别。
        addtivity:是否向上级logger传递打印信息。默认是true。
    -->
    <!--<logger name="org.springframework.web" level="info"/>-->
    <!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
    <!--
        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
     -->


    <!--
        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
        不能设置为INHERITED或者同义词NULL。默认是DEBUG
        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
    -->

    <!--开发环境:打印控制台-->
    <springProfile name="dev">
        <logger name="com.nmys.view" level="debug"/>
    </springProfile>

    <root level="debug">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="DEBUG_FILE" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>

    <!--生产环境:输出到文件-->
    <!--<springProfile name="pro">-->
    <!--<root level="info">-->
    <!--<appender-ref ref="CONSOLE" />-->
    <!--<appender-ref ref="DEBUG_FILE" />-->
    <!--<appender-ref ref="INFO_FILE" />-->
    <!--<appender-ref ref="ERROR_FILE" />-->
    <!--<appender-ref ref="WARN_FILE" />-->
    <!--</root>-->
    <!--</springProfile>-->

</configuration>

修改配置文件, 添加log路径:

logging.config=classpath:log/logback-spring.xml
logging.path=F:/demo/wxwl/log

生成的log 如下图:
在这里插入图片描述

最后,使用Thymeleaf整合前端,在这里遇到了一个关于依赖的问题被困扰了一下午, 如果你遇到同样的问题(能进controller, 但返回404), 请参考小哥的另一篇文章: “”“springboot 使用thymeleaf 报错 404. 跪求大佬解惑”
上配置文件:

spring.thymeleaf.cache=false
#spring.mvc.view.prefix=classpath:/templates/
#spring.mvc.view.suffix=.html
spring.thymeleaf.prefix=classpath:/templates/
## Suffix that gets appended to view names when building a URL.
spring.thymeleaf.suffix=.html
###THYMELEAF(ThymeleafAutoConfiguration)
## Enable template caching.
#spring.thymeleaf.cache=false
## Check that the templates location exists.
#spring.thymeleaf.check-template-location=true
## Content-Type value.
#spring.thymeleaf.servlet.content-type=text/html
## Enable MVC Thymeleaf view resolution.
#spring.thymeleaf.enabled=true
## Template encoding.
#spring.thymeleaf.encoding=UTF-8
## Comma-separated list of view names that should be excluded from resolution.
##spring.thymeleaf.excluded-view-names=
## Template mode to be applied to templates. See also StandardTemplateModeHandlers.
#spring.thymeleaf.mode=HTML5
## Prefix that gets prepended to view names when building a URL.
#spring.thymeleaf.prefix=classpath:/templates/
## Suffix that gets appended to view names when building a URL.
#spring.thymeleaf.suffix=.html
##spring.thymeleaf.template-resolver-order=
## Order of the template resolver in the chain.
##spring.thymeleaf.view-names=
## Comma-separated list of view names that can be resolved.

controller:
@Controller

public class IndexController {

    @RequestMapping("/test")
    public String index() {
        System.out.println("/index");
        return "index";
    }
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 hello, boy
</body>
</html>

运行时截图:
在这里插入图片描述

另外我们也可以使用rest分格返回页面:

@RestController
public class IndexController {

    @GetMapping("/test")
    public ModelAndView index(){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("index");
        return mv;
    }
}

参考:
教程:使用Thymeleaf: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
pageHelper:
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
springboot集成mybatis:
https://blog.csdn.net/winter_chen001/article/details/77249029
logback集成:
https://www.cnblogs.com/zhangjianbing/p/8992897.html

demo 代码地址:
https://github.com/MrGlen/wxwl
如果你觉得这篇文章对你有帮助,动动你的小手指点个赞吧!!_

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值