首页
归档
友链
关于
Search
1
网易云音乐黑胶会员月月免费赠送
2,849 阅读
2
十年之约RSS聚合订阅服务上线
2,476 阅读
3
工资发放日的区别
2,134 阅读
4
rsyslogd内存占用过高解决方案
2,120 阅读
5
Nginx反代MinIO后,上传文件签名异常
2,036 阅读
零碎
标本
码海
工具
其他
登录
Search
标签搜索
北京
摄影
Java
旅行
生活
学习笔记
教程
Linux
服务器
软件
SpringBoot
日记
Windows
服务
数据库
福利
Spring
系统
SQL
前端
萧瑟
累计撰写
189
篇文章
累计收到
1,259
条评论
首页
栏目
零碎
标本
码海
工具
其他
页面
归档
友链
关于
搜索到
8
篇与
Spring
的结果
2023-04-28
Java 使用JDBC备份数据库中的表和数据
实现思路加载数据库驱动程序并建立数据库连接。使用JDBC API查询需要备份的表格和数据。在输出文件中以适当的格式编写SQL语句来创建表格。用适当的格式编写INSERT语句将行数据写入输出文件。5. 关闭所有数据库连接和输出文件。实现代码package com.yanqingshan.admin.jdbc; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.io.FileWriter; import java.io.IOException; import java.sql.*; import java.util.ArrayList; import java.util.List; /** * 通过JDBC备份 库表数据 * * @author yanqs * @date 2023年04月28日 9:31 */ @Slf4j @SpringBootTest class BuildSql { @Test void testBuildSql() throws ClassNotFoundException, SQLException, IOException { String dbUrl = "jdbc:mysql://192.168.57.110:3306/boot-startup"; String username = "test"; String password = "123456"; // 加载JDBC驱动程序 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立数据库连接 Connection conn = DriverManager.getConnection(dbUrl, username, password); // 创建Statement对象 Statement stmt = conn.createStatement(); // 查询所有表格名字 ResultSet result = stmt.executeQuery("SHOW TABLES"); // 备份的SQL文件 FileWriter writer = new FileWriter("backup.sql"); // 循环遍历所有表 存表 List<String> tableNameList = new ArrayList<>(); while (result.next()) { tableNameList.add(result.getString(1)); } for (String tableName : tableNameList) { log.info("开始备份“{}”表结构", tableName); // 在输出文件中写入创建表格SQL语句 ResultSet rs = stmt.executeQuery("SHOW CREATE TABLE " + tableName); if (rs.next()) { writer.write("\n\n" + rs.getString(2) + ";\n\n"); } // 循环遍历表格中的所有行来写入数据 rs = stmt.executeQuery("SELECT * FROM " + tableName); int columnCount = rs.getMetaData().getColumnCount(); log.info("开始生成“{}”表数据", tableName); while (rs.next()) { writer.write("INSERT INTO " + tableName + " VALUES ("); for (int i = 1; i <= columnCount; i++) { writer.write("'" + rs.getString(i) + "'"); if (i < columnCount) { writer.write(","); } } writer.write(");\n"); } } // 关闭所有连接 writer.close(); result.close(); stmt.close(); conn.close(); log.info("备份完成"); } }实现效果
2023年04月28日
132 阅读
4 评论
2022-06-08
SpringCloud Nacos命名空间配置
今天研究公司自己的SpringCloud框架,发现好多配置都搞的环境变量,因为开发周期短,又不能给开发细说,所以需要内置写死,这样就方便大伙快速开发,但是一直有一个问题,服务注册到Nacos一直注册不到配置的命名空间,而是注册到默认的public空间下了。使用万能的度娘,查到的资料和配置文件,都是一样的内容,但还是注册不到自定义的命名空间下。后来请教了研发中心的大佬们,才解决这个问题。顺便做一个配置文件的小记录,分享给大家,希望也能解决各位的问题(本人小菜鸡,欢迎各位指导)。spring: application: name: @artifactId@ cloud: nacos: discovery: server-addr: ${NACOSENDPOINTS:nacos-address:8848} namespace: ${NACOS_NAMESPACE:${spring.profiles.active}} config: server-addr: ${spring.cloud.nacos.discovery.server-addr} file-extension: yml shared-configs: - application.${spring.cloud.nacos.config.file-extension} namespace: ${NACOS_NAMESPACE:${spring.profiles.active}}与度娘查到的资料唯一不同的是在discovery下增加一个namespace命名空间。
2022年06月08日
363 阅读
7 评论
2022-01-08
Java根据URL下载图片至客户端、服务器示例整合上传又拍云对象存储
Java根据URL下载图片至客户端、服务器示例整合又拍云上传
2022年01月08日
606 阅读
1 评论
2021-12-13
SpringBoot AOP日志切面
AOP切面AOP(Aspect-Oriented Programming,面向切面编程),它利用一种”横切”的技术,将那些多个类的共同行为封装到一个可重用的模块。便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。AOP相关概念Aspect(切面):声明类似于Java中的类声明,在Aspect中会包含一些Pointcut及相应的Advice。Joint point(连接点):表示在程序中明确定义的点。包括方法的调用、对类成员的访问等。Pointcut(切入点):表示一个组Joint point,如方法名、参数类型、返回类型等等。Advice(通知):Advice定义了在Pointcut里面定义的程序点具体要做的操作,它通过(before、around、after(return、throw)、finally来区别实在每个Joint point之前、之后还是执行 前后要调用的代码。Before:在执行方法前调用Advice,比如请求接口之前的登录验证。Around:在执行方法前后调用Advice,这是最常用的方法。After:在执行方法后调用Advice,after、return是方法正常返回后调用,after\throw是方法抛出异常后调用。Finally:方法调用后执行Advice,无论是否抛出异常还是正常返回。AOP proxy:AOP proxy也是Java对象,是由AOP框架创建,用来完成上述动作,AOP对象通常可以通过JDK dynamic proxy完成,或者使用CGLIb完成。Weaving:实现上述切面编程的代码织入,可以在编译时刻,也可以在运行时刻,Spring和其它大多数Java框架都是在运行时刻生成代理。代码示例POM引入<!-- SpringBoot Aop组件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!-- 分析客户端信息的工具类--> <dependency> <groupId>eu.bitwalker</groupId> <artifactId>UserAgentUtils</artifactId> <version>1.21</version> </dependency>切面:LogAspect代码/** * 添加aop日志打印 * * @author yanqs * @date 2020/1/13 14:42 */ @Aspect @Component @Slf4j public class LogAspect { /** * 进入方法时间戳 */ private Long startTime; /** * 方法结束时间戳(计时) */ private Long endTime; public LogAspect() { } /** * 定义请求日志切入点,其切入点表达式有多种匹配方式,这里是指定路径 */ @Pointcut("execution(public * com.springboot.logaop.controller.*.*(..))") public void logPointcut() { } /** * 前置通知: * 1. 在执行目标方法之前执行,比如请求接口之前的登录验证; * 2. 在前置通知中设置请求日志信息,如开始时间,请求参数,注解内容等 * * @param joinPoint * @throws Throwable */ @Before("logPointcut()") public void doBefore(JoinPoint joinPoint) { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //获取请求头中的User-Agent UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); //打印请求的内容 startTime = System.currentTimeMillis(); log.info("请求开始时间:{}", LocalDateTime.now()); log.info("请求Url : {}", request.getRequestURL().toString()); log.info("请求方式 : {}", request.getMethod()); log.info("请求ip : {}", request.getRemoteAddr()); log.info("请求方法 : ", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); log.info("请求参数 : {}", Arrays.toString(joinPoint.getArgs())); // 系统信息 log.info("浏览器:{}", userAgent.getBrowser().toString()); log.info("浏览器版本:{}", userAgent.getBrowserVersion()); log.info("操作系统: {}", userAgent.getOperatingSystem().toString()); } /** * 返回通知: * 1. 在目标方法正常结束之后执行 * 1. 在返回通知中补充请求日志信息,如返回时间,方法耗时,返回值,并且保存日志信息 * * @param ret * @throws Throwable */ @AfterReturning(returning = "ret", pointcut = "logPointcut()") public void doAfterReturning(Object ret) throws Throwable { endTime = System.currentTimeMillis(); log.info("请求结束时间:{}", LocalDateTime.now()); log.info("请求耗时:{}", (endTime - startTime)); // 处理完请求,返回内容 log.info("请求返回 : {}", ret); } /** * 异常通知: * 1. 在目标方法非正常结束,发生异常或者抛出异常时执行 * 1. 在异常通知中设置异常信息,并将其保存 * * @param throwable */ @AfterThrowing(value = "logPointcut()", throwing = "throwable") public void doAfterThrowing(Throwable throwable) { // 保存异常日志记录 log.error("发生异常时间:{}", LocalDateTime.now()); log.error("抛出异常:{}", throwable.getMessage()); } }@Before和@AfterReturning部分也可使用以下代码替代/** * 在执行方法前后调用Advice,这是最常用的方法,相当于@Before和@AfterReturning全部做的事儿 * * @param pjp * @return * @throws Throwable */ @Around("logPointcut()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //获取请求头中的User-Agent UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); //打印请求的内容 startTime = System.currentTimeMillis(); log.info("请求Url : {}", request.getRequestURL().toString()); log.info("请求方式 : {}", request.getMethod()); log.info("请求ip : {}", request.getRemoteAddr()); log.info("请求方法 : ", pjp.getSignature().getDeclaringTypeName(), ".", pjp.getSignature().getName()); log.info("请求参数 : {}", Arrays.toString(pjp.getArgs())); // 系统信息 log.info("浏览器:{}", userAgent.getBrowser().toString()); log.info("浏览器版本:{}", userAgent.getBrowserVersion()); log.info("操作系统: {}", userAgent.getOperatingSystem().toString()); // pjp.proceed():当我们执行完切面代码之后,还有继续处理业务相关的代码。proceed()方法会继续执行业务代码,并且其返回值,就是业务处理完成之后的返回值。 Object ret = pjp.proceed(); log.info("请求结束时间:" + LocalDateTime.now()); log.info("请求耗时:{}", (System.currentTimeMillis() - startTime)); // 处理完请求,返回内容 log.info("请求返回 : ", ret); return ret; }测试结果2021-12-13 15:58:16.219 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求开始时间:2021-12-13T15:58:16.219 2021-12-13 15:58:16.220 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求Url : http://localhost:8080/test/getGetId 2021-12-13 15:58:16.220 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求方式 : GET 2021-12-13 15:58:16.220 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求ip : 0:0:0:0:0:0:0:1 2021-12-13 15:58:16.221 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求方法 : 2021-12-13 15:58:16.221 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求参数 : [zhangsan] 2021-12-13 15:58:16.221 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 浏览器:CHROME9 2021-12-13 15:58:16.221 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 浏览器版本:96.0.4664.55 2021-12-13 15:58:16.221 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 操作系统: WINDOWS_10 2021-12-13 15:58:16.229 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求结束时间:2021-12-13T15:58:16.229 2021-12-13 15:58:16.229 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求耗时:14 2021-12-13 15:58:16.229 INFO 21528 --- [nio-8080-exec-1] c.s.logaop.config.aspect.LogAspect : 请求返回 : zhangsanDemoSpringBoot-AOP参考:springboot配置aop切面日志打印 - 森林木马 - 博客园 springboot + AOP 日志_请叫我猿叔叔的博客-CSDN博客_aop日志
2021年12月13日
847 阅读
1 评论
2021-11-01
Spring Boot 核心知识点总结
Spring Boot 核心功能独立运行Spring项目Spring boot 可以以jar包形式独立运行,运行一个Spring Boot项目只需要通过java -jar xx.jar来运行。内嵌servlet容器Spring Boot可以选择内嵌Tomcat、jetty或者Undertow,这样我们无须以war包形式部署项目。提供starter简化Maven配置spring提供了一系列的start pom来简化Maven的依赖加载,例如,当你使用了spring-boot-starter-web,会自动加入依赖包。自动装配SpringSpringBoot会根据在类路径中的jar包,类、为jar包里面的类自动配置Bean,这样会极大地减少我们要使用的配置。当然,SpringBoot只考虑大多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean,而SpringBoot灭有提供支持,则可以自定义自动配置。准生产的应用监控SpringBoot提供基于http ssh telnet对运行时的项目进行监控。无代码生产和xml配置SpringBoot不是借助与代码生成来实现的,而是通过条件注解来实现的,这是Spring4.x提供的新特性。Spring Boot 优缺点优点:快速构建项目。对主流开发框架的无配置集成。项目可独立运行,无须外部依赖Servlet容器。-提供运行时的应用监控。极大的提高了开发、部署效率。与云计算的天然集成。{dotted startColor="#ff6c6c" endColor="#1989fa"/}缺点:如果你不认同spring框架,也许这就是缺点。Spring Boot特性创建独立的Spring项目内置Tomcat和Jetty容器提供一个starter POMs来简化Maven配置提供了一系列大型项目中常见的非功能性特性,如安全、指标,健康检测、外部配置等完全没有代码生成和xml配置文件Spring Boot CLISpringBoot CLI 是SpringBoot提供的控制台命令工具。Spring Boot maven 构建项目spring-boot-starter-parent:是一个特殊Start,它用来提供相关的Maven依赖项,使用它之后,常用的包依赖可以省去version标签。Spring Boot几个常用的注解(1)@RestController和@Controller指定一个类,作为控制器的注解 ,并说明其区别(2)@RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉 (3)@EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器(4)@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类,完成元数据bean的初始化。(5)@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上 (6)@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。 (7)@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean(8)@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。spring boot是如何管理事务的?直接写@transactional注解就行,在方法就是方法事务,类上就是类事务。
2021年11月01日
446 阅读
1 评论
2021-10-06
十年之约RSS聚合订阅服务上线
基于SpringBoot搭建的十年之约RSS聚合订阅服务正式上线,更多功能不定时更新。
2021年10月06日
2,476 阅读
49 评论
2021-05-23
SpringBoot yml配置文件注入List和Map
SpringBoot 在yml配置文件注入List和Map,可动态修改,方便快速。
2021年05月23日
628 阅读
0 评论
2021-05-21
Java Spring @autowired和@resource注解的区别
区别1、@Autowired注解由Spring提供,只按照byType注入;@resource注解由J2EE提供,默认按照byName自动注入。2、@Autowired默认按类型进行装配,@Resource默认按照名称进行装配。Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解。如:@Resource、@PostConstruct及@PreDestroy@Autowired由Spring提供,只按照byType注入@Resource由J2EE提供,默认按照byName自动注入@Resource有两个重要的属性:name和typeSpring将@Resource注解的name属性解析为bean的名字,type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。@Resource装配顺序:(1)如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常(2)如果指定了name,则从Spring上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常(3)如果指定了type,则从Spring上下文中找到类型匹配的唯一bean进行装配,找不到或找到多个,都抛出异常(4)如果既没指定name,也没指定type,则自动按照byName方式进行装配。如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入。使用区别(1)@Autowired与@Resource都可以用来装配bean,都可以写在字段或setter方法上(2)@Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用。(3)@Resource,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。推荐使用@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与Spring的耦合。
2021年05月21日
206 阅读
0 评论