● 需求:演示 Spring Boot 如何通过 jdbc+HikariDataSource 完成对 Mysql 操作 说明: HikariDataSource : 目前市面上非常优秀的数据源, 是 springboot2 默认数据源
-- 创建 spring_boot
DROP DATABASE IF EXISTS spring_boot; CREATE DATABASE spring_boot;
USE spring_boot;
-- 创建家居表
CREATE TABLE furn( `id` INT(11) PRIMARY KEY AUTO_INCREMENT, ## id
`name` VARCHAR(64) NOT NULL, ## 家居名
`maker` VARCHAR(64) NOT NULL, ## 厂商
`price` DECIMAL(11,2) NOT NULL, ## 价格
`sales` INT(11) NOT NULL, ## 销量
`stock` INT(11) NOT NULL, ## 库存
`img_path` VARCHAR(256) NOT NULL ## 照片路径
);
-- 初始化家居数据
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 北 欧 风 格 小 桌 子 ' , ' 熊 猫 家 居 ' , 180 , 666 , 7 , 'assets/images/product-image/1.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 简 约 风 格 小 椅 子 ' , ' 熊 猫 家 居 ' , 180 , 666 , 7 , 'assets/images/product-image/2.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 典 雅 风 格 小 台 灯 ' , ' 蚂 蚁 家 居 ' , 180 , 666 , 7 , 'assets/images/product-image/3.jpg');
INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 温 馨 风 格 盆 景 架 ' , ' 蚂 蚁 家 居 ' , 180 , 666 , 7 , 'assets/images/product-image/4.jpg'); SELECT * FROM furn;


<!--进行数据库开发,引入data-jdbc starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!--引入mysql的驱动
1. 说明这里没有使用版本仲裁 <mysql.version>8.0.26</mysql.version>
2. 指定的版本是5.1.49
-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
spring:
datasource:
#说明:如果没有指定useSSL=true,启动项目可能会爆红警告,环境问题
url: jdbc:mysql://127.0.0.1:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
5.创建src\main\java\com\llp\springboot\bean\Furn.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Furn {
private Integer id;
private String name;
private String maker;
private BigDecimal price;
private Integer sales;
private Integer stock;
private String imgPath = "assets/images/product-image/1.jpg";
}
1.创建src\test\java\com\llp\springboot\ApplicationTests.java 测试类
/**
* 如何在springboot中开发测试类,需要引入如下的依赖
* <dependency>
* <groupId>org.springframework.boot</groupId>
* <artifactId>spring-boot-starter-test</artifactId>
* </dependency>
*/
@SpringBootTest
public class ApplicationTests {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void contextLoads() {
BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper(Furn.class);
List<Furn> furns = jdbcTemplate.query("select * from furn", rowMapper);
for (Furn furn : furns) {
System.out.println(furn);
}
System.out.println(jdbcTemplate.getDataSource().getClass());
}
}
可以看到springBoot默认使用的是HikariDataSource 数据源

https://github.com/alibaba/druid

https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
HiKariCP: 目前市面上非常优秀的数据源, 是 springboot2 默认数据源
Druid: 性能优秀,Druid 提供性能卓越的连接池功能外【Java 基础】,还集成了 SQL 监 控,黑名单拦截等功能,强大的监控特性,通过 Druid 提供的监控功能,可以清楚知道连 接池和 SQL 的工作情况,所以根据项目需要,我们也要掌握 Druid 和 SpringBoot 整合
整合 Druid 到 Spring-Boot 方式
● 自定义方式
● 引入 starter 方式
<!--引入德鲁伊依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
2.创建src\main\java\com\llp\springboot\config\DruidDataSourceConfig.java 配置类
@Configuration
public class DruidDataSourceConfig {
//编写方法,注入DruidDataSource
//为什么我们注入自己的DataSource , 默认的HiKariDatasource失效?
//1. 默认的数据源是如配置? @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
// 解读通过@ConditionalOnMissingBean({ DataSource.class}) 判断如果容器有DataSource Bean 就不注入默认的HiKariDatasource
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() {
//1. 配置了 @ConfigurationProperties("spring.datasource")
// 就可以读取到application.yml的配置,注意:我们需要将bean注入到spring ioc容器中、bean中提供get\set方法
//2. 我们就不需要调用DruidDataSource 对象的setXxx, 会自动关联
DruidDataSource druidDataSource = new DruidDataSource();
//druidDataSource.setUrl();
//druidDataSource.setUsername();
//druidDataSource.setPassword();
return druidDataSource;
}
}

在配置监控功能之前,我们先来看看如何配置 Druid 的监控页面
<!-- 配置 Druid 监控信息显示页面 -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>druid</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>druid</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>

1.在springBoot项目中,我们需要将StatViewServlet注入到容器中并配置登录的用户名和密码等信息
/**
* <!-- 配置 Druid 监控信息显示页面 -->
* <servlet>
* <servlet-name>DruidStatView</servlet-name>
* <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
* <init-param>
* <!-- 允许清空统计数据 -->
* <param-name>resetEnable</param-name>
* <param-value>true</param-value>
* </init-param>
* <init-param>
* <!-- 用户名 -->
* <param-name>loginUsername</param-name>
* <param-value>druid</param-value>
* </init-param>
* <init-param>
* <!-- 密码 -->
* <param-name>loginPassword</param-name>
* <param-value>druid</param-value>
* </init-param>
* </servlet>
* <servlet-mapping>
* <servlet-name>DruidStatView</servlet-name>
* <url-pattern>/druid/*</url-pattern>
* </servlet-mapping>
* @return
*/
@Bean
public ServletRegistrationBean registrationBean(){
StatViewServlet statViewServlet = new StatViewServlet();
//配置监控页面的访问路径
ServletRegistrationBean registrationBean = new ServletRegistrationBean(statViewServlet, "/druid/*");
//配置登录用户名和密码,结合上面这段 init-param即配置servlet的初始化参数,key和其保持一致,value值我们可以自行定义
registrationBean.addInitParameter("loginUsername","llp");
registrationBean.addInitParameter("loginPassword","123");
return registrationBean;
}
2.启动完成测试http://localhost:8080/druid/login.html,我这里配置了拦截器匹配规则是/**,但是访问druid的监控是走的servlet不会走拦截器,因此可以直接访问



https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

1.那么如何在springboot项目中配置druid的sql监控功能呢,从上面可以看到我们需要在注入druidDataSource数据源对象的地方添加一个属性 druidDataSource.setFilters("stat");
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
//1. 配置了 @ConfigurationProperties("spring.datasource")
// 就可以读取到application.yml的配置,注意:我们需要将bean注入到spring ioc容器中、bean中提供get\set方法
//2. 我们就不需要调用DruidDataSource 对象的setXxx, 会自动关联
DruidDataSource druidDataSource = new DruidDataSource();
//配置sql监控
druidDataSource.setFilters("stat");
return druidDataSource;
}
2.模拟操作 DB 的请求
@Controller
@RequiredArgsConstructor
public class DruidSqlController {
private final JdbcTemplate jdbcTemplate;
@ResponseBody
@GetMapping("/sql")
public List<Furn> getFurnList(){
BeanPropertyRowMapper<Furn> furnBeanPropertyRowMapper = new BeanPropertyRowMapper<>(Furn.class);
List<Furn> furnList = jdbcTemplate.query("select * from furn", furnBeanPropertyRowMapper);
System.out.println(furnList);
return furnList;
}
}
3.我们来看下sql监控的效果


https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter


1.修改src\main\java\com\llp\springboot\config\DruidDataSourceConfig.java
/**
* 配置druid的web应用和url监控功能
* <filter>
* <filter-name>DruidWebStatFilter</filter-name>
* <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
* <init-param>
* <param-name>exclusions</param-name>
* <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
* </init-param>
* </filter>
* <filter-mapping>
* <filter-name>DruidWebStatFilter</filter-name>
* <url-pattern>/*</url-pattern>
* </filter-mapping>
*/
@Bean
public FilterRegistrationBean webStatFilter(){
WebStatFilter webStatFilter = new WebStatFilter();
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(webStatFilter);
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
return filterRegistrationBean;
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
/**
* 1.拦截器会先拦截controller的路径映射
* 2.如果找不到则去静态资源下查找
* 3.这里配置/**会拦截所有的请求,包括静态资源
* 4.这里不拦截静态资源,为什么直接写成 "/images/**","/css/**" ?
* 5.在SpringBoot中引入了spring-boot-starter-web 依赖,每个starter都会对于的自动装配
* 6.在WebProperties中配置了类路径映射,因此可以直接省略/static/
* private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
* "classpath:/resources/", "classpath:/static/", "classpath:/public/" };
*
*/
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/","/login","/upload.html","/upload","/images/**","/css/**","/sql");
}
}
3.重启项目,看看 Web 应用和 URI 监控页面


https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter

1.修改src\main\java\com\llp\springboot\config\DruidDataSourceConfig.java
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
//1. 配置了 @ConfigurationProperties("spring.datasource")
// 就可以读取到application.yml的配置,注意:我们需要将bean注入到spring ioc容器中、bean中提供get\set方法
//2. 我们就不需要调用DruidDataSource 对象的setXxx, 会自动关联
DruidDataSource druidDataSource = new DruidDataSource();
//stat:配置sql监控, wall:配置druid sql防火墙
druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
2.完成测试,重启项目,看看 SQL 防火墙监控是否生效

注意:Durid 的Session 监控的是用户的系统不是druid的后台系统
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98




@ConfigurationProperties("spring.datasource.druid")


3.这样我们之前配置的druid就失效了
<!--引入druid starter-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>



spring:
datasource:
#说明:如果没有指定useSSL=true,启动项目可能会爆红警告,环境问题
url: jdbc:mysql://127.0.0.1:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
druid:
#配置druid和监控功能
stat-view-servlet:
enabled: true
login-username: llp
login-password: 123
reset-enable: false
#配置web监控
web-stat-filter:
enabled: true
#配置路径,如果没有设置默认为/*
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
filter:
#配置sql监控
stat:
#1000毫秒及以上就是满慢sql
slow-sql-millis: 1000
#启用慢查询log日志
log-slow-sql: true
enabled: true
#配置sql防火墙
wall:
#启用
enabled: true
config:
#不允许删除表的sql操作
drop-table-allow: false
#不孕执行select *的sql执行
select-all-column-allow: false


7.删除德鲁伊广告配置,新增配置类如下
/**
* 去除druid底部的广告配置类
*/
@Configuration
@ConditionalOnWebApplication
@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true", matchIfMissing = true)
public class RemoveDruidOtherConfig {
/**
* 方法描述: 除去页面底部的广告
*/
@Bean
public FilterRegistrationBean removeDruidAdFilterBean(DruidStatProperties properties) {
final String filePath = "support/http/resources/js/common.js";
// 获取web监控页面的参数
DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
// 提取common.js的配置路径
String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
String jsPattern = pattern.replaceAll("\\*", "js/common.js");
//创建filter进行过滤
Filter filter = new Filter() {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse rep, FilterChain chain) throws IOException, ServletException {
chain.doFilter(req, rep);
// 重置缓冲区,响应头不会被重置
rep.resetBuffer();
// 获取common.js
String text = Utils.readFromResource(filePath);
// 正则替换, 除去底部的广告信息
text = text.replaceAll("<a.*?banner\"></a><br/>", "");
text = text.replaceAll("powered.*?shrek.wang</a>", "");
rep.getWriter().write(text);
}
@Override
public void destroy() {
}
};
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns(jsPattern);
return registrationBean;
}
}
如果您希望在Spring中启用定时任务功能,则需要在主类上添加 @EnableScheduling 注解。这样Spring才会扫描 @Scheduled 注解并执行定时任务。在大多数情况下,只需要在主类上添加 @EnableScheduling 注解即可,不需要在Service层或其他类中再次添加。以下是一个示例,演示如何在SpringBoot中启用定时任务功能:@SpringBootApplication@EnableSchedulingpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.ru
软件特点部署后能通过浏览器查看线上日志。支持Linux、Windows服务器。采用随机读取的方式,支持大文件的读取。支持实时打印新增的日志(类终端)。支持日志搜索。使用手册基本页面配置路径配置日志所在的目录,配置后按回车键生效,下拉框选择日志名称。选择日志后点击生效,即可加载日志。windows路径E:\java\project\log-view\logslinux路径/usr/local/XX历史模式历史模式下,不会读取新增的日志。针对历史文件可以分页读取,配置分页大小、跳转。历史模式下,支持根据关键词搜索。目前搜索引擎使用的是jdk自带类库,搜索速度相对较低,优点是比较简单。2G日志全文搜
1.依赖导入org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-validation2.validation常用注解@Null被注释的元素必须为null@NotNull被注释的元素不能为null,可以为空字符串@AssertTrue被注释的元素必须为true@AssertFalse被注释的元素必须为false@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值@D
我正在尝试找到一种更好的方法将IRB与我的常规ruby开发集成。目前我很少在我的代码中使用IRB。我只用它来验证语法或尝试一些小的东西。我知道我可以将我自己的代码加载到ruby中作为一个require'mycode'但这通常不符合我的编程风格。有时我要检查的变量超出范围或在循环内。有没有一种简单的方法可以启动我的脚本并在IRB内的某个点卡住?我想我正在寻找一种更简单的方法来调试我的ruby代码而不破坏我的F5(编译)键。也许有经验的ruby开发者可以和我分享一个更精简的开发方法。 最佳答案 安装ruby-debugg
我开始了一个小型网络项目并使用Drupal来构建它。到目前为止,还不错:您可以快速建立一个不错的面向CMS的网站,通过模块添加社交功能,并且您有一个广泛的API可以在一个架构良好的平台中进行自定义。现在问题来了:网站的增长超出了最初的计划,我发现自己正处于认真开始为它编写代码的境地。由于Drupal项目,我对PHP有了新的认识,但我想用Ruby来做。我会感觉更舒服,以后维护起来更容易,我可以在其他Ruby/Rails应用程序中重用它。随着时间的推移,我想我会用Ruby重写Drupal中的现有部分。基于此,问题是:是否有人将两者(成功或失败的故事)结合起来?这是一个相当大的决定,但我在G
Iparking停车收费管理系统-可商用介绍Iparking是一款基于springBoot的停车收费管理系统,支持封闭车场和路边车场,支持微信支付宝多种支付渠道,支持多种硬件,涵盖了停车场管理系统的所有基础功能。技术栈Springboot,MybatisPlus,Beetl,Mysql,Redis,RabbitMQ,UniApp功能云端功能序号模块功能描述1系统管理菜单管理配置系统菜单2系统管理组织管理管理组织机构3系统管理角色管理配置系统角色,包含数据权限和功能权限配置4系统管理用户管理管理后台用户5系统管理租户管理多租户管理6系统管理公众号配置租户公众号配置7系统管理操作日志审计日志8系统
一、Elasticsearch简介实际业务场景中,多端的查询功能都有很大的优化空间。常见的处理方式有:建索引、建物化视图简化查询逻辑、DB层之上建立缓存、分页…然而随着业务数据量的不断增多,总有那么一张表或一个业务,是无法通过常规的处理方式来缩短查询时间的。在查询功能优化上,作为开发人员应该站在公司的角度,本着优化客户体验的目的去寻找解决方案。本人有幸做过Tomcat整合solr,今天一起研究一下当前比较火热的Elasticsearch搜索引擎。Elasticsearch是一个非常强大的搜索引擎。它目前被广泛地使用于各个IT公司。Elasticsearch是由Elastic公司创建。它的代码位
场景在SpringBoot项目中需要对接三方系统,对接协议是TCP,需实现一个TCP客户端接收服务端发送的数据并按照16进制进行解析数据,然后对数据进行过滤,将指定类型的数据通过mybatis存储进mysql数据库中。并且当tcp服务端断连时,tcp客户端能定时检测并发起重连。全流程效果 注:博客:霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主实现1、SpringBoot+Netty实现TCP客户端本篇参考如下博客,在如下博客基础上进行修改Springboot+Netty搭建基于TCP协议的客户端(二):https://www.cnblogs.com/haolb
一、SpringBoot是什么SpringBoot是依赖于Spring的,比起Spring,除了拥有Spring的全部功能以外,SpringBoot无需繁琐的Xml配置,这取决于它自身强大的自动装配功能;并且自身已嵌入Tomcat、Jetty等web容器,集成了SpringMvc,使得SpringBoot可以直接运行,不需要额外的容器,提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等,其实Spring大家都知道,Boot是启动的意思。所以,SpringBoot其实就是一个启动Spring项目的一个工具而已,总而言之,SpringBoot是一个服务于框架的
一、引入依赖:dependency>groupId>org.springframework.bootgroupId>artifactId>spring-boot-starter-websocketartifactId>2.7.1-->dependency>二、准备工具类:/***@authorWeiDaPang*/@ConfigurationpublicclassScheduledConfiguration{@BeanpublicTaskSchedulertaskScheduler(){ThreadPoolTaskSchedulertaskScheduler=newThreadPoolTask