本篇做为SpringBoot2.1版本的我的开发框架 子章节,请先阅读SpringBoot2.1版本的我的开发框架再次阅读本篇文章html
后端项目地址:SpringBoot2.1版本的我的应用开发框架前端
前端项目地址:ywh-vue-adminvue
咱们先对core模块进行规划,core模块主要用来编写业务代码,能把一些公用的方法或者类最好都提出去放到common模块下,修改以上文件后,咱们对core模块中建立咱们写代码以及配置的一些package在core模块下com,ywh.core右键点击 New->package建立包名,这里以我本身的习惯来建立的,能够按照本身的习惯来命名。java
core是项目的核心模块,结构初步规划以下:mysql
建立数据库链接是一个很耗时的操做,也很容易对数据库形成安全隐患。对数据库链接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响程序的性能指标。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的GitHubspring
Druid常见问题集锦sql
我选择用mysql数据库,在配置Druid以前先要引入mysql的依赖以及Druid的依赖,在core子模块pom.xml文件中引入依赖 ,而后配置core下application-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,监控界面我就不贴了。
配置好Druid之后,就能链接数据库了,若是使用原生的jdbc链接数据库也能够,可是这样就太麻烦了,因此我采用了Myatis的加强版Mybatis-Plus,Mybatis-Plus对Mybatis只作加强不作修改,因此完美兼容了Mybatis,并且也支持自动生成代码给你,以及给用户支持了大量的CRUD的接口,也有不少的优秀案例采用了Mybaits-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的核心功能中的代码生成器能够帮咱们大大提高工做效率,不用建立不少的重复工做,AutoGenerator 是 MyBatis-Plus 的代码生成器,经过 AutoGenerator 能够快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提高了开发效率,这个代码生成的也不过是咱们提早定好的通用的方法,具体的业务代码仍是要咱们本身来写的,不过在很大程度上帮助了咱们不少。
这个功能我是放到了common模块下的,因此咱们要对common子模块分一下结构。
建立好目录结构之后,咱们建立一个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。
在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查看
}
}
复制代码
效果以下: