SpringBoot 项目(三)集成基础组件
3.1 klcms-provider集成MyBatis
MyBatis使用原则
结合使用注解和xml,不复杂用注解,复杂的用xml。
尽量不要引入额外的增强框架,以免增加代码复杂度。
3.1.1 pom.xml中添加依赖
pom.xml中添加lombok、mysql、mybatis等依赖
<dependencies>
<!--lombok 简化实体类的定义 简化logger对象的创建 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 数据库访问相关 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
</dependencies>
3.1.2 配置application.yml
配置mybatis和数据库连接
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: com.klfront.klcms.entity # 所有Entity别名类所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://95.169.17.226:3306/klcms # 数据库名称
username: king
password: King@0415
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
为mysql数据库的连接字符串设置编码方式,防止中文乱码。将以上红色部分改为:
jdbc:mysql://95.169.17.226:3306/klcms?useUnicode=true&characterEncoding=utf8
报错处理:com.alibaba.druid.pool.DruidDataSource : create connection error
(1)报错信息为数据库驱动问题
去看了一下pom文件的mysql的相关依赖
标明为低版本 5.1.48
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
(2)使用java1.8,如果使用了centos默认的openJDK也会出现数据库连接失败问题。
3.1.3 使用Mybatis访问数据库
1)在resources\mybatis\mapper下添加DeptMapper.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.klfront.klcms.dao.DeptDao">
<select id="findById" resultType="Dept" parameterType="Long">
select deptno,dname,db_source from dept where deptno=#{deptno};
</select>
<select id="findAll" resultType="Dept">
select deptno,dname,db_source from dept;
</select>
<insert id="addDept" parameterType="Dept">
INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE());
</insert>
</mapper>
2)添加接口文件:com\klfront\klcms\dao\DeptDao.java
@Mapper
public interface DeptDao{
public boolean addDept(Dept dept);
public Dept findById(Long id);
public List<Dept> findAll();
}
3)服务实现类使用DeptDao访问数据库
@Autowired
private DeptDao dao;
@Override
public boolean add(Dept dept){
return dao.addDept(dept);
}
4)控制器调用服务向数据库添加记录
注意:参数需要添加@RequestBody注解,否则不能将json数据转为Dept对象
@ResponseBody
@RequestMapping(value = "/dept/add", method = { RequestMethod.POST })
public Boolean addDept(@RequestBody Dept dept) {
Boolean res = service.add(dept);
return res;
}
3.2 klcms-provider引入单元测试
<!-- 配置单元测试插件 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
3.3 klcms-web集成日志插件:slf4j+logback
springboot默认使用的就是slf4j+logback方案。已导入了日志相关jar包:slf4j-api.jar、logback-classic.jar、logback-core.jar.
只需根据需求,修改日志相关的配置项即可。如下图是修改日志级别和日志文件路径:
运行后,确实在d盘生成了日志文件 klcms.log
3.4 klcms-web集成FreeMarker
3.4.1 引入freemarker模板依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
3.4.2 配置application.properties
注意将application.properties文件的编码设置为utf-8,否则注释显示乱码
#freemarker 静态资源配置
#设定ftl文件路径
spring.freemarker.template-loader-path=classpath:/templates
#关闭缓存,上线生产环境需要改为true
spring.freemarker.cache=false
spring.freemarker.charset=utf-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=true
spring.freemarker.expose-session-attributes=true
spring.freemarker.request-context-attribute=request
spring.freemarker.suffix=.ftl
3.4.3 配置maven打包时,包含静态文件
<finalName>klcms</finalName>
<!-- 配置静态资源文件打包 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<!--模板引擎界定符-->
<delimit>$</delimit>
</delimiters>
</configuration>
</plugin>
</plugins>
3.4.4 创建和使用模板文件
在resources目录下建个目录叫templates,在这个目录下新建一个以.ftl结尾的文件,并且将html代码复制进去,在controller层返回这个视图。模板中绑定数据时,使用delimit指定的界定符。
Controller类不能用@RestController注解,应使用@Controller注解,否则模板引擎不生效。
@RestController
public class DemoController {
@RequestMapping(value = "/index", method = RequestMethod.GET)
public String index(ModelMap map) {
map.put("name", "freemarker");
map.put("age", "30");
return "index";
}
}
上述代码,访问http://localhost:8080/index,直接返回字符串index,没有使用到视图模板。
将注解@RestController改成@Controller,成功。
@Controller
public class DemoController {
@RequestMapping(value = "/index", method = RequestMethod.GET)
public String index(ModelMap map) {
map.put("name", "freemarker");
map.put("age", "30");
return "index";
}
}
3.4.5 Freemarker常见语法问题
<#if>标签中大于号,小于号写法
(1)用符号代替
> 用 gt;
>= 用 gte;
< 用 lt;
< 用= lte;
(2)加括号 <#if(x>y)>
3.4.6FreeMarker使用母版页
母版页代码(resources/templates/shared/layout.ftl)
<#macro layout><html>
<head>
<title>标题</title></head>
<body><div id="content">
<#nested /></div></body>
</html></#macro>
子页面代码(resources/templates/index.ftl)
<#include "/shared/layout.ftl">
<@layout>
<div>这是子页面内容</div>
</@layout>
3.5 klcms-web集成Thymeleaf
thymeleaf与freemarker可以共存,不过freemarker优先级高,freemarker模板没有匹配上才尝试匹配thymeleaf模板。
3.5.1 添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
3.5.2 配置properties
springboot已经有默认配置了,这里只配置关闭缓存。
spring.thymeleaf.cache=false
3.5.3 编写视图文件
在templates下添加thymeleaf.html 文件,添加命名空间xmlns:th="http://www.thymeleaf.org",然后按thymeleaf的语法规则编写代码。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>thymeleaf演示</h1>
<!--th:text 将div里面的文本内容设置为 -->
<div id="div01" class="myDiv" th:id="${hello}" th:class="${hello}" th:text="${hello}">这是显示欢迎信息</div>
<hr/>
<div th:text="${hello}"></div>
<div th:utext="${hello}"></div>
<hr/>
<!-- th:each每次遍历都会生成当前这个标签: 3个h4 -->
<h4 th:text="${user}" th:each="user:${users}"></h4>
<hr/>
<h4>
<span th:each="user:${users}"> [[${user}]] </span>
</h4>
</body>
</html>
3.5.4 编写控制器和方法,绑定数据,返回视图
给hello和users赋值,并返回视图名thymeleaf
/**
* 模板引擎演示
* 返回视图名,则不用添加@ResponseBody注解
* @param map
* @return
*/
@RequestMapping("/thymeleaf")
public String thymeleaf(Map<String, Object> map) {
map.put("hello", "<h1>你好 hello</h1>");
map.put("users", Arrays.asList("zhangsan", "lisi", "wangwu"));
return "thymeleaf";
}
3.6 klcms-web集成热部署插件
<!-- 热部署 修改后立即生效-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>