本科毕业刚刚入职的第一个任务,就是统计一段时间内的数据并输出至文件。其实输出至文件并不是一个最优解,提供接口让负责统计的大数据方面去调用应该是更好的方法,也是更适合springboot的方法。但是公司每日都会有人处理Nginx日志并发送给大数据方面,所以按照Nginx的日志格式输出至文件进行统一处理显然是个省时省力的好办法。顺口说一句,大部分的公司安全完全依靠网络屏障,内部的安全措施是很不完善的,前段时间的数据泄露就是这个原因。下面开始正题,如有什么错误和问题欢迎大家留言,同时希望本篇文章对大家能有所帮助。
本文参考的部分文章:
https://blog.csdn.net/twelve_wang/article/details/79062634
https://www.cnblogs.com/bigben0123/p/7895696.html
http://www.importnew.com/25985.html
#准备阶段
首先新建一个maven项目,做成如图所示的结构
然后修改pom.xml,这里添加了热部署,log4j输出日志功能。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springboot</groupId>
<artifactId>demo</artifactId>
<version>2.0.0.BUILD-SNAPSHOT</version>
<!-- <version>0.0.1-SNAPSHOT</version> -->
<parent >
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-starter-parent </artifactId>
<version> 1.3.0.RELEASE </version>
</parent >
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.7</java.version>
</properties>
<!-- 添加 web 应用的依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.12</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency> -->
</dependencies>
<!-- 把项目打成jar包运行 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
然后我们就要配置application.properties,大家也可以使用application.yml来配置,这里添加了关于日志输出的配置。spring.datasource.url=jdbc:oracle:thin:@ip地址:sid spring.datasource.username=用户名 spring.datasource.password=用户密码 spring.datasource.driverClassName=oracle.jdbc.OracleDriver spring.jpa.database=oracle mybatis.type-aliases-package=com.domain mybatis.mapper-locations=classpath*:mapper/*Mapper.xml logging.level.root=INFO logging.level.org.springframework.web=INFO logging.file=日志文件的具体位置 logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n logging.pattern.file=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
oracle数据库和mysql数据库配置的最大区别就是url了,oracle数据库的url稍微有一些繁琐,初学者很容易出错。不过现在使用oracle的越来越少了,我们公司也在做去O,后面我会再补充一篇Mysql的博客。还有一点,就是"mybatis.mapper-locations=classpath*:mapper/Mapper.xml"这一条语句,是一个大坑。在我参考的一篇博客里这一句是这样的:"mybatis.mapper-locations=classpath:mapper/.xml"。在我看来这两句话是没区别的,".xml"难道不包括"*Mapper.xml"么?当我们只有一个mapper文件的时候二者是等同的,但是当我们想多加几个mapper时(比如我们想同时在这个程序里分别查询多个表的数据)问题就来了,程序会抛出异常,这个异常很好理解,我们传入controller的一个List为空,我当时在这里就卡住了很久。我怀疑配置文件出了问题,但是我确实看不出来是这里的问题,直到我在网上看到的另一个demo里配置文件写的是"*Mapper.xml"。结果是让我很震惊的,确实是这里出现的问题。
#正式开发
接下来就要开始正式开发了,我虽然新建了一个web项目,但是我没有指定接口,我只是在程序初期用浏览器去看程序的报错。大家有兴趣的话可以在本文程序的基础是上写几个接口来传输数据。
首先来写Data类,我们从数据库获取的数据就是Data类型,包含三个数据的get和set方法。如果我们要做接口的话,就可以把这个类的某个对象传入接口,springboot会帮我们把它格式化为json格式。
package com.domain;
public class Data {
private String a;
private String b;
private String c;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
}
然后肯定要配置UserMapper文件了。
`<?xml version="1.0" encoding="UTF-8"?>
配置好就可以去写QueryMapper接口了。
package com.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import com.domain.Data;
@Mapper
@Repository
public interface QueryMapper {
List<Data> getData(String date);
}
controller的代码
package com.controller;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RestController;
import com.dao.QueryMapper;
import com.domain.Data;
@RestController
public class QueryController {
private final Logger logger = Logger.getLogger(QueryController.class);
// 依赖注入
@Autowired
private QueryMapper queryMapper;
@Scheduled(cron = "0 0/1 * * * *") //定时任务,1分钟1次
public void Data() throws IOException {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String date = df.format(new Date());
logger.info("开始打印"+date+"数据");
List<Data> list = queryMapper.getData(date);
if(list.equals(null)){
logger.error("获取Data为空");
}
else{
logger.info("获取Data成功");
}
int a = 0;
int b = 0;
int c = 0;
int d = 0;
for(int i=0;i<list.size();i++){
a = Integer.parseInt((list.get(i)).getA());
b = b + Integer.parseInt((list.get(i)).getB()) * a;
c = c + Integer.parseInt((list.get(i)).getC()) * a;
d = d + a;
}
logger.info(a+"-"+b+"-"+c+"-"+d);
//输出至文件
String[] result = new String[4];
result[0] = "a:"+a;
result[1] = "b:"+b;
result[2] = "c:"+c;
result[3] = "d:"+d;
File f = new File("D:/Demo."+date+".txt");
FileWriter out = new FileWriter(f);
for(int i=0;i<4;i++){
out.write(result[i] + "\r\n");
}
out.close();
logger.info(date + "数据打印结束");
}
}
application的代码
package com;
import java.io.FileNotFoundException;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication
@EnableTransactionManagement// 启动
@EnableScheduling//定时任务
@ConfigurationProperties(prefix="spring.datasource")
@MapperScan("com.dao")
public class Application {
public static void main(String[] args) throws FileNotFoundException {
SpringApplication.run(Application.class, args);
}
}
debug一下看看有没有抛出异常,没有就可以run as java application了。结果如下: