开始使用Jboot

Jboot 使用到了如下的技术,了解 Jboot 之前,请先保证您已经了掌握如下技术:

  • 熟悉 Java 编程语言
  • 熟悉 maven 的基本原理
  • 熟悉 IntelliJ IDEA 或者 Eclipse 等编辑器的使用

交流 QQ 群:

  • 群1:601440615 (已满)
  • 群2:719614554 (开放中)

创建项目

通过 IntelliJ IDEA 创建项目

IntelliJ IDEA 下载地址:https://www.jetbrains.com/idea/ ,下载完成后完成后开始安装,安装过程略。

第一步:打开 IntelliJ IDEA 创建 maven 项目,如下图: 快速开始 - 图1

第二步:填写 maven 项目的 GroupId、ArtifactId 和 Version

  • GroupId 一般是包名,用来做项目的唯一标识
  • ArtifactId 一般是项目名
  • Version 是项目的版本 快速开始 - 图2

第三步:填写 项目存储路径 快速开始 - 图3

创建完毕后,我们会看到如下图所示,注意点击 Enable Auto-Import. 快速开始 - 图4

通过 Eclipse 创建项目

略,和 通过 IntelliJ IDEA 创建项目 基本相同。

Maven 依赖

通过 以上步骤建立项目后,我们会在项目目录下找到 pom.xml 文件,这个文件是 maven 的核心文件,maven 是通过 pom.xml 对项目进行依赖配置和管理的。

我们需要在 pom.xml 里添加对 Jboot 的依赖配置,如下代码:

  1. <dependency>
  2. <groupId>io.jboot</groupId>
  3. <artifactId>jboot</artifactId>
  4. <version>3.3.6</version>
  5. </dependency>

如下图所示: 快速开始 - 图5

Hello World

一般情况下,对一个新项目的了解是从 Hello World 开始的,因此,我们需要通过 Jboot 来写一个 Hello World 程序。

这个 Hello World 的需求是:

通过编写代码,我们在浏览器访问后输出 “Hello World Jboot” 的文字内容。

通过以上步骤,我们创建好了项目、添加好了 jboot 的maven依赖,接下来我们需要来创建一个叫 IndexController 的java文件, 快速开始 - 图6 快速开始 - 图7

IndexController 的代码如下:

  1. import io.jboot.app.JbootApplication;
  2. import io.jboot.web.controller.JbootController;
  3. import io.jboot.web.controller.annotation.RequestMapping;
  4. @RequestMapping("/")
  5. public class IndexController extends JbootController {
  6. public void index() {
  7. renderText("Hello World Jboot");
  8. }
  9. public static void main(String[] args) {
  10. JbootApplication.run(args);
  11. }
  12. }

以上代码需要注意以下几点:

  1. IndexController 需要继承 JbootController 或者 Controller
  2. 需要添加 @RequestMapping(“/“) 请求映射配置
  3. 通过编写 index() 方法来接收请求,并向浏览器输出 “Hello World Jboot” , 此处注意:必须叫 index() 不能修改名字,后续会讲到其原理。

通过运行 IndexController 的 main() 方法,我们可以看到如下的日志输出:

  1. ____ ____ ___ ___ ______
  2. | || \ / \ / \ | |
  3. |__ || o )| || || |
  4. __| || || O || O ||_| |_|
  5. / | || O || || | | |
  6. \ ` || || || | | |
  7. \____||_____| \___/ \___/ |__|
  8. JbootApplication { mode='dev', version='3.3.6', jfinalConfig='io.jboot.core.JbootCoreConfig' }
  9. Classpath : /Users/michael/git/jboot/target/test-classes/
  10. Starting JFinal 4.2 -> http://127.0.0.1:8080
  11. Info: jfinal-undertow 1.6, undertow 2.0.19.Final, jvm 1.8.0_201
  12. ClassScanner scan classpath : /Users/michael/git/jboot/target/test-classes
  13. ClassScanner scan classpath : /Users/michael/git/jboot/target/classes
  14. Starting Complete in 1.3 seconds. Welcome To The JFinal World (^_^)
  15. JbootResourceLoader started, Watched resource path name : webapp

我们看到最后一行日志的内容是:

  1. server started success , url : http://127.0.0.1:8080/

此时我们通过浏览器访问:http://127.0.0.1:8080 , 就可以看到如下内容: 快速开始 - 图8

链接数据库

在 Java Web 开发中,几乎 99% 以上的项目都需要和数据库打交道,因此,了解 Jboot 如何连接数据成为了必须。

通过 Jboot 连接数据库只需要做两步:

  1. 创建 jboot.properties 配置文件
  2. 在 jboot.properties 添加数据库连接信息

第一步:在项目的resource目录下创建 jboot.properties 文件,此时,项目的目录结构应该如下:

  1. ├── pom.xml
  2. ├── src
  3. ├── main
  4. ├── java
  5. └── IndexController.java
  6. └── resources
  7. └── jboot.properties #注意文件目录不要错了
  8. └── test
  9. └── java

第二步:在 jboot.properties 文件添加如下数据库信息:

  1. jboot.datasource.type = mysql
  2. jboot.datasource.url = jdbc:mysql://127.0.0.1:3306/jbootdemo
  3. jboot.datasource.user = root
  4. jboot.datasource.password =
  • jboot.datasource.type:配置的是数据库的类型,目前 Jboot 支持的数据库类型有:Mysql 、Oracle 、SqlServer 、Postgresql 、Sqlite 和 其他标准的数据库。
  • jboot.datasource.url: 配置的是数据库的连接信息
  • jboot.datasource.user: 配置的是数据库的连接账号
  • jboot.datasource.password: 配置的是数据库的连接密码,没有密码可以留空

通过配置完毕后,Jboot就已经有了访问数据库的能力,我们可以在 IndexController 写一个 dbtest() 方法,来测试下 Jboot 的数据库访问能力,代码如下:

  1. @RequestMapping("/")
  2. public class IndexController extends JbootController {
  3. public void index() {
  4. renderText("Hello World Jboot");
  5. }
  6. public void dbtest(){
  7. List<Record> records = Db.find("select * from user");
  8. renderText(Arrays.toString(records.toArray()));
  9. }
  10. public static void main(String[] args) {
  11. JbootApplication.run(args);
  12. }
  13. }

注意:以上代码能够正式运行的前提是:

  1. 你本地安装好mysql数据库,并创建好库 jbootdemo ,因为数据库的连接url是:jdbc:mysql://127.0.0.1:3306/jbootdemo
  2. jbootdemo 下要有数据表 user,因为 sql 查询内容是:select * from user

例如:作者本地数据库的内容如下: 快速开始 - 图9

运行 IndexController 的 main() 方法,并访问 http://127.0.0.1:8080/dbtest,会看到如下内容所示: 快速开始 - 图10

此时,证明 Jboot 已经能够准确访问数据库。

使用代码生成器

Jboot 内置了一个简易的代码生成器,通过代码生成器运行,Jboot帮开发者生成每个数据库表对应 java 的 model 实体类,同时可以生成带有增、删、改、查基本数据库操作能力的 service 层代码。

在使用 Jboot 代码生成器之前,我们需要在 jboot.properties 配置好数据库的连接信息(以上内容已经提到)。并编写任意名字带有main()方法的执行类,例如我们叫 CodeGenerator, 代码如下:

  1. public class CodeGenerator {
  2. public static void main(String args[]){
  3. // 配置数据库的数据源
  4. JbootApplication.setBootArg("jboot.datasource.url", "jdbc:mysql://127.0.0.1:3306/jbootdemo");
  5. JbootApplication.setBootArg("jboot.datasource.user", "root");
  6. JbootApplication.setBootArg("jboot.datasource.password", "123456");
  7. String modelPackage = "io.jboot.test.codegen.model";
  8. String baseModelPackage = modelPackage + ".base";
  9. String modelDir = PathKit.getWebRootPath() + "/src/main/java/" + modelPackage.replace(".", "/");
  10. String baseModelDir = PathKit.getWebRootPath() + "/src/main/java/" + baseModelPackage.replace(".", "/");
  11. System.out.println("start generate...");
  12. System.out.println("generate dir:" + modelDir);
  13. // 生成 Model
  14. new JbootBaseModelGenerator(baseModelPackage, baseModelDir).setGenerateRemarks(true).generate();
  15. new JbootModelGenerator(modelPackage, baseModelPackage, modelDir).generate();
  16. String servicePackage = "io.jboot.test.codegen.service";
  17. String serviceImplPackage = "io.jboot.test.codegen.service.impl";
  18. String serviceOutputDir = PathKit.getWebRootPath() + "/src/main/java/" + servicePackage.replace(".", "/");
  19. String serviceImplOutputDir = PathKit.getWebRootPath() + "/src/main/java/" + serviceImplPackage.replace(".", "/");
  20. // 生成 Service 接口 及其 实现类
  21. new JbootServiceInterfaceGenerator(servicePackage, serviceOutputDir, modelPackage).generate();
  22. new JbootServiceImplGenerator(servicePackage, serviceImplOutputDir, modelPackage).setImplName("impl").generate();
  23. }
  24. }

运行 CodeGenerator 的 main() 方法之后,我们能看到 Jboot 已经帮我们创建好对应的包名和类名,此时,项目的目录如下:

  1. ├── pom.xml
  2. ├── src
  3. ├── main
  4. ├── java
  5. ├── CodeGenerator.java
  6. ├── IndexController.java
  7. └── com
  8. └── xxx
  9. ├── model
  10. ├── Article.java
  11. ├── User.java
  12. └── base
  13. ├── BaseArticle.java
  14. └── BaseUser.java
  15. └── service
  16. ├── ArticleService.java
  17. ├── UserService.java
  18. └── impl
  19. ├── ArticleServiceImpl.java
  20. └── UserServiceImpl.java
  21. └── resources
  22. └── jboot.properties
  23. └── test
  24. └── java

通过 Jboot 代码生成器的运行,项目对应的 model 类和 service 会自动生成,同时 Service 层的代码以及带有了对数据库增、删、改、查的基本能力.

需要注意的是: 再次运行该代码生成器的时候,BaseUser、BaseArticle会被重新覆盖,其他代码不会被覆盖。 若需要重新生成 service 层 和 User、Article 等代码,需要手动删除后,再次运行代码生成器 CodeGenerator 。

自动注入

Jboot 通过 Google Guice 提供了强健稳定的代码注入功能,使用注入功能只需要了解一下三个注解:

  1. @Bean : 声明此类可以被自动注入
  2. @Inject : 对属性进行赋值注入

通过代码生成器生成的Service层代码就已经默认添加上了 @Bean 和 @Singleton 这两个配置,生成的代码如下:

  1. package com.xxx.service.impl;
  2. import io.jboot.aop.annotation.Bean;
  3. import com.xxx.service.UserService;
  4. import com.xxx.model.User;
  5. import io.jboot.service.JbootServiceBase;
  6. import javax.inject.Singleton;
  7. @Bean
  8. public class UserServiceImpl extends JbootServiceBase<User> implements UserService {
  9. }

我们使用到 UserService 接口的时候,只需要添加 @Inject 注解即可,例如:在 IndexController 需要用到 UserService,代码如下:

  1. @RequestMapping("/")
  2. public class IndexController extends JbootController {
  3. @Inject
  4. private UserService userService;
  5. public void index() {
  6. renderText("Hello World Jboot");
  7. }
  8. public void dbtest() {
  9. List<Record> records = Db.find("select * from user");
  10. renderText(Arrays.toString(records.toArray()));
  11. }
  12. public void users() {
  13. // 这里用到了 userService 的查询方法
  14. List<User> users = userService.findAll();
  15. renderText(Arrays.toString(users.toArray()));
  16. }
  17. public static void main(String[] args) {
  18. Jboot.run(args);
  19. }
  20. }

运行 main() 方法后,我们通过浏览访问 http://127.0.0.1:8080/users ,此时,页面显示的内容和 访问 http://127.0.0.1:8080/dbtest 的效果是一样的: 快速开始 - 图11

数据库的增删改查

在本章节,我们要完成一个小型的项目,这个项目是一个用户管理系统,他具有以下功能:

  • 显示用户列表,带有分页的功能
  • 可以对单个用户删除
  • 可以对用户进行修改
  • 可以添加新的用户

分页查询

我们可以继续来改造 IndexController,通过修改代码生成器的生成的 UserService,来达到上述要求的功能。

在上述的章节里,我们知道,通过如下的代码可以获得所有的用户信息:

  1. public void users() {
  2. List<User> users = userService.findAll();
  3. renderText(Arrays.toString(users.toArray()));
  4. }

如果要分页,我们需要在UserService添加一个分页的方法,并在 UserServiceImpl 来实现这个分页的方法,代码如下:

UserService.java

  1. public interface UserService {
  2. // 代码生成器生成的其他方法略
  3. //...
  4. public Page<User> paginate(int page, int size);
  5. }

UserServiceImpl.java

  1. @Bean
  2. public class UserServiceImpl extends JbootServiceBase<User> implements UserService {
  3. public Page<User> paginate(int page, int size) {
  4. return DAO.paginate(page, size);
  5. }
  6. }

为了代码更加简洁直观,我们新建一个 UserController 来做用户相关的增删改查功能,代码如下:

  1. @RequestMapping("/user")
  2. public class UserController extends JbootController {
  3. @Inject
  4. private UserService userService;
  5. public void index() {
  6. int page = getParaToInt("page", 1);
  7. Page<User> userPage = userService.paginate(page, 10);
  8. setAttr("pageData", userPage);
  9. render("/user.html");
  10. }
  11. }
  • getParaToInt() 可以获得request提交过来的page数据,例如:http://127.0.0.1:8080/user?page=100 ,此时,代码里 page 的值是 100,当不传值得时候,默认值是 1 。
  • 通过 userService.paginate 查询数据库,返回一个 Page 对象,里面包含了 当前页码、总页码 和 数据列表等信息。
  • 通过 setAttr() 把数据结果传递到页面

把数据传递到 user.html 后,需要 user.html 把具体的数据和分页相关在网页上列出来。

第一步:完善数据的显示,user.html内容如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>user index</title>
  6. </head>
  7. <body>
  8. <table >
  9. <tr>
  10. <th>ID</th>
  11. <th>登录名</th>
  12. <th>密码</th>
  13. </tr>
  14. #for(user : pageData.list )
  15. <tr>
  16. <td>#(user.id)</td>
  17. <td>#(user.login_name)</td>
  18. <td>#(user.password)</td>
  19. </tr>
  20. #end
  21. </table>
  22. </body>
  23. </html>

此时,运行 main() 方法,访问 http://127.0.0.1:8080/user ,页面显示内容如下:

快速开始 - 图12

第二步:完善分页功能。

Jboot应用的分页功能需要自定义一个分页标签,自定义分页标签非常简单,代码内容如下:

  1. @JFinalDirective("myPaginate")
  2. public class MyPaginateDirective extends JbootPaginateDirective {
  3. protected String getPageAttrName() {
  4. return "pageData"; //这个值要和Controller里setAttr的第一个参数值相同
  5. }
  6. }

然后再修改 user.html 内容如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>user index</title>
  6. </head>
  7. <body>
  8. <table >
  9. <tr>
  10. <th>ID</th>
  11. <th>登录名</th>
  12. <th>密码</th>
  13. </tr>
  14. #for(user : pageData.list )
  15. <tr>
  16. <td>#(user.id)</td>
  17. <td>#(user.login_name)</td>
  18. <td>#(user.password)</td>
  19. </tr>
  20. #end
  21. </table>
  22. #myPaginate()
  23. #for(page : pages)
  24. <a href="#(page.url??)" >#(page.text??)</a>
  25. #end
  26. #end
  27. </body>
  28. </html>

此时,运行 main() 方法,访问 http://127.0.0.1:8080/user ,页面显示内容如下:

快速开始 - 图13

由于数据量太小,同时在我们的代码里,要求每页显示10条数据,所以页面才显示了第一页,当我们在数据库添加数据量超过10条的时候,页面显示内容如下:

快速开始 - 图14

同时,上一页、下一页等功能正常使用,如下图:

快速开始 - 图15

实际上,#myPaginate() 自定义分页标签还可以做更多的配置,包括功能和样式等,但是这不是本章节要讨论的内容了。

新增功能

为了实现新增功能,我们需要写一个叫 add.html 的页面,并写对应的 Controller,保证可以访问。

add.html 的代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>user add</title>
  6. </head>
  7. <body>
  8. <form action="/user/doSave" method="post">
  9. 登录名: <input type="text" name="login_name"> <br/>
  10. 密码: <input type="text" name="password"> <br/>
  11. <input type="submit" value="提交数据">
  12. </form>
  13. </body>
  14. </html>

通过 add.html 内容我们能看到,当用户点击 提交数据 按钮的时候,页面会把数据提交到 /user/doSave 这个路径上去,所以,需要我们在 UserController 编写一个叫做 doSave() 的方法来接收数据,并保存到数据库。

doSave() 方法内容如下:

  1. public void doSave() {
  2. String loginName = getPara("login_name");
  3. String password = getPara("password");
  4. User user = new User();
  5. user.setLoginName(loginName);
  6. user.setPassword(password);
  7. user.save();
  8. redirect("/user");
  9. }

doSave() 方法的主要作用是接收数据、把数据保存到数据库、然后跳转到 /user 这个页面去。

修改功能

为了减少代码量,我们直接把 add.html 改造成为可用做新增,也可以用作修改的功能(通常在商业项目中也会这么做),因此,我们需要简单修改下 add.html 代码和 add() 这个方法的代码。

add.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>user add</title>
  6. </head>
  7. <body>
  8. <form action="/user/doSave" method="post">
  9. <input type="hidden" name="id" value="#(id ??)">
  10. 登录名: <input type="text" name="login_name"> <br/>
  11. 密码: <input type="text" name="password"> <br/>
  12. <input type="submit" value="提交数据">
  13. </form>
  14. </body>
  15. </html>

和新增功能的html对比,增加了 <input type="hidden" name="id" value="#(id ??)"> 这行代码。

add() 方法内容如下:

  1. public void add() {
  2. int id = getParaToInt("id", 0);
  3. if (id > 0) { //有id ,说明有数据提交过来,用来做修改的标识。
  4. setAttr("id", id);
  5. }
  6. render("/add.html");
  7. }

同时, doSave()方法也需要修改下,用来区分是新增还是修改,代码如下:

  1. public void doSave() {
  2. String loginName = getPara("login_name");
  3. String password = getPara("password");
  4. long id = getParaToLong("id",0l);
  5. User user = new User();
  6. user.setLoginName(loginName);
  7. user.setPassword(password);
  8. if (id > 0){ //说明是更新
  9. user.setId(id);
  10. user.update();
  11. }else { //说明是新增
  12. user.save();
  13. }
  14. redirect("/user");
  15. }

最后,我们在改造下 user.html ,在表格的后面添加一个 修改 的连接, user.html 代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>user index</title>
  6. </head>
  7. <body>
  8. <table >
  9. <tr>
  10. <th>ID</th>
  11. <th>登录名</th>
  12. <th>密码</th>
  13. <th>操作</th>
  14. </tr>
  15. #for(user : pageData.list )
  16. <tr>
  17. <td>#(user.id)</td>
  18. <td>#(user.login_name)</td>
  19. <td>#(user.password)</td>
  20. <td><a href="/user/add?id=#(user.id)">修改</a></td>
  21. </tr>
  22. #end
  23. </table>
  24. #myPaginate()
  25. #for(page : pages)
  26. <a href="#(page.url??)" >#(page.text??)</a>
  27. #end
  28. #end
  29. </body>
  30. </html>

此时,页面内容如下,修改功能正常使用。 快速开始 - 图16

删除功能

删除功能更加简单,只需要在Controller接收ID,然后调用 userService.delete() 方法就可以了,改造 user.html 代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>user index</title>
  6. </head>
  7. <body>
  8. <table >
  9. <tr>
  10. <th>ID</th>
  11. <th>登录名</th>
  12. <th>密码</th>
  13. <th>操作</th>
  14. </tr>
  15. #for(user : pageData.list )
  16. <tr>
  17. <td>#(user.id)</td>
  18. <td>#(user.login_name)</td>
  19. <td>#(user.password)</td>
  20. <td>
  21. <a href="/user/add?id=#(user.id)">修改</a>
  22. <a href="/user/del?id=#(user.id)">删除</a>
  23. </td>
  24. </tr>
  25. #end
  26. </table>
  27. #myPaginate()
  28. #for(page : pages)
  29. <a href="#(page.url??)" >#(page.text??)</a>
  30. #end
  31. #end
  32. </body>
  33. </html>

页面显示如下: 快速开始 - 图17

我们只需要在 UserController 编写一个 del() 方法,接收id、删除数据库数据,并跳转回 /user 即可完成任务,代码如下:

  1. public void del() {
  2. long id = getParaToLong("id",0l);
  3. userService.deleteById(id);
  4. redirect("/user");
  5. }

到目前为止,增删改查所有功能完成。

使用缓存提高性能

通过以上内容,我们可以使用Jboot开发一个具有增、删、改、查基本功能的Java Web 应用,但是,在互联网的应用里,高并发的要求可以说是必不可少的,缓存在提高应用性能和并发上有绝对的话语权。

在 Jboot 里,我们如何来使用缓存呢?

Jboot 提供了两种方案:

  1. 注解
  2. 手写代码

在注解中,Jboot提供了4个注解,方便的对缓存进行操作,他们分别是:

  • @Cacheable
  • @CachePut
  • @CacheEvict
  • @CachesEvict

如何来使用呢?

在以上的章节里,我们知道,如下的代码是一个分页查询的功能:

  1. public class UserServiceImpl extends JbootServiceBase<User> implements UserService {
  2. public Page<User> paginate(int page, int size) {
  3. return DAO.paginate(page, size);
  4. }
  5. }

如何来让 paginate(int page, int size) 方法具有缓存的功能呢?

非常简单:

  1. public class UserServiceImpl extends JbootServiceBase<User> implements UserService {
  2. @Cacheable(name = "myCache",key = "page:#(page)-#(size)")
  3. public Page<User> paginate(int page, int size) {
  4. return DAO.paginate(page, size);
  5. }
  6. }

只需要添加 @Cacheable(name = "myCache",key = "page:#(page)-#(size)") 这个注解。

在Jboot中,默认的缓存为 EhCache , 这个注解的含义是:

  • 在EhCache中创建一个缓存为myCache的缓存区
  • 当查询第 1 页的时候,缓存的key为:page:1-10,因为 paginate(int page, int size) 方法在执行的时候,传递过来的值分别是:page=1,size=10
  • 当查询第 2 页的时候,缓存的key为:page:2-10,原因同上。

paginate(int page, int size) 方法使用 @Cacheable 缓存之后,只有第一次访问的时候去查询数据库,之后的访问会直接从缓存中获取数据,大大提高了性能。

但是…

使用缓存也会带来一些问题,因为 paginate(int page, int size) 方法不再访问数据库,从而导致我们在数据库对数据进行增、删、改,这个页面数据都不会再发生变化。

要让 paginate(int page, int size) 方法与数据库同步,怎么办呢?

需要我们在对数据库进行 增、删、改 的时候,清除这个方法里的缓存数据。

代码如下:

  1. public class UserServiceImpl extends JbootServiceBase<User> implements UserService {
  2. @Cacheable(name = "myCache",key = "page:#(page)-#(size)")
  3. public Page<User> paginate(int page, int size) {
  4. return DAO.paginate(page, size);
  5. }
  6. @Override
  7. @CacheEvict(name = "myCache",key = "*")
  8. public boolean save(User model) {
  9. return super.save(model);
  10. }
  11. @Override
  12. @CacheEvict(name = "myCache",key = "*")
  13. public boolean update(User model) {
  14. return super.update(model);
  15. }
  16. @Override
  17. @CacheEvict(name = "myCache",key = "*")
  18. public boolean delete(User model) {
  19. return super.delete(model);
  20. }
  21. }

重写父类 JbootServiceBase 的增、删、改的方法,在这些方法添加 @CacheEvict(name = "myCache",key = "*") 注解。

被添加@CacheEvict的方法,在执行之后,会清除 name 为 myCache 的所有key。 也就是清除 paginate(int page, int size) 方法所有的 key 。

这样,就做到了 paginate(int page, int size) 方法与数据库同步的功能了。是不是非常简单呢 ?!

不过 …

以上,只是 Jboot 缓存功能的冰山一角,Jboot 的缓存非常强大,比如:

  • @CachePut 和 @CachesEvict 又如何使用?什么场景下使用?
  • 如何使用 Redis 或者其他的缓存方案代替默认的 EhCache ,甚至是公司自己内部的缓存方案 ?
  • 分布式缓存如何做 ?
  • 如何设置缓存的失效时间 ?
  • 如何做到整个网页缓存,类似页面静态化?
  • 等等等等

Jboot 都给与类非常完美的支持。

探索Jboot的更多功能…

恭喜你,到目前为止,你已经掌握了使用 Jboot 来开发一个 java web 的基本技能,包含了

  • MVC
  • ORM
  • AOP
  • 代码生成器
  • 使用缓存提高性能
  • 等等

这是非常重要的一步。

但是,Jboot 的功能远远不止这些,以上只是 Jboot 的冰山一角。

Jboot 真正的核心是做微服务的开发,微服务的底层代码是分布式调用RPC,RPC 的框架和实现的方案非常繁杂,不过 Jboot 已经支持了主流 RPC 的实现,其中包含了 Dubbo 、motan、Zbus等, 未来还会添加 gRPC 等更多的支持。

  • 在 RPC 下,Jboot 支持了 RPC 下的 熔断、降级、监控、Opentracing等等功能
  • 在分布式下,Jboot 支持了分布式缓存、分布式Session、分布式锁、分布式任务、统一配置中心
  • 在数据库下,Jboot 支持分库分表、支持 Reids 等nosql数据库的极简调用
  • 在 MQ 下,Jboot 支持 rabbitmq、redismq、zbus 甚至还支持了 阿里云的商业MQ
  • 另外,Jboot还支持了Swagger、Event事件机制、高并发下的限流方案等等更多的惊喜

希望你用的顺手、开心,如果有什么问题,可以通过 顶部菜单的 提问 链接进行提问,我回在第一时间回复您。