Base de datos de conexión Java para agregar, eliminar, modificar y verificar clase de herramienta
Las herramientas de operación de bases de datos, debido a que las condiciones de paginación de la base de datos de cada fabricante son diferentes, actualmente admiten consultas de paginación de Mysql, Oracle y Postgresql.
Ha sido probado en el entorno Postgresql, pero no en otras bases de datos.
Las declaraciones SQL deben estar en formato precompilado
Copie el código de código de la siguiente manera:
paquetedb;
importar java.lang.annotation.ElementType;
importar java.lang.annotation.Retention;
importar java.lang.annotation.RetentionPolicy;
importar java.lang.annotation.Target;
importar java.lang.reflect.Field;
importar java.sql.Conexión;
importar java.sql.Fecha;
importar java.sql.Driver;
importar java.sql.DriverManager;
importar java.sql.PreparedStatement;
importar java.sql.ResultSet;
importar java.sql.SQLException;
importar java.sql.Statement;
importar java.sql.Time;
importar java.sql.Timestamp;
importar java.util.ArrayList;
importar java.util.List;
importar java.util.regex.Matcher;
importar java.util.regex.Pattern;
importar javax.naming.NamingException;
importar javax.sql.DataSource;
/**
* Herramientas de consulta de bases de datos.
* Utilice SQL precompilado
*
* @autor XueLiang
*
*/
clase pública DBUtil {
controlador de cadena estático privado;
Fuente de datos estática privada ds = nulo;
URL de cadena estática privada = "jdbc:postgresql://192.168.56.101/db";
Usuario de cadena estática privada = "prueba";
contraseña de cadena estática privada = "12345678";
estático {
intentar {
Class.forName("org.postgresql.Driver");
//ds = (Fuente de datos)SpringContextUtil.getBean("Fuente de datos");
} captura (Excepción e) {
e.printStackTrace();
}
}
/**
* Establecer conexión
*
* @return con Conexión
* @throwsException
*/
Conexión estática privada getConnection() lanza una excepción {
Conexión de conexión = DriverManager.getConnection (url, usuario, contraseña);
//Conexión de conexión = ds.getConnection();
Controlador d = DriverManager.getDriver(conn.getMetaData().getURL());
controlador = d.getClass().getName();
conexión de retorno;
}
/**
* Cerrar la conexión
*
* @param conexión
* @param stmt
* @param preStmt
* @param rs
* @lanza SQLException
*/
respuesta nula estática privada (conexión de conexión, declaración stmt, ResultSet rs) lanza SQLException {
si (rs! = nulo) {
rs.cerrar();
rs = nulo;
}
si (stmt! = nulo) {
stmt.close();
stmt = nulo;
}
si (conexión! = nulo) {
conexión.close();
conexión = nulo;
}
}
/**
* Utilice expresiones regulares para obtener nombres de columnas en SELECT SQL
*
*@param sql
* @devolver
*/
Lista estática privada <String> getColumnsFromSelect (String sql) {
Lista<String> colNames = new ArrayList<String>();
// Elimina la parte del nombre de la columna en sql
Patrón p = Pattern.compile("(?i)select//s(.*?)//sfrom.*");
Comparador m = p.matcher(sql.trim());
Cadena[] tempA = nulo;
si (m.matches()) {
tempA = m.group(1).split(",");
}
si (tempA == nulo) {
devolver nulo;
}
Cadena p1 = "(//w+)";
Cadena p2 = "(?://w+//s(//w+))";
Cadena p3 = "(?://w+//sas//s(//w+))";
Cadena p4 = "(?://w+//.(//w+))";
Cadena p5 = "(?://w+//.//w+//s(//w+))";
Cadena p6 = "(?://w+//.//w+//sas//s(//w+))";
Cadena p7 = "(?:.+//s(//w+))";
Cadena p8 = "(?:.+//sas//s(//w+))";
p = Patrón.compile("(?:" + p1 + "||" + p2 + "||" + p3 + "||" + p4
+ "||" + p5 + "||" + p6 + "||" + p7 + "||"
para (temperatura de cadena: tempA) {
m = p.matcher(temp.trim());
si (!m.matches()) {
continuar;
}
para (int i = 1; i <= m.groupCount(); i++) {
if (m.group(i) == nulo || "".equals(m.group(i))) {
continuar;
}
colNames.add(m.group(i));
}
}
devolver colNames;
}
/**
* Utilice expresiones regulares para obtener nombres de columnas en INSERT SQL
*
*@param sql
* @devolver
*/
Lista estática privada <String> getColumnsFromInsert (String sql) {
Lista<String> colNames = new ArrayList<String>();
// Elimina la parte del nombre de la columna en sql
Patrón p = Pattern.compile("(?i)insert//s+into.*//((.*)//)//s+values.*");
Comparador m = p.matcher(sql.trim());
Cadena[] tempA = nulo;
si (m.matches()) {
tempA = m.group(1).split(",");
}
si (tempA == nulo) {
devolver nulo;
}
Cadena p1 = "(//w+)";
Cadena p2 = "(?://w+//s(//w+))";
Cadena p3 = "(?://w+//sas//s(//w+))";
Cadena p4 = "(?://w+//.(//w+))";
Cadena p5 = "(?://w+//.//w+//s(//w+))";
Cadena p6 = "(?://w+//.//w+//sas//s(//w+))";
Cadena p7 = "(?:.+//s(//w+))";
Cadena p8 = "(?:.+//sas//s(//w+))";
p = Patrón.compilar("(?:" + p1 + "||" + p2 + "||" + p3 + "||" + p4
+ "||" + p5 + "||" + p6 + "||" + p7 + "||"
para (temperatura de cadena: tempA) {
m = p.matcher(temp.trim());
si (!m.matches()) {
continuar;
}
para (int i = 1; i <= m.groupCount(); i++) {
if (m.group(i) == nulo || "".equals(m.group(i))) {
continuar;
}
colNames.add(m.group(i));
}
}
devolver colNames;
}
/**
* Utilice expresiones regulares para obtener nombres de columnas en UPDATE SQL, incluidas las cláusulas WHERE
*
*@param sql
* @devolver
*/
Lista estática privada <String> getColumnsFromUpdate (String sql) {
Lista<String> colNames = new ArrayList<String>();
// Elimina la parte del nombre de la columna en sql
Patrón p = Pattern.compile("(?i)update(?:.*)set(.*)(?:from.*)*where(.*(y)*.*)");
Comparador m = p.matcher(sql.trim());
Cadena[] tempA = nulo;
si (m.matches()) {
tempA = m.group(1).split(",");
si(m.groupCount() > 1){
String[] tmp = m.group(2).split("y");
Cadena[] fina = nueva Cadena[tempA.length + tmp.length];
System.arraycopy(tempA, 0, fina, 0, tempA.length);
System.arraycopy(tmp, 0, fina, tempA.length, tmp.length);
tempA = fina;
}
}
si (tempA == nulo) {
devolver nulo;
}
Cadena p1 = "(?i)(//w+)(?://s*//=//s*.*)";
Cadena p2 = "(?i)(?://w+//.)(//w+)(?://s*//=//s*.*)";
p = Patrón.compile(p1 + "||" + p2);
para (temperatura de cadena: tempA) {
m = p.matcher(temp.trim());
si (!m.matches()) {
continuar;
}
para (int i = 1; i <= m.groupCount(); i++) {
if (m.group(i) == nulo || "".equals(m.group(i))) {
continuar;
}
colNames.add(m.group(i));
}
}
devolver colNames;
}
/**
* Agregar código de estadísticas a sql
*
*@param sql
* @devolver
*/
cadena estática privada addCountSQL (cadena sql) {
StringBuffer sb = nuevo StringBuffer();
sb.append(" seleccione contar(*) como dataCount from (");
sb.append(sql);
sb.append() como");
devolver sb.toString();
}
/**
* Agregar código de paginación a sql
*
*@param sql
* @param inicio
* Límite @param
* @devolver
*/
cadena estática privada addPagingSQL (cadena sql, int inicio, int límite) {
StringBuffer sb = nuevo StringBuffer();
si ("com.microsoft.jdbc.sqlserver.SQLServerDviver".equals(controlador)) {//SQLServer 0.7 2000
} else if ("com.microsoft.sqlserver.jdbc.SQLServerDriver".equals(driver)) {//SQLServer 2005 2008
} else if ("com.mysql.jdbc.Driver".equals(controlador)) {//MySQL
sb.append(sql);
sb.append(" LÍMITE ");
sb.append(inicio);
sb.append(",");
sb.append(límite);
} else if ("oracle.jdbc.driver.OracleDriver".equals(driver)) {//Oracle8/8i/9i/10g base de datos (modo ligero)
Lista<Cadena> lista = getColumnsFromSelect(sql);
sb.append("seleccionar ");
para (cadena cadena: lista)
sb.append(str).append(", ");
sb.deleteCharAt(sb.lastIndexOf(","));
sb.append(" from (").append(sql).append(") como");
sb.append(" donde rownum entre ").append(start == 0? 1: start).append(" y ").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(controlador)) {//PostgreSQL
sb.append(sql);
sb.append(" LÍMITE ");
sb.append(límite);
sb.append(" DESPLAZAMIENTO ");
sb.append(inicio);
}
devolver sb.toString();
}
/**
* Crear una instancia del objeto RusultSet en el objeto T
*
* @param<T>
* @param t
* @param rs
*@param sql
* @returnt
* @throwsException
*/
instancia privada estática <T> T (Clase<T> t, ResultSet rs, String sql) arroja una excepción {
Lista<Cadena> columnas = getColumnsFromSelect(sql);
Tobj = t.newInstance();
para (cadena col: columnas) {
intentar{
Campo f = t.getDeclaredField(col);
f.setAccessible(verdadero);
Objeto v = getValue(col, f.getType().getName(), rs);
f.set(obj,v);
}catch(NoSuchFieldException e){
Campo[] campos = t.getDeclaredFields();
para (Campo f: campos) {
Columna columna = f.getAnnotation(Column.class);
if(columna!= nulo && columna.nombre().equals(col)){
f.setAccessible(verdadero);
Objeto v = getValue(col, f.getType().getName(), rs);
f.set(obj, v);
}
}
}
}
objeto de retorno;
}
Objeto estático privado getValue (nombre de columna de cadena, tipo de cadena, conjunto de resultados rs) lanza SQLException {
Objeto obj = nulo;
//System.out.println("name="+f.getName()+", type="+f.getType().getName());
if("java.lang.Integer".equals(tipo) || "int".equals(tipo)) {
obj = rs.getInt(nombredecolumna);
}else if("java.lang.Long".equals(tipo) || "largo".equals(tipo)) {
obj = rs.getLong(nombredecolumna);
}else if("java.lang.Short".equals(tipo)||"short".equals(tipo)) {
obj = rs.getShort(nombredecolumna);
}else if("java.lang.Float".equals(tipo)||"float".equals(tipo)) {
obj = rs.getFloat(nombredecolumna);
}else if("java.lang.Double".equals(tipo)||"doble".equals(tipo)) {
obj = rs.getDouble(nombredecolumna);
}else if("java.lang.Byte".equals(tipo)||"byte".equals(tipo)) {
obj = rs.getByte(nombredecolumna);
}else if("java.lang.Boolean".equals(tipo)||"boolean".equals(tipo)) {
obj = rs.getBoolean(nombredecolumna);
}si no("java.lang.String".equals(tipo)) {
obj = rs.getString(nombredecolumna);
}demás {
obj = rs.getObject(nombredecolumna);
}
//System.out.println("name="+f.getName() +", type="+f.getType().getName()+", value="+(obj == null ? "NULL" : obj.getClass())+",{"+columnName+":"+obj+"}");
objeto de retorno;
}
/**
* Agregar los parámetros en param a pstate
*
* @param pstate
* columnas @param
* @lanza SQLException
*/
privado estático <T> void setParameters(PreparedStatement pstate, Object... params) lanza una excepción {
if (params! = nulo && params.length > 0) {
for (int i = 0; i < params.length; i++) {
Valor del objeto = parámetros[i];
int j = yo + 1;
si (valor == nulo)
pstate.setString(j, "");
si (valor instancia de cadena)
pstate.setString(j, valor (Cadena));
else if (valor instancia de booleano)
pstate.setBoolean(j, valor (booleano));
else if (valor instancia de fecha)
pstate.setDate(j, valor (Fecha));
else if (valor instancia de Double)
pstate.setDouble(j, valor (doble));
else if (valor instancia de Float)
pstate.setFloat(j, valor (flotante));
else if (valor instancia de entero)
pstate.setInt(j, valor (entero));
else if (valor instancia de Long)
pstate.setLong(j, valor (largo));
else if (valor instancia de Short)
pstate.setShort(j, valor (corto));
else if (valor instancia de tiempo)
pstate.setTime(j, valor (Tiempo));
else if (valor instancia de marca de tiempo)
pstate.setTimestamp(j, valor (marca de tiempo));
demás
pstate.setObject(j, valor);
}
}
}
/**
* Agregar los parámetros en param a pstate
*
* @param pstate
* columnas @param
* @param t
* @lanza SQLException
*/
private static <T> void setParameters(PreparedStatement pstate, List<String> columnas, T t) lanza una excepción {
si (columnas! = nulo && columnas.tamaño() > 0) {
para (int i = 0; i < columnas.tamaño(); i++) {
Atributo de cadena = columnas.get(i);
Valor del objeto = nulo;
Clase<?> c = t.getClass();
intentar{
Campo f = c.getDeclaredField(attr);
valor = f.get(t);
} captura (NoSuchFieldException e){
Campo[] campos = c.getDeclaredFields();
para (Campo f: campos) {
Columna columna = f.getAnnotation(Column.class);
if(columna!= null && columna.nombre().equals(attr))
valor = f.get(t);
}
}
int j = yo + 1;
si (valor == nulo)
pstate.setString(j, "");
si (valor instancia de cadena)
pstate.setString(j, valor (Cadena));
else if (valor instancia de booleano)
pstate.setBoolean(j, valor (booleano));
else if (valor instancia de fecha)
pstate.setDate(j, valor (Fecha));
else if (valor instancia de Double)
pstate.setDouble(j, valor (doble));
else if (valor instancia de Float)
pstate.setFloat(j, valor (flotante));
else if (valor instancia de entero)
pstate.setInt(j, valor (entero));
else if (valor instancia de Long)
pstate.setLong(j, valor (largo));
else if (valor instancia de Short)
pstate.setShort(j, valor (corto));
else if (valor instancia de tiempo)
pstate.setTime(j, valor (Tiempo));
else if (valor instancia de marca de tiempo)
pstate.setTimestamp(j, valor (marca de tiempo));
demás
pstate.setObject(j, valor);
}
}
}
/**
* Realizar operación de inserción
*
* @param sql declaración sql precompilada
* @param t parámetros en sql
* @return Número de líneas de ejecución
* @throwsException
*/
public static <T> int insert(String sql, T t) lanza una excepción {
Conexión de conexión = nula;
PreparedStatement pstate = nulo;
int actualizarCount = 0;
intentar {
conexión = getConnection();
Lista<Cadena> columnas = getColumnsFromInsert(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, columnas, t);
updateCount = pstate.executeUpdate();
} finalmente {
recomplacer(conexión, pstate, nulo);
}
devolver actualizaciónCount;
}
/**
* Realizar operación de inserción
*
* @param sql declaración sql precompilada
* @param parámetro parámetro
* @return Número de líneas de ejecución
* @throwsException
*/
public static <T> int insert(String sql, Object... param) lanza una excepción {
Conexión de conexión = nula;
PreparedStatement pstate = nulo;
int actualizarCount = 0;
intentar {
conexión = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
updateCount = pstate.executeUpdate();
} finalmente {
recomplacer(conexión, pstate, nulo);
}
devolver actualizaciónCount;
}
/**
* Realizar operación de actualización
*
* @param sql declaración sql precompilada
* @param t parámetros en sql
* @return Número de líneas de ejecución
* @throwsException
*/
public static <T> int update(String sql, T t) lanza una excepción {
Conexión de conexión = nula;
PreparedStatement pstate = nulo;
int actualizarCount = 0;
intentar {
conexión = getConnection();
Lista<Cadena> columnas = getColumnsFromUpdate(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, columnas, t);
updateCount = pstate.executeUpdate();
} finalmente {
recomplacer(conexión, pstate, nulo);
}
devolver actualizaciónCount;
}
/**
* Realizar operación de actualización
*
*@param sql
* @param parámetro parámetro
* @return Número de líneas de ejecución
* @throwsException
*/
public static <T> int update(String sql, Object... param) lanza una excepción {
Conexión de conexión = nula;
PreparedStatement pstate = nulo;
int actualizarCount = 0;
intentar {
conexión = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
updateCount = pstate.executeUpdate();
} finalmente {
recomplacer(conexión, pstate, nulo);
}
devolver actualizaciónCount;
}
/**
* Consulta de objetos plurales
*
* @param t El tipo de objeto encapsulado por el resultado de la consulta
* @param sql sql precompilado
* @param condiciones de consulta de parámetros
* @return Lista<T>
* @throwsException
*/
public static <T> List<T> queryPlural(Class<T> t, String sql, Object... param) lanza una excepción {
Conexión de conexión = nula;
PreparedStatement stmt = nulo;
Conjunto de resultados rs = nulo;
Lista<T> lista = nueva ArrayList<T>();
intentar {
conexión = getConnection();
stmt = conexión.prepareStatement(sql);
setParameters(stmt, parámetro);
rs = stmt.executeQuery();
mientras (rs.siguiente()) {
lista.add(instancia(t, rs, sql));
}
} finalmente {
recomplacer(conn, stmt, rs);
}
lista de devolución;
}
/**
* Consulta de paginación para objetos plurales.
*
* @param t El tipo de objeto encapsulado por el resultado de la consulta
* @param inicio página de inicio
* @param limita el tamaño de página
* @param sql declaración sql precompilada
* @param parámetro parámetros de consulta
* @throwsException
*/
public static <T> List<T> queryPluralForPagging(Class<T> t, int start, int limit, String sql, Object... param) lanza una excepción {
Conexión de conexión = nula;
PreparedStatement stmt = nulo;
Conjunto de resultados rs = nulo;
Lista<T> lista = nueva ArrayList<T>();
intentar {
conexión = getConnection();
//Añadir código de paginación
sql = addPagingSQL(sql, inicio, límite);
stmt = conexión.prepareStatement(sql);
setParameters(stmt, parámetro);
rs = stmt.executeQuery();
mientras (rs.siguiente()) {
lista.add(instancia(t, rs, sql));
}
} finalmente {
recomplacer(conn, stmt, rs);
}
lista de devolución;
}
/**
* Consultar un solo objeto
*
* @param t objeto de resultado de consulta
* @param sql sql precompilado
* @param parámetro parámetros de consulta
* @retorno T
* @throwsException
*/
public static <T> T querySingular(Class<T> t, String sql, Object... param) lanza una excepción {
T obj = nulo;
Conjunto de resultados rs = nulo;
Conexión de conexión = nula;
PreparedStatement pstate = nulo;
intentar {
conexión = getConnection();
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
rs = pstate.executeQuery();
si (rs.siguiente()) {
obj = instancia(t, rs, sql);
}
} finalmente {
recomplacer(conn, pstate, rs);
}
objeto de retorno;
}
/**
*Consulta de volumen de datos
*
* @param parámetro parámetros de consulta
*@param sql
* @devolver
* @lanza SQLException
* @throws NamingException
*/
public static int queryDataCount (cadena sql, objeto... parámetro)
lanza una excepción {
int recuento de datos = 0;
Conexión de conexión = nula;
PreparedStatement pstate = nulo;
Conjunto de resultados rs = nulo;
intentar {
conexión = getConnection();
sql = agregarCountSQL(sql);
pstate = conn.prepareStatement(sql);
setParameters(pstate, param);
rs = pstate.executeQuery();
si (rs.siguiente()) {
datosCount = rs.getInt("datosCount");
}
} finalmente {
recomplacer(conn, pstate, rs);
}
devolver datosCount;
}
/**
* Comentarios sobre campos de atributos, utilizados para marcar los campos de la base de datos correspondientes al atributo.
* Por ejemplo:
* @Column(nombre="nombre_usuario");
* Cadena nombre de usuario;
* Indica que el campo de la base de datos correspondiente al atributo userName es user_name
*
* Si el atributo es completamente consistente con el campo de la base de datos, no es necesario marcarlo
* @autor xueliang
*/
@Target({ TipoElemento.CAMPO })
@Retención(RetentionPolicy.RUNTIME)
columna pública @interface{
Nombre de cadena() predeterminado "";
}
}