Skip to content

findfz/SpringBoot-MyBatis

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SpringBoot-MyBatis

最近由于实训,发现很多同学都在开发 Java 后台,因此少不了重复繁杂的配置工作,这个框架就是为了减少这些不必要的工作。它集成了 Spring BootMyBatis,并实现了一个类似“书籍管理”的模块(支持 RESTful API)以供参考,框架简单易懂。完全可以根据自己的需要,修改这个框架,以实现自己想实现的功能。

技术

  • Spring Boot
  • MyBatis
  • MySQL or HSQLDB (a in-memory database)
  • Maven
  • Commons Logging
  • Java 8 Lambda Expressions
  • Lombok
  • Apache Commons Lang

细节

这个项目其实有点像一个 Demo 项目。我没有将 Spring Boot、MyBatis 和其他框架提供的功能再封装一层(虽然可以这样做),以提供更加应用级的接口。这是因为我觉得这些框架已经提供了很好的封装度和灵活度,完全只需要“掌控”他们,再“利用”他们,你就能实现你想要的。既然是一个 Demo 项目,所以对于初学者,还是有必要讲解一下其中的“门道”。对于我个人来说,这一个部分就有点像在回忆:“我当时怎么做的,为什么这样做”。(顺序有点乱,请根据需要阅读)

文件目录

`-- src
	|-- main
	|	|-- java
	|	|	`-- com
	|	|		`-- shawn
	|	|			|-- constant
	|	|			|-- model
	|	|			|	|-- dto
	|	|			|	`-- entity
	|	|			|-- monitor
	|	|			|-- repository
	|	|			|	`-- mybatis
	|	|			|-- service
	|	|			|	`-- impl
	|	|			|-- util
	|	|			`-- web
	|	|				|-- controller
	|	|				|-- excetpion
	|	|				`-- filter
	|	`-- resources
	|		|-- com
	|		|	`-- shawn
	|		|		`-- repository
	|		|			`-- mybatis
	|		`-- db
	|			`-- hsqldb
	`-- test
		`-- ...(& so on)
  • src/main/java/com/shawn/constant: 该目录放置了各种常量类
  • src/main/java/com/shawn/model: 该目录放置了各种模型类,其子目录 dto 放置了 DTO(Data Trasfer Object)类,其另一子目录 entity 放置了实体类
  • src/main/java/com/shawn/monitor: 该目录放置了各种监测类
  • src/main/java/com/shawn/repository: 该目录放置了数据库增删改查的接口,其子目录 impl 放置了这些接口的实现类
  • src/main/java/com/shawn/service: 该目录下放置服务(一个服务对应于一些业务逻辑的集合)的接口,其子目录 impl 放置了这些接口的实现类
  • src/main/java/com/shawn/util: 该目录放置了各种工具类
  • src/main/java/com/shawn/web: 该目录放置了和网络层相关的一切,包括控制器、异常处理、过滤器等等
  • src/main/resources/com/shawn/repository/mybatis: 该目录放置了 MyBatis 的映射器 XML 文件
  • src/main/resources/db: 该目录放置了有关内存数据库的脚本,其子目录 hsqldb 放置了 HSQL 的数据库脚本

架构

为了节约时间就不谈架构的重要性了,那我们先把关注点放在 Web 应用的职责上(Web 应用应该做些什么):

  • 它应该能够处理用户的输入,并且返回正确的相应给用户
  • 它应该拥有一套异常处理机制,来应对错误发生的时候
  • 它应该拥有一个事务管理策略
  • 它应该能够对用户进行认证和授权
  • 它应该要实现业务逻辑,为用户提供服务
  • 它应该要能操纵数据库和其他资源
  • ……

那么,怎样才能,既实现这些职责,又达到低耦合高内聚(提供一定的封装度和灵活度)的要求?三层架构可以支持这一切,它的概览如下图所示:

Three Layer architecture

  • Web层:Web 应用的最顶层。它负责处理用户输入以及返回正确的相应给用户;处理其他层抛出的异常并向用户反映错误的发生;对用户进行认证,拒绝未认证的用户访问。
  • Service层:Web 应用的中间层。它应该组织业务逻辑,为 Web 层提供服务;使得所有服务都是事务性的(要么完成,要么什么都没做);负责用户的授权。
  • Repository层:Web 应用的最底层。它负责操纵数据库,以实现对数据库的增删改查。

那么,这三层的组件要如何交互呢?最佳实践是:上层组件使用下层组件,使用模型(Model)作为交互媒介。模型包括两种:数据传输对象(DTO)和领域模型(Domain Model)。

  • DTO: 一种用户可见的数据容器。它用来传输用户可见的数据,屏蔽了 Web 应用的内部实现。
  • Domain Model: 具有领域特征的数据容器。一般来说,它对应于数据库中的表,它代表了 Web 应用的内部实现,应该对用户透明。

Lombok

一直以来,都觉得 POJO 类里面的 get、set 方法使得代码显得非常臃肿,不像 C# 里从语言层面支持了 get 访问器和 set 访问器。那么在 Java 中有没有类似可以消除这样冗余代码的技巧呢?答案就是 Lombok。Lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码。举个例子:

不使用 Lombok:

public class BookStore {

    private long id;
    private String name;
    private String address;

    public BookStore() {
    }

    public long getId() {
        return id;
    }

    public BookStore setId(long id) {
        this.id = id;
        return this;
    }

    public String getName() {
        return name;
    }

    public BookStore setName(String name) {
        this.name = name;
        return this;
    }

    public String getAddress() {
        return address;
    }

    public BookStore setAddress(String address) {
        this.address = address;
        return this;
    }

}

使用 Lombok:

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

@Accessors(chain = true)
@NoArgsConstructor
@Getter
@Setter
public class BookStore {

    private long id;
    private String name;
    private String address;

}

在本项目中使用的 Lombok 注解有:

  • @Accessors
  • @NoArgsConstructor
  • @Getter
  • @Setter
  • @ToString
  • @CommonsLog

未完待续……

引用

About

A back-end RESTful framework, integrated by Spring Boot and MyBatis

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%