SpringBoot2.1版本的我的應用開發框架 - 集成Druid + MybatisPlus

本篇做爲SpringBoot2.1版本的我的開發框架 子章節,請先閱讀SpringBoot2.1版本的我的開發框架再次閱讀本篇文章html

後端項目地址:SpringBoot2.1版本的我的應用開發框架前端

前端項目地址:ywh-vue-adminvue

建立core子模塊的項目結構

咱們先對core模塊進行規劃,core模塊主要用來編寫業務代碼,能把一些公用的方法或者類最好都提出去放到common模塊下,修改以上文件後,咱們對core模塊中建立咱們寫代碼以及配置的一些package在core模塊下com,ywh.core右鍵點擊 New->package建立包名,這裏以我本身的習慣來建立的,能夠按照本身的習慣來命名。java

core是項目的核心模塊,結構初步規劃以下:mysql

  • config —— 放一些配置文件
  • controller —— controller層的控制器放在這個包下
  • dao —— 對數據庫的一些操做接口放到這裏
  • entity —— 業務對象的實體類
  • service —— service層的接口與實現類,Impl裏放service的實現類
  • system —— 能夠放一些core單獨使用的系統類
  • mybatis-mappers —— 放Mybatis的xml文件,這個文件在resource下建立

core模塊結構

Druid介紹

建立數據庫鏈接是一個很耗時的操做,也很容易對數據庫形成安全隱患。對數據庫鏈接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響程序的性能指標。git

Druid首先是一個數據庫鏈接池,但它不只僅是一個數據庫鏈接池,它還包含一個ProxyDriver,一系列內置的JDBC組件庫,一個SQLParser。Druid支持全部JDBC兼容的數據庫,包括Oracle、MySql、Derby、Postgresql、SQLServer、H2等等。 Druid針對Oracle和MySql作了特別優化,好比Oracle的PSCache內存佔用優化,MySql的ping檢測優化。Druid在監控、可擴展性、穩定性和性能方面都有明顯的優點。Druid提供了Filter-Chain模式的擴展API,能夠本身編寫Filter攔截JDBC中的任何方法,能夠在上面作任何事情,好比說性能監控、SQL審計、用戶名密碼加密、日誌等等。github

參考:web

項目中配置Druid

我選擇用mysql數據庫,在配置Druid以前先要引入mysql的依賴以及Druid的依賴,在core子模塊pom.xml文件中引入依賴 ,而後配置coreapplication-dev.yml文件,yml文件中大多數是默認配置而且我寫了註釋很好理解,若是想自定義配置能夠參考Druid的GitHub官方文檔。這裏添加JDBC的依賴是由於要鏈接數庫,須要驅動來進行鏈接,後面添加了MyBatisPlus後就能夠去掉了。

<!-- 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>
    <version>8.0.13</version>
</dependency>
 
<!-- jdbc驅動依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
複製代碼

application-dev.yml文件內容,如下內容有省略,具體內容可查看 application-dev.yml

#在這裏我沒有寫driver-class-name: com.mysql.jdbc.Driver這個驅動被棄用了 使用新版com.mysql.cj.jdbc.Driver 
#控制檯提示說自動幫咱們找相應的驅動,通常無需手動加載,因此我註釋掉了
spring:
 datasource:
 type: com.alibaba.druid.pool.DruidDataSource
    # 初始化Druid
 druid:
      # mysql數據庫接地址
 url: jdbc:mysql://127.0.0.1:3306/ywh_code?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
      #driver-class-name: com.mysql.cj.jdbc.Driver
 username: root
 password: 123456
      # 監控頁面的用戶名和密碼 以及頁面地址
 stat-view-servlet:
 login-username: admin
 login-password: admin
 enabled: true
 url-pattern: /druid/*
複製代碼

配置好Durid後,咱們就能夠訪問 http://localhost:8082/core/druid/login.html 了。個人端口號是8082,由於我在application.yml配置了context-path: /core,因此個人訪問地址是上面的地址,若是沒有配置的話,默認就是 http://localhost:8080/druid/login.html ,登陸帳戶和密碼都是admin,監控界面我就不貼了。

集成Mybatis-Plus

配置好Druid之後,就能鏈接數據庫了,若是使用原生的jdbc鏈接數據庫也能夠,可是這樣就太麻煩了,因此我採用了Myatis的加強版Mybatis-Plus,Mybatis-Plus對Mybatis只作加強不作修改,因此完美兼容了Mybatis,並且也支持自動生成代碼給你,以及給用戶支持了大量的CRUD的接口,也有不少的優秀案例採用了Mybaits-Plus。

項目中配置Mybatis-Plus

首先在父pom.xml中引入Mybatis-Plus的相關依賴,配置core下application-dev.yml文件,在根據官網中所要求的在啓動類中添加@MapperScan(basePackages = "com.ywh.**.dao")來掃描你dao包下全部接口自動注入到Spring的IOC容器中,以便咱們使用;依賴分別爲:mybatis-plus-boot-starter,freemarker,velocity,後兩個爲生成代碼的時候以哪一個爲模板,後面會用到,這兩個可自行上網搜索查看簡介。

<!-- mybatisPlus的依賴 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.6</version>
</dependency>
<!-- freemarke引擎依賴引入 -->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.28</version>
</dependency>
 
<!-- velocity引擎依賴引入 -->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.7</version>
</dependency>
複製代碼

application-dev.yml

mybatis-plus:
 mapper-locations: classpath*:/mybatis-mappers/*
  # MyBaits 別名包掃描路徑,經過該屬性能夠給包中的類註冊別名,註冊後在 Mapper 對應的 XML 文件中能夠直接使用類名,而不用使用全限定的類名
 type-aliases-package: com.ywh.core.entity
  # 數據庫表與實體類的駝峯命名自動轉換
 configuration:
 map-underscore-to-camel-case: true
複製代碼
@SpringBootApplication(scanBasePackages = "com.ywh")
/** * 全局配置,掃描指定包下的dao接口,不用每一個dao接口上都寫@Mapper註解了 */
@MapperScan(basePackages = "com.ywh.**.dao")
public class CoreApplication {
 
	public static void main(String[] args) {
		SpringApplication.run(CoreApplication.class, args);
	}
}
複製代碼

測試用例

配置好之後咱們來測試一下是否能夠對數據庫進行操做了,數據庫ywh_code中建立一個user表而且插入幾條數據供咱們查詢。

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶姓名',
  `age` tinyint(3) unsigned NOT NULL COMMENT '用戶年齡',
  `gender` tinyint(3) unsigned NOT NULL COMMENT '用戶性別',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
 
INSERT INTO `user` VALUES ('1', 'ywh', '22', '1');
INSERT INTO `user` VALUES ('2', 'lry', '22', '1');
INSERT INTO `user` VALUES ('3', 'whp', '26', '0');
複製代碼

在咱們以前建立的Entity實體包中的ExampleEntity實體類中編寫對應數據庫的屬性,dao層的ExampleDao接口類中寫個查詢方法,並在springboot的測試類中測試一下咱們的配置是否好使,實體類中的屬性要有本身的get,set方法,我使用Lombok的註解方式幫咱們自動生產get,set方法。首先在父pom.xml引入lombok的依賴包,並在idea中安裝lombok的插件,若是認爲這種方式太麻煩,能夠直接本身生成get,set方法。

<!-- lombok的依賴 -->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.4</version>
  <scope>provided</scope>
</dependency>
複製代碼

在idea中選擇File->Settings->Plugins中搜索lombok Plugin插件並安裝,若是有鏈接超時的錯誤,下載不了的話,能夠點擊IDEA中lombok插件下載下載到本地後,本地安裝此插件。

實體類

import lombok.Data;
 
/** * CreateTime: 2018-12-09 18:24 * ClassName: ExampleEntity * Package: com.ywh.core.entity * Describe: * 測試實體類 * * @author YWH */
@Data
public class ExampleEntity {
 
    private Integer id;
 
    private String name;
 
    private String age;
 
    private String gender;
 
}
複製代碼

dao接口

import com.ywh.core.entity.ExampleEntity;
import org.apache.ibatis.annotations.Select;
 
import java.util.List;
 
/** * CreateTime: 2018-12-09 18:25 * ClassName: ExampleDao * Package: com.ywh.core.dao * Describe: * 測試例子的Dao層 持久層 * * @author YWH */
public interface ExampleDao {
 
    @Select("select * from user")
    List<ExampleEntity> findAll();
 
}
複製代碼

SpringBoot測試類

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class CoreApplicationTests {
 
    @Autowired
    private ExampleDao exampleDao;
 
    @Test
    public void contextLoads() {
        List<ExampleEntity> all = exampleDao.findAll();
        System.out.println(all);
    }
 
}
複製代碼

運行測試方法後,輸出結果爲:

[ExampleEntity(id=1, name=ywh, age=22, gender=1), ExampleEntity(id=2, name=lry, age=22, gender=1), ExampleEntity(id=3, name=whp, age=26, gender=0)]
複製代碼

MybatisPlus代碼生成器

集成了MybatisPlus,關於MybatisPlus的核心功能中的代碼生成器能夠幫咱們大大提高工做效率,不用建立不少的重複工做,AutoGenerator 是 MyBatis-Plus 的代碼生成器,經過 AutoGenerator 能夠快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模塊的代碼,極大的提高了開發效率,這個代碼生成的也不過是咱們提早定好的通用的方法,具體的業務代碼仍是要咱們本身來寫的,不過在很大程度上幫助了咱們不少。

這個功能我是放到了common模塊下的,因此咱們要對common子模塊分一下結構。

  • base:放基礎的controller、service等
  • config:放一些配置類
  • entity:放一些基礎的實體類
  • mapper:能夠放基礎的mapper.xml文件
  • exception:能夠放咱們自定義的異常類
  • utils:放一些公用的工具類
  • resources目錄下建立templates放咱們後面用到的模板文件。

20190411144717

建立好目錄結構之後,咱們建立一個myBatisPlus.properties文件來存放咱們經常要改變的變量,這樣就不用去代碼中去更改了,內容以下:

#此處爲本項目src所在路徑(代碼生成器輸出路徑)
outputDir=/ywh-starter-core/src/main/java
#父的包名
setParent=com.ywh.core
#是否覆蓋文件   默認是false    若是生成的代碼有改動的話  在沒有確認以前不要改爲true  不然會把文件覆蓋  丟失代碼
fileOverride=false
#數據庫地址
url=jdbc:mysql://127.0.0.1:3306/ywh_code?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8
#數據庫驅動
driverClass=com.mysql.cj.jdbc.Driver
#數據庫用戶名
userName=root
#數據庫密碼
passWord=123456
# mapper.xml文件生成路徑
mapperPath=/ywh-starter-core/src/main/resources/mybatis-mappers/
複製代碼

配置模板內容

咱們生成代碼是須要根據模板來生成的,MybatisPlus官方默認使用的模板是velocity,它還提供了另一種模板就是freemarker。

  • velocity:Velocity是一個基於Java的模板引擎。它容許任何人使用簡單而強大的模板語言來引用Java代碼中定義的對象。
  • freemarker:FreeMarker是一款模板引擎: 即一種基於模板和要改變的數據, 並用來生成輸出文本的通用工具。
  • freemarker的語法能夠參考:Freemaker FTL指令經常使用標籤及語法

com.baomidou.mybatis-plus-generator包下有一個templates文件夾下有官方提供的模板文件,咱們使用的是freemarker模板引擎,後綴名爲.ftl的就是了,把帶.ftl的文件都複製到咱們建立的templates下,固然若是不想本身修改內容,能夠不用複製出來,直接使用默認的就能夠了,跳過這步就能夠。

模板所在地方

controller.java.ftl:因爲代碼過多,這裏只貼出一個示例,其餘具體代碼請前往個人git查看。freemarker模板

package ${package.Controller};
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Autowired;
import ${package.Service}.${table.serviceName};
import ${package.Entity}.${table.entityName};
<#if restControllerStyle>
import org.springframework.web.bind.annotation.RestController;
<#else>
import org.springframework.stereotype.Controller;
</#if>
<#if superControllerClassPackage??>
import ${superControllerClassPackage};
</#if>
 
/**
 * CreateTime: ${date}
 * ClassName: ${table.controllerName}
 * Package: ${package.Controller}
 * Describe:
 * ${table.comment!} 前端控制器
 * @author YWH
 */
<#if restControllerStyle>
@RestController
<#else>
@Controller
</#if>
@RequestMapping("<#if controllerMappingHyphenStyle??>${table.controllerName}<#else>${controllerMappingHyphen}</#if>")
<#if superControllerClass??>
public class ${table.controllerName} extends ${superControllerClass}<${table.serviceName},${table.entityName}> {
<#else>
public class ${table.controllerName} {
</#if>
    private static final Logger log = LoggerFactory.getLogger(${table.controllerName}.class);
    @Autowired
    private ${table.serviceName} service;
}
複製代碼

編寫自動生成代碼

接下來咱們就能夠按着官方的提供的示例來編寫咱們本身用來生成代碼的工具類了,在utils下建立CodeGenerator類,代碼詳解我就不介紹了,能夠根據官方文檔來閱讀(在上面有貼出地址),生成的代碼中雖然是空的,可是由於繼承了MybatisPlus提供的類,因此咱們已經有了大量的CRUD的接口來供咱們使用了,具體的CRUD接口能夠參考MybatisPlus官方CRUD接口

package com.ywh.common.utils;

/** * CreateTime: 2018-12-16 13:52 * ClassName: CodeGenerator * Package: com.ywh.common.utils * Describe: * MybatisPlus的代碼生成器 * * @author YWH */
public class CodeGenerator {
 
    /** * 獲取控制檯上的內容 * @param tip 控制檯輸入的內容 * @return */
    public static String scanner(String tip){
        Scanner scanner = new Scanner(System.in);
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("請輸入" + tip + ":");
        System.out.println(stringBuilder.toString());
        if(scanner.hasNext()){
            String ipt = scanner.next();
            if(StringUtils.isNotEmpty(ipt)){
                //輸入的不是空就返回
                return ipt;
            }
        }
        throw new MybatisPlusException("請輸入正確的" + tip +"! ");
    }
 
    public static void main(String[] args) {
 
        ResourceBundle resource = ResourceBundle.getBundle("myBatisPlus");
        String outPutDir = resource.getString("outputDir");
        Boolean fileOverride = false;
        if("true".equals(resource.getString("fileOverride"))){
            fileOverride = true;
        }
        String url = resource.getString("url");
        String driverClass = resource.getString("driverClass");
        String userName = resource.getString("userName");
        String passWord = resource.getString("passWord");
        String setParent = resource.getString("setParent");
 
        //代碼生成器
        。。。。。。。因爲代碼過長,具體代碼請前往github查看
    }
}
複製代碼

效果以下:

自動生成代碼
相關文章
相關標籤/搜索