-
在 https://start.spring.io/ 初始化项目结构
选择需要整合的依赖,生成project.
-
将下载的项目解压, 使用idea 导入,分层, 项目结构如图:
-
添加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>
- 创建数据库跟表:
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
- 利用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>
- 修改属性文件,添加数据库连接属性:
## 该配置节点为独立的节点,不要放在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
如果你觉得这篇文章对你有帮助,动动你的小手指点个赞吧!!_