失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Java|达梦工作笔记-达梦数据库同步工具(JDBC)

Java|达梦工作笔记-达梦数据库同步工具(JDBC)

时间:2020-12-25 17:34:51

相关推荐

Java|达梦工作笔记-达梦数据库同步工具(JDBC)

目录

前言

代码与实例

前言

最近数据库要用达梦,个人对达梦又有了新的认识。使用的是达梦7,这个数据库有很多BUG,官方提供的客户端,不仅卡,而且登录了后,使用Java JDBC操作更新时,是会被阻塞的,所以,在使用Java开发达梦应用时候,尽量关闭他客户端。

另外达梦还有个模式的概念,这玩意个人感觉就和Mysql中的数据库一样。还有就是SQL语句,大部分情况下是一样的。但是复杂语句就要查他的文档了,因为直接使用Mysql的不靠谱。

这个实例是使用Maven进行项目管理!配置SQL语句模板,对数据库从而达到更加灵活的操作。如下模板

1 @insert into %1(%2) select %3.%4 from %3 where %2 not in (select %2 from %1) #往%1表中添加新数据,此数据只有%2这一列,这个ID从%3表中找,找%4列中存在%1表中%2列中不存在的2 @update %1 set %2 = (select %3.%2 from %3, %2 where %1.%2 = %4) #往%1更新%2数据,这个%2数据是%3中的%2数据,这里%1表的%2列要为一个顶值3 @select %1.%2 from %1 #查询%1表的%2列数据4 @update %1 set %1.%2=%3.%4 from %1,%3 where %1.%5=%3.%6 #更新表%1的%2属性,这个%2属性是%3表里面的,判断条件是%1表中的%5等于%3中的%6

模板匹配如下:

开头的#表示注释掉此行。

通过这种匹配方式,可以使得程序更加的灵活

代码与实例

程序运行截图如下:

查询下被拷贝的表:

原始数据表:

程序结构如下:

源码如下:

DMPtr.java

package main.dmDB;import lombok.Data;import java.sql.*;import java.util.Map;public class DMPtr {private Connection connection = null;Map<Integer, String> cmdMap;public DMPtr() throws SQLException, ClassNotFoundException {String jdbcString = "dm.jdbc.driver.DmDriver";String urlString = "jdbc:dm://127.0.0.1:5236";String userName = "SYSDBA";String passWord = "SYSDBA";Class.forName(jdbcString);//连接connection = DriverManager.getConnection(urlString, userName, passWord);}/*** 打印数据* @param rs* @throws SQLException*/private static void displayResultSet(ResultSet rs) throws SQLException {// 取得结果集元数据ResultSetMetaData rsmd = rs.getMetaData();// 取得结果集所包含的列数int numCols = rsmd.getColumnCount();//列头for (int i = 1; i <= numCols; i++) {if (i > 1) {System.out.print(",");}System.out.print(rsmd.getColumnLabel(i));}System.out.println("");//所有数据while (rs.next()) {for (int i = 1; i <= numCols; i++) {if (i > 1) {System.out.print(",");}// 普通字段System.out.print(rs.getString(i));}System.out.println("");}}public Map<Integer, String> getCmdMap() {return cmdMap;}public void setCmdMap(Map<Integer, String> cmdMap) {this.cmdMap = cmdMap;}/**** 运行SQL命令*/public void runSQLCMD() throws SQLException {for(int i = 0; i < cmdMap.size(); i++){String queryStr = cmdMap.get(i);System.out.println("开始执行:" + queryStr);Statement statement = connection.createStatement();System.out.println("影响的行数:" + statement.executeUpdate(queryStr));statement.close();}}/**** 关闭连接*/public void closeConnection() throws SQLException {connection.close();}}

ReadFileEm.java

package main.errorEm;import lombok.Getter;@Getterpublic enum ReadFileEm {SQL_TEMPLATE_INDEX_ERROR(1,"SQL模板索引格式不对"),SQL_TEMPLATE_STRING_ERROR(2, "SQL模板数据格式不对"),SQL_LACK_STRING_ERROR(3, "SQL模板格式不对,缺少>");private Integer code;private String msg;ReadFileEm(Integer code, String msg){this.code = code;this.msg = msg;}}

ReadFileException.java

package main.Exception;import main.errorEm.ReadFileEm;public class ReadFileException extends RuntimeException{public ReadFileException(ReadFileEm readFileEm){super(readFileEm.getMsg());this.code = readFileEm.getCode();}private Integer code;}

ReadFile.java

package main.file;import lombok.Data;import main.Exception.ReadFileException;import main.errorEm.ReadFileEm;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.HashMap;import java.util.Map;import java.util.Set;public class ReadFile {@Dataclass SQLTemplateStruct{public String index;public String data;}//存sqlCMD文件private static Map<String, Map<String, String>> m_sqlTemplateMap = new HashMap<String, Map<String, String>>();private static Map<Integer, String> m_sqlMap = new HashMap<Integer, String>();public void createCMD() throws IOException {/**** 读取命令文件*/FileReader reader = new FileReader("E:\\IdeaProject\\Synchronization\\src\\main\\resources\\command\\sqlCmd.txt");BufferedReader bufferedReader = new BufferedReader(reader);String str = null;Integer index = 0;while ((str = bufferedReader.readLine()) != null){if(str.contains("#"))continue;;m_sqlTemplateMap.put(index.toString(), getSingleMap(str));index++;}bufferedReader.close();reader.close();System.out.println("sqlCmd文件读取解析结束:" + m_sqlTemplateMap);/**** 读取模板文件*/createTemplateSqlFile();return;}/*** 获取单条数据* @param str* @return*/protected Map<String, String> getSingleMap(String str){Map<String, String> fileMap = new HashMap<String, String>();String[] split = str.split(" ");fileMap.put("索引", getTemplateIndex(split[0]));for(int i = 1; i < split.length; i++){SQLTemplateStruct templateString = getTemplateString(split[i]);fileMap.put(templateString.getIndex(), templateString.getData());}return fileMap;}/**** 获取Template前面的索引号* @param str* @return*/protected String getTemplateIndex(String str){String ret = null;if(!str.contains("$")){throw new ReadFileException(ReadFileEm.SQL_TEMPLATE_INDEX_ERROR);}ret = str.replace("$","");return ret;}/**** 获取里面具体的数据* @param str* @return*/protected SQLTemplateStruct getTemplateString(String str){SQLTemplateStruct struct = new SQLTemplateStruct();if(!str.contains("%") && !str.contains(">")){throw new ReadFileException(ReadFileEm.SQL_TEMPLATE_STRING_ERROR);}String[] split = str.split(">");if(split.length < 2){throw new ReadFileException(ReadFileEm.SQL_LACK_STRING_ERROR);}struct.setIndex("%" + split[0].substring(1));struct.setData(split[1]);return struct;}/**** 填充此文件* @throws IOException*/protected void createTemplateSqlFile() throws IOException {FileReader reader = new FileReader("E:\\IdeaProject\\Synchronization\\src\\main\\resources\\command\\sqlTemplate.txt");BufferedReader bufferedReader = new BufferedReader(reader);String str = null;Map<Integer, String> map = new HashMap<Integer, String>();while ((str = bufferedReader.readLine()) != null){String index = str.substring(0, str.indexOf('@')).replace(" ", "");str = str.substring(0, str.indexOf('#')).substring(str.indexOf('@') + 1);//System.out.println(index + " " + str);map.put(Integer.parseInt(index), str);}bufferedReader.close();reader.close();//进行拼接,填充 m_sqlMapSet<String> stringSet = m_sqlTemplateMap.keySet();Integer index = 0;for(String key : stringSet){String fStr = map.get(Integer.parseInt(m_sqlTemplateMap.get(key).get("索引")));Set<String> stringSet1 = m_sqlTemplateMap.get(key).keySet();for(String value : stringSet1){fStr = fStr.replace(value, m_sqlTemplateMap.get(key).get(value));}m_sqlMap.put(index++, fStr);}System.out.println("sql指令匹配完成,依次如下:" + m_sqlMap);}public static Map<Integer, String> getSqlMap() {return m_sqlMap;}}

Main.java

package main;import main.dmDB.DMPtr;import main.file.ReadFile;import java.io.IOException;import java.sql.*;public class Main {public static void main(String[] args) throws SQLException, ClassNotFoundException {ReadFile readFile = new ReadFile();try {readFile.createCMD();} catch (IOException e) {e.printStackTrace();}System.out.println("开始操作数据库");DMPtr dmPtr = new DMPtr();dmPtr.setCmdMap(readFile.getSqlMap());System.out.println("内容为:" + dmPtr.getCmdMap());dmPtr.runSQLCMD();System.out.println("over!");dmPtr.closeConnection();}}

这里只帖出了部分源码,具体配置直接从Github上下载吧!

项目打包下载地址:

/fengfanchen/Java/tree/master/Synchronization

如果觉得《Java|达梦工作笔记-达梦数据库同步工具(JDBC)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。