Ver Fonte

add db setter

AE86 há 5 anos atrás
pai
commit
5d4988d0ba
16 ficheiros alterados com 275 adições e 189 exclusões
  1. 5 7
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractDatabaseConnector.java
  2. 33 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractSetter.java
  3. 9 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/Setter.java
  4. 15 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/BigintSetter.java
  5. 15 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/CharSetter.java
  6. 17 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/DateSetter.java
  7. 15 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/DoubleSetter.java
  8. 15 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/FloatSetter.java
  9. 15 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/IntegerSetter.java
  10. 16 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/LongVarcharSetter.java
  11. 14 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/NumericSetter.java
  12. 16 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/TimestampSetter.java
  13. 15 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/TinyintSetter.java
  14. 15 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/VarcharSetter.java
  15. 60 0
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/enums/SetterEnum.java
  16. 0 182
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/util/DatabaseUtil.java

+ 5 - 7
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractDatabaseConnector.java

@@ -5,6 +5,7 @@ import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.connector.ConnectorException;
 import org.dbsyncer.connector.ConnectorException;
 import org.dbsyncer.connector.config.*;
 import org.dbsyncer.connector.config.*;
 import org.dbsyncer.connector.enums.OperationEnum;
 import org.dbsyncer.connector.enums.OperationEnum;
+import org.dbsyncer.connector.enums.SetterEnum;
 import org.dbsyncer.connector.enums.SqlBuilderEnum;
 import org.dbsyncer.connector.enums.SqlBuilderEnum;
 import org.dbsyncer.connector.template.CommandTemplate;
 import org.dbsyncer.connector.template.CommandTemplate;
 import org.dbsyncer.connector.util.DatabaseUtil;
 import org.dbsyncer.connector.util.DatabaseUtil;
@@ -230,12 +231,9 @@ public abstract class AbstractDatabaseConnector implements Database {
 
 
         // 拼接或者SQL
         // 拼接或者SQL
         String orSql = getFilterSql(OperationEnum.OR.getName(), filter);
         String orSql = getFilterSql(OperationEnum.OR.getName(), filter);
-        if (StringUtils.isNotBlank(orSql)) {
-            condition.append(orSql);
-            // 如果Or条件和Add条件都存在
-            if (StringUtils.isNotBlank(addSql)) {
-                condition.append(" OR ").append(orSql);
-            }
+        // 如果Or条件和Add条件都存在
+        if (StringUtils.isNotBlank(orSql) && StringUtils.isNotBlank(addSql)) {
+            condition.append(" OR ").append(orSql);
         }
         }
 
 
         // 如果有条件加上 WHERE
         // 如果有条件加上 WHERE
@@ -296,7 +294,7 @@ public abstract class AbstractDatabaseConnector implements Database {
             f = fields.get(i);
             f = fields.get(i);
             type = f.getType();
             type = f.getType();
             val = row.get(f.getName());
             val = row.get(f.getName());
-            DatabaseUtil.preparedStatementSetter(ps, i + 1, type, val);
+            SetterEnum.getSetter(type).preparedStatementSetter(ps, i + 1, type, val);
         }
         }
     }
     }
 
 

+ 33 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractSetter.java

@@ -0,0 +1,33 @@
+package org.dbsyncer.connector.database;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public abstract class AbstractSetter implements Setter {
+
+    /**
+     * 实现字段类型参数设置
+     *
+     * @param ps
+     * @param i
+     * @param val
+     */
+    protected abstract void set(PreparedStatement ps, int i, Object val) throws SQLException;
+
+    @Override
+    public void preparedStatementSetter(PreparedStatement ps, int i, int type, Object val) {
+        try {
+            if (null == val) {
+                ps.setNull(i, type);
+            } else {
+                set(ps, i, val);
+            }
+        } catch (Exception e) {
+            try {
+                ps.setNull(i, type);
+            } catch (SQLException e1) {
+            }
+        }
+    }
+    
+}

+ 9 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/Setter.java

@@ -0,0 +1,9 @@
+package org.dbsyncer.connector.database;
+
+import java.sql.PreparedStatement;
+
+public interface Setter {
+
+    void preparedStatementSetter(PreparedStatement ps, int i, int type, Object val);
+    
+}

+ 15 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/BigintSetter.java

@@ -0,0 +1,15 @@
+package org.dbsyncer.connector.database.setter;
+
+import org.dbsyncer.connector.database.AbstractSetter;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class BigintSetter extends AbstractSetter {
+
+    @Override
+    protected void set(PreparedStatement ps, int i, Object val) throws SQLException {
+        ps.setLong(i, Long.parseLong(String.valueOf(val)));
+    }
+
+}

+ 15 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/CharSetter.java

@@ -0,0 +1,15 @@
+package org.dbsyncer.connector.database.setter;
+
+import org.dbsyncer.connector.database.AbstractSetter;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class CharSetter extends AbstractSetter {
+
+    @Override
+    protected void set(PreparedStatement ps, int i, Object val) throws SQLException {
+        ps.setString(i, String.valueOf(val));
+    }
+
+}

+ 17 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/DateSetter.java

@@ -0,0 +1,17 @@
+package org.dbsyncer.connector.database.setter;
+
+import org.dbsyncer.connector.database.AbstractSetter;
+
+import java.sql.Date;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.time.LocalDate;
+
+public class DateSetter extends AbstractSetter {
+
+    @Override
+    protected void set(PreparedStatement ps, int i, Object val) throws SQLException {
+        ps.setDate(i, Date.valueOf(LocalDate.parse(val + "")));
+    }
+
+}

+ 15 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/DoubleSetter.java

@@ -0,0 +1,15 @@
+package org.dbsyncer.connector.database.setter;
+
+import org.dbsyncer.connector.database.AbstractSetter;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class DoubleSetter extends AbstractSetter {
+
+    @Override
+    protected void set(PreparedStatement ps, int i, Object val) throws SQLException {
+        ps.setDouble(i, Double.parseDouble(String.valueOf(val)));
+    }
+
+}

+ 15 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/FloatSetter.java

@@ -0,0 +1,15 @@
+package org.dbsyncer.connector.database.setter;
+
+import org.dbsyncer.connector.database.AbstractSetter;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class FloatSetter extends AbstractSetter {
+
+    @Override
+    protected void set(PreparedStatement ps, int i, Object val) throws SQLException {
+        ps.setFloat(i, Float.parseFloat(String.valueOf(val)));
+    }
+
+}

+ 15 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/IntegerSetter.java

@@ -0,0 +1,15 @@
+package org.dbsyncer.connector.database.setter;
+
+import org.dbsyncer.connector.database.AbstractSetter;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class IntegerSetter extends AbstractSetter {
+
+    @Override
+    protected void set(PreparedStatement ps, int i, Object val) throws SQLException {
+        ps.setInt(i, Integer.parseInt(String.valueOf(val)));
+    }
+
+}

+ 16 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/LongVarcharSetter.java

@@ -0,0 +1,16 @@
+package org.dbsyncer.connector.database.setter;
+
+import org.dbsyncer.connector.database.AbstractSetter;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class LongVarcharSetter extends AbstractSetter {
+
+    @Override
+    protected void set(PreparedStatement ps, int i, Object val) throws SQLException {
+        // 当数据库为mysql,字段类型为text,如果值里面包含非数字类型转换会失败,为兼容采用Types.VARCHAR方式替换
+        ps.setString(i, String.valueOf(val));
+    }
+
+}

+ 14 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/NumericSetter.java

@@ -0,0 +1,14 @@
+package org.dbsyncer.connector.database.setter;
+
+import org.dbsyncer.connector.database.AbstractSetter;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class NumericSetter extends AbstractSetter {
+
+    @Override
+    protected void set(PreparedStatement ps, int i, Object val) throws SQLException {
+        ps.setInt(i, Integer.parseInt(String.valueOf(val)));
+    }
+}

+ 16 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/TimestampSetter.java

@@ -0,0 +1,16 @@
+package org.dbsyncer.connector.database.setter;
+
+import org.dbsyncer.connector.database.AbstractSetter;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+
+public class TimestampSetter extends AbstractSetter {
+
+    @Override
+    protected void set(PreparedStatement ps, int i, Object val) throws SQLException {
+        ps.setTimestamp(i, Timestamp.valueOf(String.valueOf(val)));
+    }
+
+}

+ 15 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/TinyintSetter.java

@@ -0,0 +1,15 @@
+package org.dbsyncer.connector.database.setter;
+
+import org.dbsyncer.connector.database.AbstractSetter;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class TinyintSetter extends AbstractSetter {
+
+    @Override
+    protected void set(PreparedStatement ps, int i, Object val) throws SQLException {
+        ps.setInt(i, Integer.parseInt(String.valueOf(val)));
+    }
+
+}

+ 15 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/setter/VarcharSetter.java

@@ -0,0 +1,15 @@
+package org.dbsyncer.connector.database.setter;
+
+import org.dbsyncer.connector.database.AbstractSetter;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class VarcharSetter extends AbstractSetter {
+
+    @Override
+    protected void set(PreparedStatement ps, int i, Object val) throws SQLException {
+        ps.setString(i, String.valueOf(val));
+    }
+
+}

+ 60 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/enums/SetterEnum.java

@@ -0,0 +1,60 @@
+package org.dbsyncer.connector.enums;
+
+import org.dbsyncer.connector.ConnectorException;
+import org.dbsyncer.connector.database.Setter;
+import org.dbsyncer.connector.database.setter.*;
+
+import java.sql.Types;
+
+/**
+ * 根据列类型设值
+ *
+ * @author AE86
+ * @version 1.0.0
+ * @date 2020/04/15 15:13
+ */
+public enum SetterEnum {
+
+    // 常用类型(靠前,减少查找次数)
+    VARCHAR(Types.VARCHAR, new VarcharSetter()),
+    INTEGER(Types.INTEGER, new IntegerSetter()),
+    BIGINT(Types.BIGINT, new BigintSetter()),
+    TIMESTAMP(Types.TIMESTAMP, new TimestampSetter()),
+    DATE(Types.DATE, new DateSetter()),
+
+    // 较少使用
+    CHAR(Types.CHAR, new CharSetter()),
+    LONGVARCHAR(Types.LONGVARCHAR, new LongVarcharSetter()),
+    NUMERIC(Types.NUMERIC, new NumericSetter()),
+
+    // 很少使用
+    TINYINT(Types.TINYINT, new TinyintSetter()),
+    DOUBLE(Types.DOUBLE, new DoubleSetter()),
+    FLOAT(Types.FLOAT, new FloatSetter());
+
+    private int type;
+
+    private Setter setter;
+
+    SetterEnum(int type, Setter setter) {
+        this.type = type;
+        this.setter = setter;
+    }
+
+    public static Setter getSetter(int type) throws ConnectorException {
+        for (SetterEnum e : SetterEnum.values()) {
+            if (e.getType() == type) {
+                return e.getSetter();
+            }
+        }
+        throw new ConnectorException(String.format("Setter type \"%s\" does not exist.", type));
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public Setter getSetter() {
+        return setter;
+    }
+}

+ 0 - 182
dbsyncer-connector/src/main/java/org/dbsyncer/connector/util/DatabaseUtil.java

@@ -106,186 +106,4 @@ public abstract class DatabaseUtil {
         return primaryKeys;
         return primaryKeys;
     }
     }
 
 
-    /**
-     * 根据列类型设值
-     *
-     * @param ps
-     * @param i
-     * @param type
-     * @param f
-     * @throws SQLException
-     * @throws NumberFormatException
-     */
-    public static void preparedStatementSetter(PreparedStatement ps, int i, int type, Object f) {
-        switch (type) {
-            case Types.NUMERIC:
-                try {
-                    if (f == null) {
-                        ps.setNull(i, Types.NUMERIC);
-                    } else {
-                        ps.setInt(i, Integer.parseInt(String.valueOf(f)));
-                    }
-                } catch (Exception e) {
-                    try {
-                        ps.setNull(i, Types.NUMERIC);
-                    } catch (SQLException e1) {
-                    }
-                }
-                break;
-            case Types.INTEGER:
-                try {
-                    if (f == null) {
-                        ps.setNull(i, Types.INTEGER);
-                    } else {
-                        ps.setInt(i, Integer.parseInt(String.valueOf(f)));
-                    }
-                } catch (Exception e) {
-                    try {
-                        ps.setNull(i, Types.INTEGER);
-                    } catch (SQLException e1) {
-                    }
-                }
-                break;
-            case Types.BIGINT:
-                try {
-                    if (f == null) {
-                        ps.setNull(i, Types.BIGINT);
-                    } else {
-                        ps.setLong(i, Long.parseLong(String.valueOf(f)));
-                    }
-                } catch (Exception e) {
-                    try {
-                        ps.setNull(i, Types.BIGINT);
-                    } catch (SQLException e1) {
-                    }
-                }
-                break;
-            case Types.TINYINT:
-                try {
-                    if (f == null) {
-                        ps.setNull(i, Types.INTEGER);
-                    } else {
-                        ps.setInt(i, Integer.parseInt(String.valueOf(f)));
-                    }
-                } catch (Exception e) {
-                    try {
-                        ps.setNull(i, Types.INTEGER);
-                    } catch (SQLException e1) {
-                    }
-                }
-                break;
-            case Types.VARCHAR:
-                try {
-                    if (f == null) {
-                        ps.setNull(i, Types.VARCHAR);
-                    } else {
-                        ps.setString(i, String.valueOf(f));
-                    }
-                } catch (Exception e) {
-                    try {
-                        ps.setNull(i, Types.VARCHAR);
-                    } catch (SQLException e1) {
-                    }
-                }
-                break;
-            case Types.CHAR:
-                try {
-                    if (f == null) {
-                        ps.setNull(i, Types.CHAR);
-                    } else {
-                        ps.setString(i, String.valueOf(f));
-                    }
-                } catch (Exception e) {
-                    try {
-                        ps.setNull(i, Types.VARCHAR);
-                    } catch (SQLException e1) {
-                    }
-                }
-                break;
-            case Types.TIMESTAMP:
-                try {
-                    if (f == null) {
-                        ps.setNull(i, Types.TIMESTAMP);
-                    } else {
-                        ps.setTimestamp(i, Timestamp.valueOf(String.valueOf(f)));
-                    }
-                } catch (Exception e) {
-                    try {
-                        ps.setNull(i, Types.TIMESTAMP);
-                    } catch (SQLException e1) {
-                    }
-                }
-                break;
-            case Types.DATE:
-                try {
-                    if (f == null) {
-                        ps.setNull(i, Types.DATE);
-                    } else {
-                        ps.setDate(i, java.sql.Date.valueOf(LocalDate.parse(f + "")));
-                    }
-                } catch (Exception e) {
-                    try {
-                        ps.setNull(i, Types.DATE);
-                    } catch (SQLException e1) {
-                    }
-                }
-                break;
-            case Types.FLOAT:
-                try {
-                    if (f == null) {
-                        ps.setNull(i, Types.FLOAT);
-                    } else {
-                        ps.setFloat(i, Float.parseFloat(String.valueOf(f)));
-                    }
-                } catch (Exception e) {
-                    try {
-                        ps.setNull(i, Types.FLOAT);
-                    } catch (SQLException e1) {
-                    }
-                }
-                break;
-            case Types.DOUBLE:
-                try {
-                    if (f == null) {
-                        ps.setNull(i, Types.DOUBLE);
-                    } else {
-                        ps.setDouble(i, Double.parseDouble(String.valueOf(f)));
-                    }
-                } catch (Exception e) {
-                    try {
-                        ps.setNull(i, Types.DOUBLE);
-                    } catch (SQLException e1) {
-                    }
-                }
-                break;
-            case Types.LONGVARCHAR:
-                try {
-                    if (f == null) {
-                        ps.setNull(i, Types.VARCHAR);
-                    } else {
-                        ps.setString(i, String.valueOf(f));
-                    }
-                } catch (Exception e) {
-                    try {
-                        ps.setNull(i, Types.VARCHAR);
-                    } catch (SQLException e1) {
-                    }
-                }
-                // 当数据库为mysql,字段类型为text,如果f值里面包含非数字类型转换会失败,为兼容采用Types.VARCHAR方式替换
-                //			try {
-                //                if (f == null) {
-                //                    ps.setNull(i, Types.LONGVARCHAR);
-                //                } else {
-                //                    ps.setLong(i, Long.parseLong(String.valueOf(f)));
-                //                }
-                //            } catch (Exception e) {
-                //                try {
-                //                    ps.setNull(i, Types.LONGVARCHAR);
-                //                } catch (SQLException e1) {
-                //                }
-                //            }
-                break;
-        }
-    }
-
 }
 }