目录
在tomcat中的bin文件夹中用cmd窗口运行startup.bat或者直接点击
数据库:PostgreSQL
在idea用maven建立servlet项目
链接:快速搭建一个servlet项目_阿 吹的博客-CSDN博客
读取sql文件连接pg数据库并执行
获取文件路径
在本地运行的时候可以直接用文件(File)方式读取:
File file = new File("src/main/resources/sys_oper_log.sql");
InputStream in = new FileInputStream(file);
当工程部署到tomcat之后上述方式就不可行了,Java工程打包部署到Tomcat中时,properties的路径变到顶层(classes下),这是由Maven工程结构决定的。由Maven构建的web工程,主代码放在src/main/java路径下,资源放在src/main/resources路径下,当构建jar包 或 war包时,JVM虚拟机会自动编译java文件为class文件存放在 target/classes目录下,resource资源下的文件会原封不动的拷贝一份到 target/classes 目录下。所以采用 ClassLoader 对象去加载资源文件:
URL resource = PostgreSQLJDBC.class.getClassLoader().getResource("sys_oper_log.sql");
String path = resource.getPath(); //文件所在位置
读取sql文件
因为要从前端点击读取数据,所以设置成UTF-8(不然会存在乱码)
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path),"UTF-8")); //前端点击读取时可能乱码,设置成UTF-8
切割出sql语句
//将sql语句切割出来
protected static ArrayList<String> SplitSql(String txtsql){
ArrayList<String> ans = new ArrayList<>();
// Windows 下换行是 \r\n, Linux 下是 \n
String[] sqlArr = txtsql.split("(;\\s*\\r\\n)|(;\\s*\\n)");
for (int i = 0; i < sqlArr.length; i++) {
String sql = sqlArr[i].replaceAll("--.*", "").trim();
if (!sql.equals("")) {
ans.add(sql);
}
}
return ans;
}
连接数据库并执行sql语句
在pom.xml中添加相关依赖
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>8.2-504.jdbc3</version>
</dependency>
连接操作代码
// 建立连接
Class.forName("org.postgresql.Driver");
connection = DriverManager.getConnection("jdbc:postgresql://192.168.1.246:5432/ruoyipg","postgres", "******");
connection.setAutoCommit(false);
System.out.println("Opened database successfully");
state = connection.createStatement();
String txtsql = ReadSql(path);
ArrayList<String> sqlList = SplitSql(txtsql);
//将sql语句执行
for(String sql : sqlList){
state.executeUpdate(sql);
}
state.close();
connection.commit();
connection.close();
用计时器做定时更新
在对数据库操作的类中添加run函数
//run方法就是具体需要定时执行的任务
@Override
public void run() {
try {
LinkSql();
} catch (IOException e) {
e.printStackTrace();
}
}
用监听器监听tomcat服务开启并开始定时更新操作
需要注意的是设置的时间在执行时间之前的话,定时器会立马执行一次操作,并且会从执行的时间开始进行计时(比如我设置的开始时间是2022.02.16 05:00:00,间隔是24小时 但是我2022.02.16 08:00:00才运行程序,那么计时器会立即执行一次PostgreSQLJDBC类中的run函数,并且从2022.02.16 08:00:00开始计时,即下次执行时间为2022.02.17 08:00:00)。
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.*;
public class TimerDemo implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce){
//开启定时插入数据
Timer timer = new Timer();
timer.schedule(new PostgreSQLJDBC(),new Date("February 16,2022 05:00:00"),86400000L);
}
public void contextDestroyed(ServletContextEvent sce){
//关闭时操作
}
}
--------------------------------------------------------------------------------------------------------------------------------
由于项目有时候需要重启,将时间修改成当前时间第二天的五点
public void contextInitialized(ServletContextEvent sce){
//开启定时插入数据
Timer timer = new Timer();
Calendar c = Calendar.getInstance();
Date now = c.getTime();
int year = now.getYear();
int month = now.getMonth();
int date = now.getDate();
int hour = 5;
int minute = 0;
int second = 0;
c.setTime(new Date(year,month,date,hour,minute,second));
c.add(Calendar.DAY_OF_MONTH,1);
System.out.println("Start time :" + c.getTime());
timer.schedule(new PostgreSQLJDBC(),c.getTime(),86400000L);
}
在web.xml中添加监听器
<listener>
<listener-class>com.kxyt.PostgreSQL.TimerDemo</listener-class>
</listener>
前端点击响应
前端使用ajax发送get请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>存储数据</h1>
<input type = "button" value = "发送get_ajax请求" id='btnAjax'>
<script type="text/javascript">
// 绑定点击事件
document.querySelector('#btnAjax').onclick = function () {
// 发送ajax 请求 需要 五步
// (1)创建异步对象
var ajaxObj = new XMLHttpRequest();
// (2)设置请求的参数 包括:请求的方法、请求的url
ajaxObj.open('get',"myServlet");
// (3)发送请求
ajaxObj.send();
}
</script>
</body>
</html>
后端响应前端的get请求
在doGet函数中调用对数据库操作函数
import com.kxyt.PostgreSQL.PostgreSQLJDBC;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "MyServlet",urlPatterns = {"/myServlet"})
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("1111");
PostgreSQLJDBC.LinkSql();
}
}
打包成war包部署到tomcat
右边maven项目点击package打包项目(已经存在打包项目的先点击clean)
生成的war包在target文件夹中