
本篇主要内容讲springboot怎么整合Mybatis,Druid,Thymeleaf,Logback及基本运用。
源码地址:https://github.com/q200737056/Spring-Course/tree/master/springboot2Test2
一、项目环境
Java8+Maven3.3.9+SpringBoot2.0.4+Mybatis3+Druid+Thymeleaf3+Logback+Mysql+Eclipse

二、代码及配置讲解
1.引入依赖包
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath />
</parent>
<dependencies>
<!-- SpringBoot 核心包 ,包含了自动配置、日志logback和YAML-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- SpringBoot 支持aop切面 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- SpringBoot Web开发,包含了jackson,Tomcat和spring-webmvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 打成jar时需要注释掉下面的配置,springboot内置集成tomcat-->
<!-- <exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions> -->
</dependency>
<!-- SpringBoot集成thymeleaf模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- SpringBoot集成mybatis框架 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
<exclusions>
<exclusion>
<artifactId>HikariCP</artifactId>
<groupId>com.zaxxer</groupId>
</exclusion>
</exclusions>
</dependency>
<!--SpringBoot集成阿里数据库连接池 druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- Mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- springboot 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
</dependencies>
2.application.yml配置
整合了Mybatis,Druid,Thymeleaf的配置,可以说非常方便,以下截取了配置部分。
# Spring配置
spring:
#thymeleaf配置,默认前缀为templates
thymeleaf:
mode: HTML
encoding: utf-8
# 禁用缓存
cache: false
datasource:
#springboot2.02版本默认使用HikariCP
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo?useUnicode=true
&characterEncoding=utf-8&useSSL=false
username: xxx
password: xxx
devtools:
restart:
#热部署开关
enabled: true
# MyBatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.springboot2.test2
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath:mapper/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:property/mybatis-config.xml
3.logback日志配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--参数 日志路径 -->
<property name="log.path" value="e:\logs" />
<!--参数 日志格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS}
[%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!-- 临界值过滤器,过滤掉低于指定临界值的日志-->
<!-- 日志级别排序为: TRACE < DEBUG < INFO < WARN < ERROR -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 在日志配置级别的基础上过滤掉info级别以下的日志 -->
<level>INFO</level>
</filter>
</appender>
<!-- 输出到文件 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/springboot2Test2-info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling
.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/springboot2Test2-info.%d
{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<!-- 日志格式 -->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!--级别过滤器,对特定某个级别的日志进行过滤-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
additivity属性默认为true,向上级(即root)传递
如果未设置level,默认继承root的level;
应没有设置appender-ref,此logger不输出日志
主要用来对各个包下的日志分类输出
-->
<logger name="com.springboot2.test2" level="info" />
<!--设置日志级别,统一输出到appender-ref
注意如果存在log4j日志冲突,日志级别会变成debug,
即使root设置了其它级别都不会生效
-->
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file_info" />
</root>
</configuration>
放在根目录下,配置文件名取logback.xml或logback-spring.xml,spring会默认加载。当然也可以取别的名称,在application.yml中配置,但不推荐这么做。
logging
config: classpath:mylogback.xml
logback常见的appender
- ch.qos.logback.core.ConsoleAppender : 输出到控制台
- ch.qos.logback.core.FileAppender:输出到文件
- ch.qos.logback.core.rolling.RollingFileAppender:输出到文件,可以配置滚动策略
常见的日志格式符号
- %logger{n}:输出Logger对象类名,n代表长度
- %class{n}:输出所在类名
- %d{pattern}或者%date{pattern}:输出日志日期,格式同java
- %L或%line:日志所在行号
- %m或%msg:日志内容
- %method:所在方法名称
- %-5level: 级别从左显示5个字符宽度
- %thread:所在线程名称
- %n : 换行
4.Thymeleaf
Thymeleaf是一种用于Web和独立环境服务器端的Java模板引擎,而且非常容易扩展。
标准表达式语法
-
${...} :变量表达式。与spring集成后,使用spring EL。 -
*{...} :选择表达式。 -
#{...} :消息 (i18n) 表达式。 -
@{...} :链接 (URL) 表达式。 -
~{...} :片段表达式。
示例
//上下文相关URL
<a th:href="@{/order/list}">
//迭代列表
<tr th:each="user: ${productList}">
<td th:text="${userStat.count}"></td>
<td th:text="${user.name}"></td>
<td th:text="${#numbers.formatDecimal(user.weight, 1, 2)}"></td>
<td th:text="${#dates.format(user.logindate, 'dd-MM-yyyy')}"></td>
</tr>
5.controller,mapperXML配置
@Controller
@RequestMapping("/index")
public class IndexController {
//日志示例, springboot默认采用logback日志,
//一般最好都用slf4j日志门面创建,可以兼容多个日志,
//即使把 logback 换成 log4j2,日志代码都不会受到影响
//logback 详细配置可 查看 根目录下logback.xml
private static Logger log = LoggerFactory.getLogger(IndexController.class);
@Autowired
private IndexService indexService;
/**
* 首页登陆
* @return
*/
@RequestMapping(method=RequestMethod.GET)
public String index(){
return "index";
}
/**
* 登陆
* @PostMapping相当于@RequestMapping(method=RequestMethod.POST)
* @return
*/
@PostMapping("/login")
public String login(User user,ModelMap modelMap,HttpSession session){
String pass = this.indexService.login(user.getName());
if(pass==null){
modelMap.put("msg", "用户名不存在!");
return "index";
}else if(!user.getPassword().equals(pass)){
modelMap.put("msg", "密码错误!");
return "index";
}
log.info("{}_用户登陆",user.getName());
session.setAttribute("username", user.getName());
return "forward:/index/userList";
}
/**
* 列出 所有用户
* @param modelMap
* @return
*/
@RequestMapping("/userList")
public String userList(ModelMap modelMap){
List<User> userList = this.indexService.findUserList();
modelMap.put("userList", userList);
return "userList";
}
@GetMapping("/toAdd")
public String toAdd(){
return "adduser";
}
/**
* 新增用户
* @param user
* @return
*/
@PostMapping("/addUser")
public String addUser(User user){
this.indexService.insertUser(user);
// redirect 重定向
return "redirect:/index/userList";
}
/**
* 删除用户
* @param id
* @return
*/
@GetMapping("/deleteUser")
public String deleteUser(String id){
this.indexService.deleteUser(id);
return "redirect:/index/userList";
}
}
<mapper namespace="com.springboot2.test2.mapper.IndexDao">
<!-- 启动 mybatis 二级缓存,参数这里就不配置演示了,一般项目都会使用第三方缓存 -->
<cache></cache>
<select id="login" parameterType="string" resultType="string">
SELECT PASSWORD FROM TEST_USER WHERE NAME=#{name}
</select>
<!-- 一般select useCache默认true,flushCache默认false
insert,delete,update flushCache默认true
-->
<select id="findUserList" resultType="User" useCache="true" flushCache="false">
SELECT * FROM TEST_USER
</select>
<insert id="insertUser" parameterType="User" keyProperty="id" useGeneratedKeys="true">
<![CDATA[
INSERT INTO TEST_USER (NAME,PASSWORD,EMAIL) values
(#{name},#{password},#{email})
]]>
</insert>
<delete id="deleteUser" parameterType="string">
DELETE FROM TEST_USER WHERE ID=#{id}
</delete>
</mapper>
6.部分页面
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta name="keywords" content="springboot2实例教程">
<meta name="description" content="springboot2实例教程">
<title>登录成功</title>
</head>
<body>
<p><span th:text="${session.username}"></span>,登陆成功!</p>
<div style="width: 600px;margin: 10px auto;">
<table border="1" style="width: 100%">
<caption><b>用户列表</b></caption>
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>密码</th>
<th>电子邮箱</th>
<th>操作</th>
</tr>
</thead>
<!-- Thymeleaf迭代 语法 -->
<tbody>
<tr th:each="user : ${userList}">
<td th:text="${user.id}">0</td>
<td th:text="${user.name}"></td>
<td th:text="${user.password}"></td>
<td th:text="${user.email}"></td>
<td><a th:href="@{/index/deleteUser(id=${user.id})}">删除</a></td>
</tr>
</tbody>
</table>
<a th:href="@{/index/toAdd}">新增</a>
</div>
</body>
</html>