上班打卡--- 通过批处理命令执行jar文件来记录上班时间
如果 一个程序员要记录自己上班工作时间的话 ,还需要靠手动去记录, 那就有点 不够范了, 程序员自然要有自己的极客范儿 , 下面就跟我一起来(zhuangbi);
先列一下整体的步骤:
1: 先做一个jar文件, 通过执行这个jar文件可以将上下班时间 写入数据库中;
2: 再写一个批处理脚本,能通过批处理命令来执行这个jar文件;
3: 将批处理文件做开机启动执行处理;
1: 先写一个可执行jar:
原理: 通过jdbc操作数据库,
那就上代码吧:
项目目录结构:
pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<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.etoak</groupId>
<artifactId>daka</artifactId>
<version>1.0-SNAPSHOT</version> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
</properties> <dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
<dependencies>
<!-- 解决sun base64编译报错 -->
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-compiler-javac</artifactId>
<version>1.8.1</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!--主类入口的路径-->
<mainClass>com.etoak.Daka</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
PropertiesUtil 类 :
package com.etoak.util; import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties; public class PropertiesUtil { /**
* 根据属性文件路径获取所有的属性键值对
* @param propertiesFilePath
* @return
* @throws IOException
*/
public static Properties getProperties(String propertiesFilePath) throws IOException {
Properties props = new Properties();
InputStream in = null;
try {
//第一种,通过类加载器进行获取properties文件流
in = PropertiesUtil.class.getClassLoader().getResourceAsStream(propertiesFilePath);
//第二种,通过类进行获取properties文件流
//in = PropertiesFileUtil.class.getResourceAsStream("/"+propertiesFilePath);
props.load(new InputStreamReader(in, "utf-8"));
} finally {
if (null != in) {
in.close();
}
}
return props;
} /**
* 根据属性文件路径和属性的键获取属性的值
* @param propertiesFilePath
* @param key
* @return
* @throws IOException
*/
public static String getProperty(String propertiesFilePath, String key) throws IOException {
Properties props = getProperties(propertiesFilePath);
return props.getProperty(key);
} /**
* 写Properties文件
*/
public static void writePropertiesFile(Map<String,String> propsMap , String outputPropertiesFilePath) throws Exception { if(propsMap.isEmpty() || propsMap.containsKey("") ){
throw new Exception("传入的键值对不能为空且键值对的主键不能包含空!");
} if( !outputPropertiesFilePath.endsWith(".properties")){
throw new Exception("输出文件路径需要以.properties为结尾!");
} //文件路径的文件夹不存在则创建
String fileSeparator = File.separator;
String dirPath = outputPropertiesFilePath.substring(0,outputPropertiesFilePath.lastIndexOf(fileSeparator)) ;
if( !new File(dirPath).exists()){
new File(dirPath).mkdirs();
} Properties prop = new Properties() ;
Iterator<Map.Entry<String, String>> it = propsMap.entrySet().iterator();
while(it.hasNext()){
Map.Entry<String, String> entry = it.next();
prop.setProperty( entry.getKey(),entry.getValue());
} FileOutputStream oFile = null ;
try {
//保存属性到b.properties文件
oFile = new FileOutputStream(outputPropertiesFilePath, false);//true表示追加打开,false每次都是清空再重写
//prop.store(oFile, "此参数是保存生成properties文件中第一行的注释说明文字");//这个会两个地方乱码
//prop.store(new OutputStreamWriter(oFile, "utf-8"), "汉字乱码");//这个就是生成的properties文件中第一行的注释文字乱码
prop.store(new OutputStreamWriter(oFile, "utf-8"), null);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (oFile != null ) {
oFile.close();
}
}
} public static void main(String[] args) throws Exception {
String propertiesFilePath = "properties/userinfo.properties";
Properties props = getProperties(propertiesFilePath);
Iterator<String> it = props.stringPropertyNames().iterator();
Map<String,String> propsMap = new HashMap<String,String>();
while (it.hasNext()) {
String key = it.next();
String value = props.getProperty(key) ;
System.out.println(key + ":" + value);
propsMap.put(key,value);
}
writePropertiesFile(propsMap,"C:\\Users\\Administrator\\Desktop\\properties\\userinfo2.properties"); }
}
ConnectionUtil 类:
package com.etoak.util; import java.io.IOException;
import java.sql.*;
import java.util.Properties; public class ConnectionUtil { //获得链接
public static Connection getConn(String propertiesFilePath) throws ClassNotFoundException, SQLException, IOException {
Properties props = PropertiesUtil.getProperties(propertiesFilePath);
Class.forName(props.getProperty("driver"));
return DriverManager.getConnection(props.getProperty("url"), props.getProperty("user"), props.getProperty("password"));
} //释放链接
public static void release(Connection conn, Statement st, PreparedStatement pst, ResultSet rs) throws SQLException {
if (rs != null) {
try {
rs.close();
} finally {
try {
if (st != null) {
st.close();
} else if (pst != null) {
pst.close();
}
} finally {
if (conn != null) {
conn.close();
}
}
}
}
}
}
Daka类:
package com.etoak; import com.etoak.util.ConnectionUtil;
import com.etoak.util.PropertiesUtil; import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar; public class Daka { public static void daka(String jdbcPropertiesFilePath, String userinfoPropertiesFilePath) throws SQLException, ClassNotFoundException, IOException { //用户名
String name = PropertiesUtil.getProperty(userinfoPropertiesFilePath, "username");
String[] xqArr = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
Calendar calendar = Calendar.getInstance();//可以对每个时间域单独修改
int day = calendar.get(Calendar.DAY_OF_WEEK) - 1;
String xq = xqArr[day];
String flag = "0";
int hour = calendar.get(Calendar.HOUR_OF_DAY); if (day == 0 || day == 6) {
flag = "3"; //周末加班
} else {
if (hour <= 19) {
flag = "1"; // 平时正常点上下班
} else {
flag = "2"; // 平时加班
}
} /* 持久化到数据库中*/
Connection conn = ConnectionUtil.getConn(jdbcPropertiesFilePath);
String insertSql = "insert into WORKTIMERECODE (recordId , name , rq , xq , flag , workstartTime , workendTime ) select " +
" sys_guid() , '" + name + "' , trunc(sysdate,'dd') , '" + xq + "' , '" + flag + "' , to_char(trunc(sysdate,'mi'),'hh24:mi') , to_char(trunc(sysdate,'mi'),'hh24:mi') from dual ";
String updateSql = "update WORKTIMERECODE set (flag, workendtime ) = ( select '" + flag + "' , to_char(trunc(sysdate,'mi'),'hh24:mi') from dual ) where rq = trunc(sysdate,'dd') "; Statement st = conn.createStatement();
int un = st.executeUpdate(updateSql);
if (un == 0) {
st.executeUpdate(insertSql);
}
ConnectionUtil.release(conn, st, null, null);
} public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
String jdbcPropertiesFilePath = "properties/jdbc.properties";
String userinfoPropertiesFilePath = "properties/userinfo.properties";
daka(jdbcPropertiesFilePath,userinfoPropertiesFilePath);
System.out.println(Calendar.getInstance().getTime() +" SUCCESSED");
} }
执行Maven clean >> Maven install >> Maven package ;
使用这个带依赖关系的jar包,并更名为daka.jar ;
先使用 cmd 命令行执行一下 ;
执行结果如下, 没有报错说明执行成功了;
2: 写批处理脚本;
echo off
cd/d "C:\Users\Administrator\Desktop"
java -jar daka.jar
pause
上面脚本的注释:
1: echo off :关闭打印输出;
2: cd/d 打开目录 "C:\Users\Administrator\Desktop" 目录文件路径;
3: java -jar daka.jar 执行 daka.jar 的 cmd命令 ;
4: pause 暂停 ; 不然的话 就会一闪而过 ;
OK 执行结果如下:
3: 再下面一步: 设置成为开机启动时执行:
将脚本放到开机启动的文件夹下即可开机启动:
如果找不到路径 有肯能是隐藏了; 需要显示隐藏文件;
下面是源代码:
https://pan.baidu.com/s/1dE3OGUX
jjs9
上班打卡--- 通过批处理命令执行jar文件来记录上班时间的更多相关文章
- java命令执行jar文件
如果java -jar target/hbase-demo-1.0-SNAPSHOT.jar HBaseDemo 提示如下 no main manifest attribute, in target/ ...
- Java:执行jar文件命令
Java:执行jar文件命令 执行jar文件命令: java -jar test.jar win7系统切换目录命令: cd /d d:/test
- SQL Server数据库备份:通过Windows批处理命令执行
通过Windows批处理命令执行SQL Server数据库备份 建立mybackup.bat ,输入以下内容直接运行该脚本,即可开始自动备份数据库也可把该脚本加入windows任务计划里执行. --- ...
- cmd中执行jar文件命令(待参数)
cmd中执行jar文件命令(待参数) 1,jar文件路径:F:\products 2,cmd命令: --两个日期参数(空格隔开) java -jar F:\products\analysis.jar ...
- Java应用程序可执行jar文件与服务器交互中文乱码
生成可执行jar文件后,直接双击打开应用,发送Http请求带有中文时,服务器接收到的中文乱码! 解决方式: 1.在cmd命令中执行javaw命令打开jar可执行应用: 打开cmd命令框,输入: jav ...
- maven打包可执行jar文件运行报错
起因 项目中同时依赖了Spring和MyBatis,并使用mybatis-spring集成MyBatis和Spring. 使用maven打包为可执行jar文件运行,打包插件为:maven-shade- ...
- linux怎么执行jar文件 怎么打可执行的jar包
Linux下执行jar文件方法:命令行下进入文件目录,执行java -jar file.jar即可,也可在桌面创建一个启动器,在命令栏填写相关的命令:java -jar /file路径/file.ja ...
- 记录自己在 cmd 中执行 jar 文件遇到的一些错误
记录自己在 cmd 中执行 jar 文件遇到的一些错误 场景: 请求接口,解析接口返回的 JSON 字符串并插入到我们的数据库里面. 情况: 项目在 eclipse 中正常运行,打成 jar 包后在 ...
- 利用osql/ocmd批处理批量执行sql文件
原文:利用osql/ocmd批处理批量执行sql文件 上周在测试环境建了几十张表,保存了.sql文件,准备在正式环境重建的时候懒得一个个打开建了,做一在网上搜寻了一下,果然有简单点的方法. 利用osq ...
随机推荐
- 大话JPA
JPA 是什么 Java Persistence API:用于对象持久化的 API Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层: 首先看一下传统方式访问数据库 ...
- LeetCode 1. Two Sum (两数之和)
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- SpringMVC的流程分析(一)—— 整体流程概括
SpringMVC的整体概括 之前也写过springmvc的流程分析,只是当时理解的还不透彻所以那篇文章就放弃了,现在比之前好了些,想着写下来分享下,也能增强记忆,也希望可以帮助到人,如果文章中有什么 ...
- 【初学者必读】能让你月薪过万的5大web前端核心技能
前言Web前端开发所涉及的内容主要包括W3C标准中的结构.行为和表现,那么这三项中我们需要掌握的核心技能是什么呢?看小编来为你揭开谜底的. 1.开发语言 HTML发展历史有二十多年,历经多次版本更新, ...
- Jni中C++和Java的参数传递(转)
如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用VC++6.0实现JNI的最简单的例子 ...
- ssh免密码记录
主机器A通过ssh连多台从机器(b1,b2,b3). 1.使用root用户操作,避免权限问题. 2.在主从机器中安装ssh,命令: ssh-keygen –t rsa 然后都回车,生成的文件在/roo ...
- HDU1150 Machine Schedule(二分图最大匹配、最小点覆盖)
As we all know, machine scheduling is a very classical problem in computer science and has been stud ...
- 跨域请求CORS
参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS http://www.ruanyifeng.com/b ...
- defaultView and parentWindow
defaultView 只读的 which is used to represent the currently rendered view of the document 返回的值通常是包含 ...
- CSS 备忘
border-radius : 10px / 40px 10表示X轴半径 40表示Y轴半径 font:italic bold 13px/13px arial,sans-serif; ...