Spring Boot 学习笔记

环境安装

1
2
3
4
5
6
7
export PATH="/usr/local/bin:$PATH"
brew install node
# sudo rm -rf /usr/local/lib/node_modules/npm
# brew reinstall node
brew install git
brew install gradle
npm install -g @angular/cli

Spring Boot 建议的目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
myproject
+-src
+- main
+- java
+- com.example.myproject
+- comm
+- model
+- repository
+- service
+- web
+- Application.java
+- resources
+- static
+- templates
+- application.properties
+- test
+-pom.xml

com.example.myproject 目录下:

  • Application.java,建议放到根目录下面,是项目的启动类,Spring Boot 项目只能有一个 main() 方法;
  • comm 目录建议放置公共的类,如全局的配置文件、工具类等;
  • model 目录主要用于实体(Entity)与数据访问层(Repository);
  • repository 层主要是数据库访问层代码;
  • service 层主要是业务类代码;
  • web 层负责页面访问控制;

resources 目录下:

  • static 目录存放 web 访问的静态资源,如 js、css、图片等;
  • templates 目录存放页面模板;
  • application.properties 存放项目的配置信息。

一些定义

Java简单对象(Plain Ordinary Java Object,POJO) -> 一个同时具有属性(attributes)和行为(behavior)的对象。
JavaBean -> 简化版的POJO,行为只是getter和setter, 在Spring中把每一个需要管理的对象称为Spring Bean(简称Bean)
DTO -> JavaBean

依赖注入(Dependency Injection,DI)

SpringBoot快速入门3-依赖注入

面向切面编程(Aspect Oriented Programming,AOP)

Resource Modeling

  • RESTful system is composed of resources.
  • Resource is anything that has a URI.
  • Examples of resources can be room reservations,amenities,and service requests.

Domains

  • Resources are grouped in domains.
  • Domain is a cohesive set of resources.
  • An example domain is room.

注释(annotation)

监控地址

localhost:8080/env 环境变量
localhost:8080/beans 以Json格式显示我们应用程序中的所有Bean

自定义配置

完整配置项清单请查看官方文档

1
2
3
4
# 修改端口
server.port=8000
# 禁止自动创建DDL
spring.jpa.hibernate.ddl-auto=none

数据

MyBatis

PageHelper

为了 提高 查询 效率, 通常 会 采用 物理 分页, 然而 MyBatis 只能 支持 内存 分页。 若想 让 MyBatis 支持 物理 分页, 只能 通过 基于 拦截 器 的 插件 来 实现。 当时, 已有 的 MyBatis 分页 插件 都不 适用于 公司 已经 开发 了 大半 的 项目, 因此 我有 了 自己 写 一个 分页 插件 的 想法。 完成 后的 分页 插件( PageHelper) 能 很 方便 地 实现 对 MyBatis 查询 方法 的 分页。

MyBatis 通用 Mapper,

它 实现 了 MyBatis 单 表 增、 删、 改、 查 的 基本 方法, 能够 帮助 开发 人员 节省 大量 时间。

MyBatis 支持 声明 式 数据 缓存( declarative data caching)。 当 一条 SQL 语句 被 标记 为“ 可 缓存” 后, 首次 执行 它 时 从 数据库 获取 的 所有 数据 会被 存储 在 高速 缓存 中, 后面 再 执行 这条 语句 时 就会 从高 速 缓存 中 读取 结果, 而 不是 再次 命中 数据库。 MyBatis 提供 了 默认 情况下 基于 Java HashMap 的 缓存 实现, 以及 用于 与 OSCache、 Ehcache、 Hazelcast 和 Memcached 连接 的 默认 连接器, 同时 还 提供 了 API 供 其他 缓存 实现 使用。

· mybatis- 3( https:// github. com/ mybatis/ mybatis- 3): MyBatis 源 码, 也是 本书 中 主要 讲解 和 使用 的 内容。
· generator( https:// github. com/ mybatis/ generator): 代码 生 成器, 可以 生成 一些 常见 的 基本 方法, 提高 工作 效率。
· ehcache- cache( https:// github. com/ mybatis/ ehcache- cache): 默认 集成 Ehcache 的 缓存 实现。
· redis- cache( https:// github. com/ mybatis/ redis- cache): 默认 集成 Redis 的 缓存 实现。
· spring( https:// github. com/ mybatis/ spring): 方便 和 Spring 集成 的 工具 类。
· mybatis- spring- boot( https:// github. com/ mybatis/ mybatis- spring- boot)

xml 形式配置

使用 XML 形式 进行 配置, 首先 在 src/ main/ resources 下面 创建 mybatis- config. xml 配置文件, 然后 输入 如下 内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?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>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>

<typeAliases>
<package name="tk.mybatis.simple.model"/>
</typeAliases>

<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.16.137:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>

<mappers>
<mapper resource="tk/mybatis/simple/mapper/CountryMapper.xml"/>
</mappers>
</configuration>

· < settings > 中的 logImpl 属性 配置 指定 使用 LOG4J 输出 日志。
· < typeAliases > 元素 下面 配置 了 一个 包 的 别名, 通常 确定 一个 类 的 时候 需要 使用 类 的 全 限定 名称, 例如 tk. mybatis. simple. model. Country。 在 MyBatis 中 需要 频繁 用到 类 的 全 限定 名称, 为了 方便 使用, 我们 配置 了 tk. mybatis. simple. model 包, 这样 配 置后, 在 使用 类 的 时候 不需要 写 包 名 的 部分, 只 使用 Country 即可。
· < environments > 环境 配置 中 主要 配置 了 数据库 连接, 数据库 的 url 为 jdbc: mysql:// localhost: 3306/ mybatis, 使 用的 是 本机 MySQL 中的 mybatis 数据库, 后面 的 username 和 password 分别 是 数据库 的 用 户名 和 密码( 如果 你的 数据库 用 户名 及 密码 和 这里 的 不一样, 请 修改 为 自己 数据库 可用 的 用 户名 和 密码)。
· < mappers > 中 配置 了 一个 包含 完整 类 路径 的 CountryMapper. xml, 这是 一个 MyBatis 的 SQL 语句 和 映射 配置文件, 这个 XML 文件 会在 后面 的 章节 中 介绍。

创建 实体 类 和 Mapper. xml 文件

MyBatis 是一 个 结果 映射 框架, 这里 创建 的 实体 类 实际上 是一 个 数据 值 对象( Data Value Object), 在 实际 应用 中, 一个 表 一般 会对 应 一个 实体, 用于 INSERT、 UPDATE、 DELETE 和 简单 的 SELECT 操作, 所以 姑且 称 这个 简单 的 对象 为 实体 类。

关于 Mapper 的 命名 方式: 在 MyBatis 中, 根据 MyBatis 官方 的 习惯, 一般用 Mapper 作为 XML 和 接口 类 名 的 后缀, 这里 的 Mapper 和我 们 常用 的 DAO 后缀 类似, 只是 一种 习惯 而已, 本书 中 全部 使用 Mapper 后缀。 通常 称 XML 为 Mapper. xml 文件, 称 接口 为 Mapper 接口, 在 实际 应用 中 可以 根据 自己的 需要 来 定义 命名 方式。 在 src/ main/ java 下 创建 一个 基础 的 包 tk. mybatis. simple, 在 这个 包 下面 再 创建 model 包。 根据 数据库 表 country, 在 model 包 下 创建 实体 类 Country, 代码 如下。

1
2
3
4
5
6
7
8
public class Country {
private Long id;
private String countryname;
private String countrycode;

// get和set方法....

}

在 src/ main/ resources 下面 创建 tk/ mybatis/ simple/ mapper 目录, 再 在 该 目录 下面 创建 CountryMapper. xml 文件, 添加 如下 内容。

1
2
3
4
5
6
7
8
<?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="tk.mybatis.simple.mapper.CountryMapper">
<select id="selectAll" resultType="Country">
select id,countryname,countrycode from country
</select>
</mapper>

SQL 定义 在 CountryMapper. xml 文件 中, 里面 的 配置 作用 如下。 · < mapper >: XML 的 根 元素, 属性 namespace 定义 了 当前 XML 的 命名 空间。 · < select > 元素: 我们 所 定义 的 一个 SELECT 查询。 · id 属性: 定义 了 当前 SELECT 查询 的 唯一 一个 id。 · resultType: 定义 了 当前 查询 的 返回 值 类型, 此处 就是 指 实体 类 Country, 前面 配置 中 提到 的 别名 主要 用于 这里, 如果 没有 设置 别名, 此处 就 需要 写成 resultType=" tk. mybatis. simple. model. Country"。 · select id,…: 查询 SQL 语句。 创建 好 实体 和 Mapper. xml 后, 接下来 要有 针对 性地 配置 Log4j, 让 MyBatis 在 执行 数据库 操作 的 时候 可以 将 执行 的 SQL 和 其他 信息 输出 到 控制台。

配置 Log4j 以便 查看 MyBatis 操作 数据库 的 过程

创建 好 实体 和 Mapper. xml 后, 接下来 要有 针对 性地 配置 Log4j, 让 MyBatis 在 执行 数据库 操作 的 时候 可以 将 执行 的 SQL 和 其他 信息 输出 到 控制台。

1
2
3
4
5
6
7
8
9
10
#全局配置
log4j.rootLogger=ERROR, stdout

#MyBatis 日志配置
log4j.logger.tk.mybatis.simple.mapper=TRACE

#控制台输出配置
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

用过 Log4j 日志 组件 的 人 可能 都会 知道, 配置 中的 log4j. logger.tk. mybatis. simple. mapper 对应 的 是 tk. mybatis. simple. mapper 包, 但是 在这 个 例子 中, Java 目录 下 并没有 这个 包 名, 只在 资源 目录 下有mapper 目录。

在 MyBatis 的 日志 实现 中, 所谓 的 包 名 实际上 是 XML 配置 中的 namespace 属性 值 的 一部分。 后面 章节 中介 绍 结合 接口 使用 的 相关 内容 时, 由于 namespace 属性 值 必须 和 接口 全 限定 类 名 相同, 因此 才会 真正 对应 到 Java 中的 包。 当 使用 纯 注解 方式 时, 使用 的 就是 纯粹 的 包 名。 MyBatis 日志 的 最低 级别 是 TRACE, 在这 个 日志 级别 下, MyBatis 会 输出 执行 SQL 过程 中的 详细信息, 这个 级别 特别 适合 在 开发 时 使用。 配置 好 Log4j 后, 接下来 就可以 编写 测试 代码 让 MyBatis 跑 起来 了。

编写 测试 代码 让 MyBatis 跑 起来

首先 在 src/ test/ java 中 创建 tk. mybatis. simple. mapper 包, 然后 创建 CountryMapperTest 测试 类, 代码 如下。

Java 类加载机制与反射

返回Json

@RestController 的意思就是controller里面的方法都以json格式输出,不用再写什么jackjson配置的了!

打赏支持:如果你觉得我的文章对你有所帮助,可以打赏我哟。