写在前面
这一篇讲讲 Springboot+Mybatis+Druid 搭建简单项目。
如果有谈及上一篇的内容,你可以先去看我的上一篇文章
【SpringBoot项目部署到Docker】一、搭建Ubuntu Docker环境
Springboot!简化简化再简化!
springboot是为了简化开发配置,提升快速开发效率而生的,所以我也就尽量遵循这个原则去搭建项目。
springboot也为开发者提供了初始化项目工具网站,Idea里新建项目时也默认集成了springboot Initializr 功能,过程大同小异
很快就创建好了最简单的springboot web项目。
打开pom文件可以看到已经添加了spring-boot-starter-web依赖,里面包含了spring,spring mvc,tomcat集成等等内容。
org.springframework.boot
spring-boot-starter-web
此时,不用去配置什么繁琐的
web.xml
spring-serlet.xml
applicationContext.xml
只需要在application.properties配置基础内容就可以进行使用了(甚至不配也可以,会按默认配置启动)
比如下面的~~~
#application.properties
#指定web启动监听端口,默认是8080
server.port=8082
#数据源配置
#spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#spring.datasource.url=jdbc:mysql://localhost:3306/xxx
#spring.datasource.username=root
#spring.datasource.password=password
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
另外,springboot默认扫描启动类(带这个注解的类@SpringBootApplication)
包名下和同级包名的类,所以,这是大部分开发者推荐的包结构
com
+- example
+- myproject
+- Application.java (启动类)
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
| +- CustomerController.java
|
当然啦,你也可以不遵循springboot的默认扫描方式,但是就得去启动类里手动添加组件扫描注解了@ComponentScan
关于Mybatis、Druid
其实我真的不太喜欢mybatis,一直都觉得这种xml配置sql的方式真的太反人类了,但是国内环境就是这样,欸,面试他还就那个考你mybatis,我也不敢不用不敢不去熟悉(卑微)。
所以,我就在springboot上了解了一下如果快速用mybatis开发,其实mybatis也专门为整合springboot做了依赖包叫做
嗯,官方文档推荐使用注解写入sql进行快速开发,开发是快速了,以后维护可就龟速了。注解写入sql带来的问题还是很多的,那么还是得找到一个辅助工具,就是mybatis-plus,这样的辅助工具还有很多比如tk.mybatis,选择是我遵循简单快速原则做出的选择。
Druid是阿里巴巴开发的数据连接池,说实话我对这块的知识量也只是停留在数据库连接管理,减少建立数据库连接的消耗上,因为它们都是即写即用,以后得补补这块知识了。选Druid除了它的性能不比其他流行连接池差以外,它还带监控服务,很想玩玩哈哈哈,同样Druid也有springboot整合版本,叫
druid-spring-boot-starter
补充资料:Druid手册
首先pom里添加以下依赖
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.1
mysql
mysql-connector-java
com.alibaba
druid-spring-boot-starter
1.1.21
com.baomidou
mybatis-plus-boot-starter
3.3.1.tmp
接下来会发生一件很可怕的事,就是配置文件很长,而且以后可能会越来越长,所以可以尝试换成yml配置,springboot默认支持这种格式的配置文件,我项目暂时就不换先了,记得有yml就好
配置Mybatis 和 Druid
因为都用上了springboot版本的依赖,那么就只需要根据官方给的配置文档写入application.properties就好了。
下面是一份简单的配置:
打开了Druid监控和统计功能,监听8082端口,连接本地的数据库float,指定数据源
server.port=8082
# mybatis 配置,暂时用不到
#mybatis.config-location=classpath:mybatis-config.xml
# 设置数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/float
spring.datasource.username=root
spring.datasource.password=pw
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# druid 连接池补充
# 初始化大小,最小,最大
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
# 配置获取连接等待超时的时间
spring.datasource.druid.max-wait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙, log4j2用于输出sql日志
spring.datasource.druid.filters=stat,wall
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
#spring.datasource.useGlobalDataSourceStat=true
# WebStatFilter配置
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
spring.datasource.druid.web-stat-filter.session-stat-enable=false
spring.datasource.druid.web-stat-filter.session-stat-max-count=1000
spring.datasource.druid.web-stat-filter.principal-session-name=xxx.user
spring.datasource.druid.web-stat-filter.principal-cookie-name=xxx.user
spring.datasource.druid.web-stat-filter.profile-enable=true
#StatViewServlet配置
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=false
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
spring.datasource.druid.stat-view-servlet.deny=192.168.16.111
然后我们写几个基本的文件,再建个数据库表user(id,name,age)
-- 表设计
CREATE TABLE `user` (
`ID` varchar(32) NOT NULL COMMENT '用户id',
`NAME` varchar(255) NOT NULL COMMENT '昵称',
`AGE` int(11) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
-- 创建一条数据
INSERT INTO `user`(`ID`, `NAME`, `AGE`) VALUES ('1', '张三', 18);
写几个简单的业务文件,先看看写完后的项目结构
(不能忘记刚刚上面说的项目结构的问题):
用户实体UserEntitiy
package com.roy.demo.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
// 注解别忘了,不然会默认根据实体名以驼峰转下划线来转化
@TableName("user")
public class UserEntity implements Serializable {
// 注解别忘了
@TableId("id")
private String Id;
private String name;
private Integer age;
public String getId() {
return Id;
}
public void setId(String id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
UserMapper接口
package com.roy.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.roy.demo.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;
//如果没有在application.Java启动类中定义MapperScan扫描的话,就要写这个注解
//继承mybatis-plus的BaseMapper<实体>,基本的查询都不用再重写了!
@Mapper
public interface UserMapper extends BaseMapper {
}
简单的UserController
package com.roy.demo.controller;
import com.roy.demo.entity.UserEntity;
import com.roy.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
// 没什么好说的,很常规的Controller
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("getById")
public UserEntity getUserById(@RequestParam String id) {
UserEntity user = userMapper.selectById(id);
return user == null ? null : user;
}
}
SpringBoot 启动!
万事俱备就可以启动了,监听8082端口,我们在浏览器上访问
http://127.0.0.1:8082/user/getById?id=1
就可以获取到我们的user信息了。
Druid后台监控
Druid的后台配置已经在applicaiton配置里写了我们访问项目本地地址,然后后面加上/druid就可以访问了
http://127.0.0.1:8082/druid/
输入配置文件中的账号密码,然后就可以看到统计信息和SQL记录了
可以看到刚刚访问userController查询的用户SQL
最后
总体看来步骤还是很简单吧,其实中间也花了很多时间研究Druid,因为druid-springboot的文档还不是很全,也折磨了我几天了。
还有新的日志框架log4j2,启动完以后肯定不能少了关键日志输出,springboot默认使用common-loggin,嗯但是,好像真的不太好用,但是本篇就不讲日志先,留着下篇讲吧。
劳动节到了,休息休息,研究一下下个阶段的东西,
下一篇文章主要讲:日志框架log4j2 + Springboot后台Docker部署
希望早点有空写吧。节日快乐~