如果 一个程序员要记录自己上班工作时间的话 ,还需要靠手动去记录, 那就有点 不够范了, 程序员自然要有自己的极客范儿 , 下面就跟我一起来(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
时间: 2024-12-11 12:51:03