JdbcUtils.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. package com.mes.util;
  2. import com.mes.ui.ProdReq;
  3. import com.mes.ui.RivetParamRange;
  4. import java.sql.*;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. public class JdbcUtils {
  8. //通过上面的工具就可以获取到properties文件中的键值从而可以加载驱动 获取链接 从而 可以增删改查
  9. public static Connection conn = null;
  10. public static String Drivde="org.sqlite.JDBC";
  11. public static Connection getConn(){
  12. try {
  13. // 复用已打开连接,避免每次新建导致多连接争用、保存失败却仍提示成功
  14. if (conn != null && !conn.isClosed()) {
  15. return conn;
  16. }
  17. Class.forName(Drivde);// 加载驱动,连接sqlite的jdbc
  18. conn = DriverManager.getConnection("jdbc:sqlite:mes_db.db");//连接数据库zhou.db,不存在则创建
  19. // 忙碌时等待,降低与定时任务并发写库被锁失败的概率
  20. try (Statement busyStmt = conn.createStatement()) {
  21. busyStmt.execute("PRAGMA busy_timeout = 5000");
  22. }
  23. System.out.println("连接到SQLite数据库成功!");
  24. create_bw_record();//初始化结构表
  25. create_bw_prod();
  26. create_config_table();
  27. create_rivet_param_table();
  28. } catch (Exception e) {
  29. // TODO Auto-generated catch block
  30. close();//关闭数据库连接
  31. e.printStackTrace();
  32. }
  33. return conn;
  34. }
  35. public static void create_bw_record() throws SQLException {
  36. Statement statement=conn.createStatement(); //创建连接对象,是Java的一个操作数据库的重要接口
  37. //设备结构数据库
  38. String sqlEquipment = "CREATE TABLE if not exists bw_record("
  39. + "id INTEGER PRIMARY KEY AUTOINCREMENT,gw VARCHAR(20),gy VARCHAR(20),message_type VARCHAR(20),sn VARCHAR(48),bw VARCHAR(1000),record_time DATETIME,"
  40. + "info_01 VARCHAR(200),info_02 VARCHAR(200),info_03 VARCHAR(200))";
  41. // statement.executeUpdate("drop table if exists bw_record");//判断是否有表tables的存在。有则删除
  42. statement.executeUpdate(sqlEquipment);
  43. System.out.println("表record创建成功!");
  44. statement.close();
  45. }
  46. //插入数据
  47. public static boolean insertData(String gw, String gy, String bw, String message_type, String sn) {
  48. boolean ret = false;
  49. String record_time = DateLocalUtils.getCurrentTime();
  50. if(conn==null) {
  51. ret = false;
  52. }else {
  53. try {
  54. //创建连接对象,是Java的一个操作数据库的重要接口
  55. Statement statement=conn.createStatement();
  56. statement.executeUpdate("INSERT INTO bw_record (gw,gy,bw,record_time,message_type,sn) VALUES"
  57. + " ('"+gw+"', '"+gy+"', '"+bw+"', '"+record_time+"','"+message_type+"','"+sn+"')");//向数据库中插入数据
  58. statement.close();
  59. ret = true;
  60. } catch (SQLException e) {
  61. // TODO Auto-generated catch block
  62. //e.printStackTrace();
  63. ret = false;
  64. }
  65. }
  66. return ret;
  67. }
  68. public static void create_bw_prod() throws SQLException {
  69. Statement statement=conn.createStatement(); //创建连接对象,是Java的一个操作数据库的重要接口
  70. //设备结构数据库
  71. String sqlEquipment = "CREATE TABLE if not exists bw_prod("
  72. + "id INTEGER PRIMARY KEY AUTOINCREMENT,gw VARCHAR(20),line_sn VARCHAR(20),type VARCHAR(20),sn VARCHAR(48),"
  73. + "fout VARCHAR(20),sout VARCHAR(20),fmin VARCHAR(20),smin VARCHAR(20),fmax VARCHAR(20),smax VARCHAR(20),"
  74. + "qty VARCHAR(5),serial_number VARCHAR(50),sync int(10) NULL DEFAULT 0,record_time DATETIME,ucode VARCHAR(50))"; // 0=未同步到MES 1=已同步到MES
  75. //statement.executeUpdate("drop table if exists bw_prod");//判断是否有表tables的存在。有则删除
  76. statement.executeUpdate(sqlEquipment);
  77. System.out.println("表prod创建成功!");
  78. statement.close();
  79. }
  80. public static void create_config_table() throws SQLException {
  81. Statement statement = conn.createStatement();
  82. String sql = "CREATE TABLE if not exists bw_config("
  83. + "id INTEGER PRIMARY KEY AUTOINCREMENT, "
  84. + "a_set_num SHORT, "
  85. + "b_set_num SHORT, "
  86. + "plc_ip_a VARCHAR(20), "
  87. + "plc_ip_b VARCHAR(20))";
  88. statement.executeUpdate(sql);
  89. // 检查是否已有数据,若无则插入默认值
  90. ResultSet rs = statement.executeQuery("SELECT count(*) FROM bw_config");
  91. if (rs.next() && rs.getInt(1) == 0) {
  92. statement.executeUpdate("INSERT INTO bw_config (a_set_num, b_set_num, plc_ip_a, plc_ip_b) "
  93. + "VALUES (41, 14, '192.168.1.7', '192.168.1.8')");
  94. }
  95. rs.close();
  96. System.out.println("表config创建并初始化成功!");
  97. statement.close();
  98. }
  99. public static java.util.Map<String, Object> getConfig() {
  100. java.util.Map<String, Object> config = new java.util.HashMap<>();
  101. String sql = "SELECT a_set_num, b_set_num, plc_ip_a, plc_ip_b FROM bw_config LIMIT 1";
  102. Connection conn = JdbcUtils.getConn();
  103. try (Statement stmt = conn.createStatement();
  104. ResultSet rs = stmt.executeQuery(sql)) {
  105. if (rs.next()) {
  106. config.put("a_set_num", rs.getShort("a_set_num"));
  107. config.put("b_set_num", rs.getShort("b_set_num"));
  108. config.put("plc_ip_a", rs.getString("plc_ip_a"));
  109. config.put("plc_ip_b", rs.getString("plc_ip_b"));
  110. }
  111. } catch (SQLException e) {
  112. e.printStackTrace();
  113. }
  114. return config;
  115. }
  116. // 铆接参数区间配置表
  117. public static void create_rivet_param_table() throws SQLException {
  118. Statement statement = conn.createStatement();
  119. String sql = "CREATE TABLE if not exists bw_rivet_param("
  120. + "id INTEGER PRIMARY KEY AUTOINCREMENT, "
  121. + "gun_type VARCHAR(1), "
  122. + "start_rivet INTEGER, "
  123. + "end_rivet INTEGER, "
  124. + "f_min INTEGER, "
  125. + "f_max INTEGER, "
  126. + "s_min INTEGER, "
  127. + "s_max INTEGER, "
  128. + "sort_order INTEGER)";
  129. statement.executeUpdate(sql);
  130. ResultSet rs = statement.executeQuery("SELECT count(*) FROM bw_rivet_param");
  131. if (rs.next() && rs.getInt(1) == 0) {
  132. statement.executeUpdate("INSERT INTO bw_rivet_param (gun_type,start_rivet,end_rivet,f_min,f_max,s_min,s_max,sort_order) VALUES "
  133. + "('A',1,41,10000,12000,3500,5500,1),"
  134. + "('B',1,14,11000,13000,3500,5500,1)");
  135. }
  136. rs.close();
  137. System.out.println("表rivet_param创建并初始化成功!");
  138. statement.close();
  139. }
  140. public static java.util.List<RivetParamRange> getRivetParams(String gunType) {
  141. java.util.List<RivetParamRange> list = new java.util.ArrayList<>();
  142. String sql = "SELECT gun_type,start_rivet,end_rivet,f_min,f_max,s_min,s_max FROM bw_rivet_param "
  143. + "WHERE gun_type = ? ORDER BY sort_order ASC, start_rivet ASC";
  144. Connection conn = JdbcUtils.getConn();
  145. try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
  146. pstmt.setString(1, gunType);
  147. ResultSet rs = pstmt.executeQuery();
  148. while (rs.next()) {
  149. RivetParamRange range = new RivetParamRange();
  150. range.setGunType(rs.getString("gun_type"));
  151. range.setStartRivet(rs.getInt("start_rivet"));
  152. range.setEndRivet(rs.getInt("end_rivet"));
  153. range.setFMin(rs.getInt("f_min"));
  154. range.setFMax(rs.getInt("f_max"));
  155. range.setSMin(rs.getInt("s_min"));
  156. range.setSMax(rs.getInt("s_max"));
  157. list.add(range);
  158. }
  159. rs.close();
  160. } catch (SQLException e) {
  161. e.printStackTrace();
  162. }
  163. return list;
  164. }
  165. public static synchronized boolean saveRivetParams(String gunType, java.util.List<RivetParamRange> ranges) {
  166. Connection conn = JdbcUtils.getConn();
  167. if (conn == null) {
  168. System.out.println("保存铆接参数失败:数据库未连接, gunType=" + gunType);
  169. return false;
  170. }
  171. try {
  172. boolean oldAutoCommit = conn.getAutoCommit();
  173. conn.setAutoCommit(false);
  174. try {
  175. PreparedStatement deleteStmt = conn.prepareStatement("DELETE FROM bw_rivet_param WHERE gun_type = ?");
  176. deleteStmt.setString(1, gunType);
  177. deleteStmt.executeUpdate();
  178. deleteStmt.close();
  179. String insertSql = "INSERT INTO bw_rivet_param (gun_type,start_rivet,end_rivet,f_min,f_max,s_min,s_max,sort_order) "
  180. + "VALUES (?,?,?,?,?,?,?,?)";
  181. PreparedStatement insertStmt = conn.prepareStatement(insertSql);
  182. for (int i = 0; i < ranges.size(); i++) {
  183. RivetParamRange range = ranges.get(i);
  184. insertStmt.setString(1, gunType);
  185. insertStmt.setInt(2, range.getStartRivet());
  186. insertStmt.setInt(3, range.getEndRivet());
  187. insertStmt.setInt(4, range.getFMin());
  188. insertStmt.setInt(5, range.getFMax());
  189. insertStmt.setInt(6, range.getSMin());
  190. insertStmt.setInt(7, range.getSMax());
  191. insertStmt.setInt(8, i + 1);
  192. insertStmt.executeUpdate();
  193. }
  194. insertStmt.close();
  195. conn.commit();
  196. System.out.println("保存铆接参数成功:gunType=" + gunType + ", rows=" + ranges.size());
  197. return true;
  198. } catch (SQLException e) {
  199. try {
  200. conn.rollback();
  201. } catch (SQLException rollbackEx) {
  202. rollbackEx.printStackTrace();
  203. }
  204. throw e;
  205. } finally {
  206. conn.setAutoCommit(oldAutoCommit);
  207. }
  208. } catch (SQLException e) {
  209. e.printStackTrace();
  210. System.out.println("保存铆接参数失败:gunType=" + gunType + ", err=" + e.getMessage());
  211. return false;
  212. }
  213. }
  214. public static synchronized boolean updateConfig(short aSetNum, short bSetNum, String plcIpA, String plcIpB) {
  215. String sql = "UPDATE bw_config SET a_set_num = ?, b_set_num = ?, plc_ip_a = ?, plc_ip_b = ? WHERE id = 1";
  216. Connection conn = JdbcUtils.getConn();
  217. if (conn == null) {
  218. System.out.println("更新本地配置失败:数据库未连接");
  219. return false;
  220. }
  221. try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
  222. pstmt.setShort(1, aSetNum);
  223. pstmt.setShort(2, bSetNum);
  224. pstmt.setString(3, plcIpA);
  225. pstmt.setString(4, plcIpB);
  226. int rows = pstmt.executeUpdate();
  227. if (rows <= 0) {
  228. System.out.println("更新本地配置失败:未更新到任何行");
  229. return false;
  230. }
  231. System.out.println("更新本地配置成功:aSetNum=" + aSetNum + ", bSetNum=" + bSetNum + ", IP_A=" + plcIpA + ", IP_B=" + plcIpB);
  232. return true;
  233. } catch (SQLException e) {
  234. e.printStackTrace();
  235. System.out.println("更新本地配置失败:" + e.getMessage());
  236. return false;
  237. }
  238. }
  239. public static void close(){
  240. System.out.println("SQLite数据库连接关闭!");
  241. try {
  242. if(conn!=null) {
  243. conn.close();
  244. conn = null;
  245. }
  246. } catch (SQLException e) {
  247. e.printStackTrace();
  248. }
  249. }
  250. //插入拉铆数据
  251. public static boolean insertProdData(String gw, String lineSn, String sn, String type, String fout, String sout, String fmin, String smin, String fmax, String smax,String qty,String serial_number,String ucode) {
  252. boolean ret = false;
  253. String record_time = DateLocalUtils.getCurrentTime();
  254. JdbcUtils.getConn();
  255. if(conn==null) {
  256. ret = false;
  257. }else {
  258. try {
  259. //创建连接对象,是Java的一个操作数据库的重要接口
  260. Statement statement=conn.createStatement();
  261. statement.executeUpdate("INSERT INTO bw_prod (gw,line_sn,type,sn,fout,sout,fmin,smin,fmax,smax,qty,serial_number,ucode,record_time) VALUES"
  262. + " ('"+gw+"', '"+lineSn+"', '"+type+"', '"+sn+"', '"+fout+"', '"+sout+"', '"+fmin+"', '"+smin+"', '"+fmax+"', '"+smax+"', '"+qty+"','"+serial_number+"','"+ucode+"','"+record_time+"')");//向数据库中插入数据
  263. statement.close();
  264. ret = true;
  265. } catch (SQLException e) {
  266. // TODO Auto-generated catch block
  267. e.printStackTrace();
  268. ret = false;
  269. }
  270. }
  271. return ret;
  272. }
  273. public static void updateProdSync(Integer id,Integer sync) throws SQLException {
  274. Connection conn = JdbcUtils.getConn();
  275. Statement statement=conn.createStatement(); //创建连接对象,是Java的一个操作数据库的重要接口
  276. statement.executeUpdate("update bw_prod set sync = "+sync + " where id = "+id);
  277. statement.close();
  278. }
  279. public static List<ProdReq> getProds() {
  280. //SQL语句
  281. String sql = "select id,gw,line_sn,type,sn,fout,sout,fmin,smin,fmax,smax,qty,serial_number,sync,record_time,ucode from bw_prod where sync = 0 order by id asc limit 100";
  282. Connection conn = JdbcUtils.getConn();
  283. Statement stmt=null;
  284. ResultSet ret = null;
  285. String password=null;
  286. List<ProdReq> prods = new ArrayList<>();
  287. try {
  288. stmt = conn.createStatement();
  289. //执行语句,得到结果集
  290. ret = stmt.executeQuery(sql);
  291. System.out.println("sql:"+ sql);
  292. while (ret.next()) {
  293. ProdReq prodReq = new ProdReq();
  294. prodReq.setId(ret.getInt(1));
  295. prodReq.setGw(ret.getString(2));
  296. prodReq.setLineSn(ret.getString(3));
  297. prodReq.setType(ret.getString(4));
  298. prodReq.setSn(ret.getString(5));
  299. prodReq.setFout(ret.getString(6));
  300. prodReq.setSout(ret.getString(7));
  301. prodReq.setFmin(ret.getString(8));
  302. prodReq.setSmin(ret.getString(9));
  303. prodReq.setFmax(ret.getString(10));
  304. prodReq.setSmax(ret.getString(11));
  305. prodReq.setQty(ret.getString(12));
  306. prodReq.setSerialNumber(ret.getString(13));
  307. prodReq.setSync(ret.getInt(14));
  308. prodReq.setRecordTime(ret.getString(15));
  309. prodReq.setUcode(ret.getString(16));
  310. prods.add(prodReq);
  311. }
  312. ret.close();
  313. // 共享连接不要在这里关闭,否则后续保存配置会写失败
  314. if (stmt != null) {
  315. stmt.close();
  316. }
  317. } catch (SQLException e1) {
  318. e1.printStackTrace();
  319. }
  320. return prods;
  321. }
  322. }