Tool-Klasse zur Java-Verbindungsdatenbank hinzufügen, löschen, ändern und überprüfen
Datenbankbetriebstools unterstützen derzeit Paging-Abfragen von MySQL, Oracle und Postgresql, da die Paging-Bedingungen der Datenbanken jedes Herstellers unterschiedlich sind
Es wurde in der Postgresql-Umgebung getestet, jedoch nicht in anderen Datenbanken.
SQL-Anweisungen müssen in vorkompilierter Form vorliegen
Kopieren Sie den Codecode wie folgt:
verpacktb;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.Date;
java.sql.Driver importieren;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.ArrayList;
java.util.List importieren;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.naming.NamingException;
import javax.sql.DataSource;
/**
* Datenbankabfragetools
* Verwenden Sie vorkompiliertes SQL
*
* @Autor XueLiang
*
*/
öffentliche Klasse DBUtil {
privater statischer String-Treiber;
private statische DataSource ds = null;
private static String url = "jdbc:postgresql://192.168.56.101/db";
privater statischer String user = "test";
privater statischer String-Passwort = „12345678“;
statisch {
versuchen {
Class.forName("org.postgresql.Driver");
//ds = (DataSource)SpringContextUtil.getBean("dataSource");
} Catch (Ausnahme e) {
e.printStackTrace();
}
}
/**
* Verbindung herstellen
*
* @return con Connection
* @throwsException
*/
private statische Verbindung getConnection() löst eine Ausnahme aus {
Connection conn = DriverManager.getConnection(URL, Benutzer, Passwort);
//Verbindung conn = ds.getConnection();
Treiber d = DriverManager.getDriver(conn.getMetaData().getURL());
Driver = d.getClass().getName();
Rücklaufverbindung;
}
/**
* Schließen Sie die Verbindung
*
* @param conn
* @param stmt
* @param preStmt
* @param rs
* @throws SQLException
*/
private static void replease(Connection conn, Statement stmt, ResultSet rs) löst eine SQLException {
if (rs != null) {
rs.close();
rs = null;
}
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
}
/**
* Verwenden Sie reguläre Ausdrücke, um Spaltennamen in SELECT SQL zu erhalten
*
* @param sql
* @zurückkehren
*/
private static List<String> getColumnsFromSelect(String sql) {
List<String> colNames = new ArrayList<String>();
// Den Spaltennamensteil in SQL herausnehmen
Muster p = Pattern.compile("(?i)select//s(.*?)//sfrom.*");
Matcher m = p.matcher(sql.trim());
String[] tempA = null;
if (m.matches()) {
tempA = m.group(1).split(",");
}
if (tempA == null) {
null zurückgeben;
}
String p1 = "(//w+)";
String p2 = "(?://w+//s(//w+))";
String p3 = "(?://w+//sas//s(//w+))";
String p4 = "(?://w+//.(//w+))";
String p5 = "(?://w+//.//w+//s(//w+))";
String p6 = "(?://w+//.//w+//sas//s(//w+))";
String p7 = "(?:.+//s(//w+))";
String p8 = "(?:.+//sas//s(//w+))";
p = Pattern.compile("(?:" + p1 + "||" + p2 + "||" + p3 + "||" + p4
+ „||“ + p5 + „||“ + p6 + „||“ + p8 + „)“);
for (String temp : tempA) {
m = p.matcher(temp.trim());
if (!m.matches()) {
weitermachen;
}
for (int i = 1; i <= m.groupCount(); i++) {
if (m.group(i) == null || "".equals(m.group(i))) {
weitermachen;
}
colNames.add(m.group(i));
}
}
return colNames;
}
/**
* Verwenden Sie reguläre Ausdrücke, um Spaltennamen in INSERT SQL zu erhalten
*
* @param sql
* @zurückkehren
*/
private static List<String> getColumnsFromInsert(String sql) {
List<String> colNames = new ArrayList<String>();
// Den Spaltennamensteil in SQL herausnehmen
Muster p = Pattern.compile("(?i)insert//s+into.*//((.*)//)//s+values.*");
Matcher m = p.matcher(sql.trim());
String[] tempA = null;
if (m.matches()) {
tempA = m.group(1).split(",");
}
if (tempA == null) {
null zurückgeben;
}
String p1 = "(//w+)";
String p2 = "(?://w+//s(//w+))";
String p3 = "(?://w+//sas//s(//w+))";
String p4 = "(?://w+//.(//w+))";
String p5 = "(?://w+//.//w+//s(//w+))";
String p6 = "(?://w+//.//w+//sas//s(//w+))";
String p7 = "(?:.+//s(//w+))";
String p8 = "(?:.+//sas//s(//w+))";
p = Pattern.compile("(?:" + p1 + "||" + p2 + "||" + p3 + "||" + p4
+ „||“ + p5 + „||“ + p6 + „||“ + p8 + „)“);
for (String temp : tempA) {
m = p.matcher(temp.trim());
if (!m.matches()) {
weitermachen;
}
for (int i = 1; i <= m.groupCount(); i++) {
if (m.group(i) == null || "".equals(m.group(i))) {
weitermachen;
}
colNames.add(m.group(i));
}
}
return colNames;
}
/**
* Verwenden Sie reguläre Ausdrücke, um Spaltennamen in UPDATE SQL zu erhalten, einschließlich WHERE-Klauseln
*
* @param sql
* @zurückkehren
*/
private static List<String> getColumnsFromUpdate(String sql) {
List<String> colNames = new ArrayList<String>();
// Den Spaltennamensteil in SQL herausnehmen
Muster p = Pattern.compile("(?i)update(?:.*)set(.*)(?:from.*)*where(.*(and)*.*)");
Matcher m = p.matcher(sql.trim());
String[] tempA = null;
if (m.matches()) {
tempA = m.group(1).split(",");
if(m.groupCount() > 1){
String[] tmp = m.group(2).split("and");
String[] fina = new String[tempA.length + tmp.length];
System.arraycopy(tempA, 0, fina, 0, tempA.length);
System.arraycopy(tmp, 0, fina, tempA.length, tmp.length);
tempA = fina;
}
}
if (tempA == null) {
null zurückgeben;
}
String p1 = "(?i)(//w+)(?://s*//=//s*.*)";
String p2 = "(?i)(?://w+//.)(//w+)(?://s*//=//s*.*)";
p = Pattern.compile(p1 + „||“ + p2);
for (String temp : tempA) {
m = p.matcher(temp.trim());
if (!m.matches()) {
weitermachen;
}
for (int i = 1; i <= m.groupCount(); i++) {
if (m.group(i) == null || "".equals(m.group(i))) {
weitermachen;
}
colNames.add(m.group(i));
}
}
return colNames;
}
/**
* Statistikcode zu SQL hinzufügen
*
* @param sql
* @zurückkehren
*/
privater statischer String addCountSQL(String sql) {
StringBuffer sb = new StringBuffer();
sb.append(" select count(*) as dataCount from (");
sb.append(sql);
sb.append(") as a");
return sb.toString();
}
/**
* Paging-Code zu SQL hinzufügen
*
* @param sql
* @param start
* @param-Limit
* @zurückkehren
*/
privater statischer String addPagingSQL(String sql, int start, int limit) {
StringBuffer sb = new StringBuffer();
if ("com.microsoft.jdbc.sqlserver.SQLServerDviver".equals(driver)) {//SQLServer 0.7 2000
} else if ("com.microsoft.sqlserver.jdbc.SQLServerDriver".equals(driver)) {//SQLServer 2005 2008
} else if ("com.mysql.jdbc.Driver".equals(driver)) {//MySQL
sb.append(sql);
sb.append(" LIMIT ");
sb.append(start);
sb.append(",");
sb.append(limit);
} else if ("oracle.jdbc.driver.OracleDriver".equals(driver)) {//Oracle8/8i/9i/10g-Datenbank (Thin-Modus)
List<String> list = getColumnsFromSelect(sql);
sb.append("select");
for (String str: Liste)
sb.append(str).append(", ");
sb.deleteCharAt(sb.lastIndexOf(","));
sb.append(" from (").append(sql).append(") as a");
sb.append(" where rownum between ").append(start == 0 ? 1 : start).append(" and ").append(limit);
} else if ("com.ibm.db2.jdbc.app.DB2Driver".equals(driver)) {//DB2
} else if ("com.sybase.jdbc.SybDriver".equals(driver)) {//Sybase
} else if ("com.informix.jdbc.IfxDriver".equals(driver)) {//Informix
} else if ("org.postgresql.Driver".equals(driver)) {//PostgreSQL
sb.append(sql);
sb.append(" LIMIT ");
sb.append(limit);
sb.append(" OFFSET ");
sb.append(start);
}
return sb.toString();
}
/**
* Instanziieren Sie das RusultSet-Objekt im T-Objekt
*
* @param <T>
* @param t
* @param rs
* @param sql
* @return t
* @throwsException
*/
private static <T> T-Instanz (Class<T> t, ResultSet rs, String sql) löst eine Ausnahme aus{
List<String> columns = getColumnsFromSelect(sql);
T obj = t.newInstance();
for (String col : columns) {
versuchen{
Feld f = t.getDeclaredField(col);
f.setAccessible(true);
Object v = getValue(col, f.getType().getName(), rs);
f.set(obj, v);
}catch(NoSuchFieldException e){
Field[] Felder = t.getDeclaredFields();
for (Feld f: Felder) {
Spalte Column = f.getAnnotation(Column.class);
if(column != null && Column.name().equals(col)){
f.setAccessible(true);
Object v = getValue(col, f.getType().getName(), rs);
f.set(obj, v);
}
}
}
}
return obj;
}
privates statisches Objekt getValue(String columnsName, String type, ResultSet rs) löst eine SQLException{ aus
Objekt obj = null;
//System.out.println("name="+f.getName()+", type="+f.getType().getName() );
if("java.lang.Integer".equals(type) || "int".equals(type)) {
obj = rs.getInt(columnName);
}else if("java.lang.Long".equals(type) || "long".equals(type)) {
obj = rs.getLong(columnName);
}else if("java.lang.Short".equals(type)||"short".equals(type)) {
obj = rs.getShort(columnName);
}else if("java.lang.Float".equals(type)||"float".equals(type)) {
obj = rs.getFloat(columnName);
}else if("java.lang.Double".equals(type)||"double".equals(type)) {
obj = rs.getDouble(columnName);
}else if("java.lang.Byte".equals(type)||"byte".equals(type)) {
obj = rs.getByte(columnName);
}else if("java.lang.Boolean".equals(type)||"boolean".equals(type)) {
obj = rs.getBoolean(columnName);
}else if("java.lang.String".equals(type)) {
obj = rs.getString(columnName);
}anders {
obj = rs.getObject(columnName);
}
//System.out.println("name="+f.getName() +", type="+f.getType().getName()+", value="+(obj == null ? "NULL" : obj.getClass())+",{"+columnName+":"+obj+"}");
return obj;
}
/**
* Fügen Sie die Parameter in param zu pstate hinzu
*
* @param pstate
* @param-Spalten
* @throws SQLException
*/
private static <T> void setParameters(PreparedStatement pstate, Object... params) löst eine Ausnahme aus {
if (params != null && params.length > 0) {
for (int i = 0; i < params.length; i++) {
Objektwert = params[i];
int j = i + 1;
if (Wert == null)
pstate.setString(j, "");
if (Wertinstanz von String)
pstate.setString(j, (String) value);
else if (Wertinstanz von Boolean)
pstate.setBoolean(j, (Boolescher) Wert);
else if (Wertinstanz des Datums)
pstate.setDate(j, (Datum) Wert);
else if (Wertinstanz von Double)
pstate.setDouble(j, (Double) value);
else if (Wertinstanz von Float)
pstate.setFloat(j, (Float)-Wert);
else if (Wertinstanz von Integer)
pstate.setInt(j, (Integer) value);
else if (Wertinstanz von Long)
pstate.setLong(j, (Long) Wert);
else if (Wertinstanz von Short)
pstate.setShort(j, (Short) value);
else if (Wertinstanz der Zeit)
pstate.setTime(j, (Zeit-)Wert);
else if (Wertinstanz des Zeitstempels)
pstate.setTimestamp(j, (Timestamp) value);
anders
pstate.setObject(j, value);
}
}
}
/**
* Fügen Sie die Parameter in param zu pstate hinzu
*
* @param pstate
* @param-Spalten
* @param t
* @throws SQLException
*/
private static <T> void setParameters(PreparedStatement pstate, List<String> columns, T t) löst eine Ausnahme aus {
if (columns != null && columns.size() > 0) {
for (int i = 0; i < columns.size(); i++) {
String attr = columns.get(i);
Objektwert = null;
Klasse<?> c = t.getClass();
versuchen{
Feld f = c.getDeclaredField(attr);
value = f.get(t);
} Catch (NoSuchFieldException e){
Field[] Felder = c.getDeclaredFields();
for (Feld f: Felder) {
Spalte Column = f.getAnnotation(Column.class);
if(column != null && Column.name().equals(attr))
value = f.get(t);
}
}
int j = i + 1;
if (Wert == null)
pstate.setString(j, "");
if (Wertinstanz von String)
pstate.setString(j, (String) value);
else if (Wertinstanz von Boolean)
pstate.setBoolean(j, (Boolescher) Wert);
else if (Wertinstanz des Datums)
pstate.setDate(j, (Datum) Wert);
else if (Wertinstanz von Double)
pstate.setDouble(j, (Double) value);
else if (Wertinstanz von Float)
pstate.setFloat(j, (Float)-Wert);
else if (Wertinstanz von Integer)
pstate.setInt(j, (Integer) value);
else if (Wertinstanz von Long)
pstate.setLong(j, (Long) Wert);
else if (Wertinstanz von Short)
pstate.setShort(j, (Short) value);
else if (Wertinstanz der Zeit)
pstate.setTime(j, (Zeit-)Wert);
else if (Wertinstanz des Zeitstempels)
pstate.setTimestamp(j, (Timestamp) value);
anders
pstate.setObject(j, value);
}
}
}
/**
* Führen Sie den Einfügevorgang durch
*
* @param SQL vorkompilierte SQL-Anweisung
* @param t Parameter in SQL
* @return Anzahl der Ausführungszeilen
* @throwsException
*/
public static <T> int insert(String sql, T t) löst eine Ausnahme aus {
Verbindungsverbindung = null;
PreparedStatement pstate = null;
int updateCount = 0;
versuchen {
conn = getConnection();
List<String> columns = getColumnsFromInsert(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, columns, t);
updateCount = pstate.executeUpdate();
} Endlich {
replease(conn, pstate, null);
}
return updateCount;
}
/**
* Führen Sie den Einfügevorgang durch
*
* @param SQL vorkompilierte SQL-Anweisung
* @param param-Parameter
* @return Anzahl der Ausführungszeilen
* @throwsException
*/
public static <T> int insert(String sql, Object... param) löst eine Ausnahme aus {
Verbindungsverbindung = null;
PreparedStatement pstate = null;
int updateCount = 0;
versuchen {
conn = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
updateCount = pstate.executeUpdate();
} Endlich {
replease(conn, pstate, null);
}
return updateCount;
}
/**
* Führen Sie den Aktualisierungsvorgang durch
*
* @param SQL vorkompilierte SQL-Anweisung
* @param t Parameter in SQL
* @return Anzahl der Ausführungszeilen
* @throwsException
*/
public static <T> int update(String sql, T t) löst eine Ausnahme aus {
Verbindungsverbindung = null;
PreparedStatement pstate = null;
int updateCount = 0;
versuchen {
conn = getConnection();
List<String> columns = getColumnsFromUpdate(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, columns, t);
updateCount = pstate.executeUpdate();
} Endlich {
replease(conn, pstate, null);
}
return updateCount;
}
/**
* Führen Sie den Aktualisierungsvorgang durch
*
* @param sql
* @param param-Parameter
* @return Anzahl der Ausführungszeilen
* @throwsException
*/
public static <T> int update(String sql, Object... param) löst eine Ausnahme aus {
Verbindungsverbindung = null;
PreparedStatement pstate = null;
int updateCount = 0;
versuchen {
conn = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
updateCount = pstate.executeUpdate();
} Endlich {
replease(conn, pstate, null);
}
return updateCount;
}
/**
* Mehrere Objekte abfragen
*
* @param t Der vom Abfrageergebnis gekapselte Objekttyp
* @param SQL vorkompiliertes SQL
* @param param-Abfragebedingungen
* @return List<T>
* @throwsException
*/
public static <T> List<T> queryPlural(Class<T> t, String sql, Object... param) löst eine Ausnahme aus {
Verbindungsverbindung = null;
PreparedStatement stmt = null;
ResultSet rs = null;
List<T> list = new ArrayList<T>();
versuchen {
conn = getConnection();
stmt = conn.prepareStatement(sql);
setParameters(stmt, param);
rs = stmt.executeQuery();
while (rs.next()) {
list.add(instance(t, rs, sql));
}
} Endlich {
replease(conn, stmt, rs);
}
Rückgabeliste;
}
/**
* Paging-Abfrage für mehrere Objekte
*
* @param t Der vom Abfrageergebnis gekapselte Objekttyp
* @param start Startseite
* @param begrenzt die Seitengröße
* @param SQL vorkompilierte SQL-Anweisung
* @param param Abfrageparameter
* @throwsException
*/
public static <T> List<T> queryPluralForPagging(Class<T> t, int start, int limit, String sql, Object... param) löst eine Ausnahme aus {
Verbindungsverbindung = null;
PreparedStatement stmt = null;
ResultSet rs = null;
List<T> list = new ArrayList<T>();
versuchen {
conn = getConnection();
//Paging-Code hinzufügen
sql = addPagingSQL(sql, start, limit);
stmt = conn.prepareStatement(sql);
setParameters(stmt, param);
rs = stmt.executeQuery();
while (rs.next()) {
list.add(instance(t, rs, sql));
}
} Endlich {
replease(conn, stmt, rs);
}
Rückgabeliste;
}
/**
* Fragen Sie ein einzelnes Objekt ab
*
* @param t Abfrageergebnisobjekt
* @param SQL vorkompiliertes SQL
* @param param Abfrageparameter
* @return T
* @throwsException
*/
public static <T> T querySingular(Class<T> t, String sql, Object... param) löst eine Ausnahme aus {
T obj = null;
ResultSet rs = null;
Verbindungsverbindung = null;
PreparedStatement pstate = null;
versuchen {
conn = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
rs = pstate.executeQuery();
if (rs.next()) {
obj = Instanz(t, rs, sql);
}
} Endlich {
replease(conn, pstate, rs);
}
return obj;
}
/**
*Datenvolumen abfragen
*
* @param param Abfrageparameter
* @param sql
* @zurückkehren
* @throws SQLException
* @throws NamingException
*/
public static int queryDataCount(String sql, Object... param)
wirft eine Ausnahme {
int dataCount = 0;
Verbindungsverbindung = null;
PreparedStatement pstate = null;
ResultSet rs = null;
versuchen {
conn = getConnection();
sql = addCountSQL(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
rs = pstate.executeQuery();
if (rs.next()) {
dataCount = rs.getInt("dataCount");
}
} Endlich {
replease(conn, pstate, rs);
}
return dataCount;
}
/**
* Kommentare zu Attributfeldern, die zum Markieren der Datenbankfelder verwendet werden, die dem Attribut entsprechen
* Zum Beispiel:
* @Column(name="user_name");
* String userName;
* Zeigt an, dass das Datenbankfeld, das dem Attribut „userName“ entspricht, „user_name“ ist
*
* Wenn das Attribut vollständig mit dem Datenbankfeld übereinstimmt, ist keine Markierung erforderlich
* @Autor xueliang
*/
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
öffentliche @interface-Spalte{
String name() default „“;
}
}