Por desgracia, no he escrito nada durante mucho tiempo recientemente. Debido a las razones laborales, entré en contacto con el marco ORM subyacente desarrollado por la Compañía. Accidentalmente descubrí que al llamar a las operaciones de JDBC, el marco se refiere a SimpleJDBCTemplate en Hibernate. Aquí pensé en una simple encapsulación de JDBC que usé cuando estaba en la universidad. Ahora publicaré el código y lo compartiré contigo:
Clase de configuración: lea el archivo de configuración de la conexión de la base de datos en el mismo paquete, para que sea mejor para las consideraciones de generalización.
paquete com.tly.dbutil; import java.io.ioexception; import java.util.properties; public class Config {private static Properties pro = new Properties (); static {try {// cargar dbconfig.properties File de configuración prop.load (config.class.getResourceasstream ("dbconfig.properties")); } Catch (ioException e) {// tODO Auto Generated BLOCK E.PrintStackTRace (); }} // establecer constante public static final string class_name = prop.getProperty ("class_name"); public static final String database_url = prop.getProperty ("database_url"); public static final String server_ip = prop.getProperty ("server_ip"); public static final String server_port = prop.getProperty ("server_port"); public static final String database_sid = prop.getProperty ("database_sid"); public static final String UserName = prop.getProperty ("nombre de usuario"); public static final string contraseña = prop.getProperty ("contraseña"); }dbconfig.properties: archivo de configuración de la base de datos, también puede usar el formato XML, etc., prestar atención a la ubicación de la llamada del archivo en la clase de configuración
Class_name = com.mysql.jdbc.driverdatabase_url = jdbc: mysqlserver_ip = localhostserver_port = 3306database_sid = empleadousername = rootpassword = 1
Lo siguiente es la clase de base de datos auxiliar DBCONN
paquete com.employees.dbutil; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedStatement; import java.sql.ressset; import java.sql.sqlexception; clase pública dbconn {// tres propiedades y cuatro métodos // tres centrales interfaces; PRIVADO Preparado PSTMT = NULL; Resultset privado rs = nulo; // Cuatro métodos // Método1: cree una conexión a la base de datos Public Connection getConntion () {try {// 1: cargar el controlador de conexión, el principio de reflexión de Java class.forname (config.class_name); // 2: Cree un objeto de interfaz de conexión para obtener el objeto de conexión de la base de datos MySQL. Tres parámetros: URL Connection String Cuenta Password String url = config.database_url+": //"+config.server_ip+":"+config.server_port+"/"+config.database_sid; conn = drivermanager.getConnection (url, config.username, config.password); } catch (ClassNotFoundException e) {E.PrintStackTrace (); } Catch (Sqlexception e) {E.PrintStackTrace (); } return Conn; } // Método2: método para cerrar la base de datos public void CloseConn () {if (rs! = null) {try {rs.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); }} if (pstmt! = null) {try {pstmt.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); }} if (conn! = null) {try {conn.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); }}} // método3: método utilizado específicamente para enviar add, eliminar y modificar las declaraciones public int Execother (preparada PSTMT) {try {// 1. Use el objeto de instrucción para enviar la instrucción SQL int afectado = pstmt.executeupdate (); // 2. Devolver el resultado devuelto } Catch (Sqlexception e) {E.PrintStackTrace (); regreso -1; }} // Método4: se usa específicamente para enviar declaraciones de consulta pública resultset ExecQuery (preparada PSTMT) {try {// 1. Use el objeto de instrucción para enviar la instrucción SQL rs = pstmt.executeQuery (); // 2. Devolver el resultado return rs; } Catch (Sqlexception e) {E.PrintStackTrace (); regresar nulo; }}}Por lo general, el uso del código anterior puede resolver algunas aplicaciones CRUD simples, pero hay muchas restricciones. Por ejemplo, cada vez que el programa tome una conexión, aumentará la carga del sistema, no hay transacciones, ni un plato de datos, etc. Hoy vi a un amigo en el parque escribiendo un artículo en el jardín usando la reflexión para resolver CRUD directamente en los parámetros de los objetos. He escrito esto antes, pero no lo he terminado. Principalmente quiero escribir un dbutil general. Finalmente, lo estudié y descubrí que se está acercando a la SimpleJDBCTemplate en Hibernate, así que fui a ver el código fuente de Hibernate. Además, hubo algunas cosas durante ese tiempo, y no tuve tiempo, así que dejé este asunto inactivo. Ahora compensa esto y lo reviso por mí mismo.
Clase basada
paquete com.employees.dao; import java.io.inputstream; import java.lang.reflect.method; import java.lang.reflect.parameterizedType; import java.sql.connection; import java.sql.date; import java.sql.preparedstatement; import java.sqlet; import; java.util.arrayList; import java.util.iterator; import java.util.list; import com.employees.dbutil.dbconn; public class BeedAo <t> {dbconn Conn = new dbconn (); Conexión de conexión privada = nulo; @SupessWarnings ("sin usar") Clase privada <T> PersistentClass; @SupplesSwarnings ("sin verificar") public BasedAo () {initConnection (); // Get Tipo Parametrizado ParameterizedType Type = (ParameterizedType) getClass (). GetGenericsuperClass (); persistentClass = (clase <t>) type.getActualTyPearGuments () [0]; } / *** Obtener conexión de base de datos* / public void initConnection () {Connection = conn.getConntion (); } /** * save * /public void save (t entity) lanza la excepción {// sql instrucción, inserta en el nombre de la tabla (string sql = "insertar en" + entity.getClass (). GetSimplename (). TOlowerCase () + "("; // Objetivo de todos los métodos con cadena de cadena <Method> list = this.matchPOTOTHODS (entidad, "enterada, iterator; = list.Iterator (); // Split de orden de campo Insertar en el nombre de la tabla (id, nombre, correo electrónico, while (iter.hasnext ()) {método método = iter.next (); sql + = método.getName (). subcontratación (3) .tolowercase () + ",";} // Eliminar el último, símbolo de inserción en el nombre de la tabla (id, nombre, correo electrónico) sql.substring (0, sql.lastindexof (",")) +") valores ("; // Stand up Precompiled SQL Insertar en el nombre de tabla (id, nombre, correo electrónico) valores (?,?,?, para (int j = 0; j <list.size (); j ++) {sql += "?,;} // eliminar la declaración de la última sql, symbol, symbol, symball, Symball, Symbol, Symbol Tea nombre (id, nombre, correo electrónico) valores (?,?,?); // Obtenga la referencia al objeto Precompilado Declaración de estaticación de preparación = Connection.PrepareStatement (SQL); int i = 0; // Mueve el puntero a la última línea del iterador a la primera línea. iter = list.iterator (); while (iter.hasnext ()) {método método = iter.next (); // Esto inicialmente determina el tipo de valor de retorno, porque algunos formatos de valor de campo deben cambiarse cuando se almacenan en la base de datos. Por ejemplo, String, la instrucción SQL es '"+ABC+"' if (Method.getReturnType (). GetSimpLename (). IndexOf ("String")! = -1) {Declarat.SetString (++ I, this.getString (Method, entidad)); } else if (método.getReturnType (). getSimplename (). indexOf ("date")! = -1) {Declary.SetDate (++ i, this.getDate (método, entidad)); } else if (método.getReturnType (). getSimplename (). indexOf ("inputStream")! = -1) {Declary.setasciistReam (++ i, this.getBlob (método, entidad), 1440); } else {Declary.SetInt (++ i, this.getInt (método, entidad)); }} // ejecutar conn.execother (declaración); // Closeconn (); } / ** * modificar * / public void Update (t entidad) lanza la excepción {string sql = "update" + entity.getClass (). GetSimplename (). TOlowerCase () + "set"; // Get All Get Method Objects Collections de esta lista de clases <Method> list = this.matchPOJomethods (entidad, "get"); // Objeto de método temporal, responsable de iterar el objeto del método de moda. Método tempMethod = null; // Debido a que la identificación no es necesaria para modificarse al modificar, agregar parámetros en orden debe mover la ID al final. Método idmethod = null; Iterador <method> iter = list.iterator (); while (iter.hasnext ()) {tempMethod = iter.next (); // Si el nombre del método contiene una cadena de ID y la longitud es 2, se considera una ID. if (tempMethod.getName (). LastIndexOf ("id")! = -1 && tempMethod.getName (). Substring (3) .Length () == 2) {// Guarde el objeto del campo ID en una variable y eliminarlo en la colección. idmethod = tempMethod; iter.remove (); // Si se elimina el nombre del método y la cadena Set/Get String es incompatible con POJO + "ID" (Insensible en el caso), se considera una id} else if ((entity.getClass (). GetSimplename () + "id"). EqualsignorEcase (tempMethod.getName (). Sustring (3))) {idmethod = TempMethod; iter.remove (); }} // Mueve el puntero iterativo a la primera posición iter = list.iterator (); while (iter.hasnext ()) {tempMethod = iter.next (); sql + = tempMethod.getName (). Subcans (3) .tolowerCase () + "=?,"; } // Eliminar el último, símbolo sql = sql.substring (0, sql.lastindexof (",")); // Agregar condición sql + = "where" + idmethod.getName (). Substring (3) .tolowerCase () + "=?"; // El empalme SQL se completa, imprima la declaración SQL System.out.println (SQL); Declaración de preparación = this.connection.PrepareStatement (SQL); int i = 0; iter = list.iterator (); while (iter.hasnext ()) {método método = iter.next (); // Esto inicialmente determina el tipo de valor de retorno, porque algunos formatos de valor de campo deben cambiarse cuando se almacenan en la base de datos, por ejemplo, String, la instrucción SQL es '"+ABC+"' if (Method.getReturnType (). GetSimpLename (). IndexOf ("String")! = -1) {Declarat.setString (++ I, este.getstring (Method, Method, Method, Method););););); } else if (método.getReturnType (). getSimplename (). indexOf ("date")! = -1) {Declary.setString (++ i, this.getString (método, entidad)); } else if (método.getReturnType (). getSimplename (). indexOf ("date")! = -1) {Declary.SetDate (++ i, this.getDate (método, entidad)); } else if (método.getReturnType (). getSimplename (). indexOf ("inputStream")! = -1) {Declary.setasciistReam (++ i, this.getBlob (método, entidad), 1440); } else {Declary.SetInt (++ i, this.getInt (método, entidad)); }} // Agregar valor al campo ID if (idmethod.getReturnType (). GetSimplename (). IndexOf ("string")! = -1) {Declary.setString (++ i, this.getString (idmethod, entidad)); } else {Declary.SetInt (++ i, this.getInt (idmethod, entidad)); } // ejecutar sql instrucciones.executeUpdate (); // cierre la declaración de objeto precompilado.close (); // cierre la conexión.close (); } / ** * Eliminar * / public void Eliminar (entidad t) lanza la excepción {String sql = "delete de" + entity.getClass (). GetSimplename (). Tolowercase () + "donde"; // Almacenamiento del objeto de campo con el método de cadena "id" idmethod = null; // Obtener objeto de campo con cadena "ID" List <Method> list = this.matchPOJomethods (entidad, "get"); Iterador <method> iter = list.iterator (); while (iter.hasnext ()) {método tempMethod = iter.next (); // Si el nombre del método contiene la cadena de ID y la longitud es 2, se considera una ID. if (tempMethod.getName (). LastIndexOf ("id")! = -1 && tempMethod.getName (). Substring (3) .Length () == 2) {// Guarde el objeto del campo ID en una variable y eliminarlo en el conjunto. idmethod = tempMethod; iter.remove (); // Si se elimina el nombre del método y la cadena Set/Get String es incompatible con POJO + "ID" (Insensible en caso), se considera una id} else if ((entity.getClass (). GetSimplename () + "id"). EqualsignorEcase (tempMethod.getName (). Sustring (3)))) {idmethod = TEMPMETHOD; iter.remove (); }} sql + = idmethod.getName (). Substring (3) .tolowerCase () + "=?"; Declaración de preparación = this.connection.PrepareStatement (SQL); // Agregar valor al campo ID int i = 0; if (idmethod.getReturnType (). getSimplename (). indexOf ("string")! = -1) {Declary.setString (++ i, this.getString (idmethod, entity)); } else {Declary.SetInt (++ i, this.getInt (idmethod, entidad)); } // ejecutar conn.execother (declaración); // Closeconn (); } / *** consulta por id* / public t findByid (objeto objeto) lanza la excepción {string sql = "select* de" + persistentClass.getSimplename (). TOlowerCase () + "Where"; // Use el constructor de la subclase para obtener el tipo específico del tipo parametrizado. Por ejemplo, a base de <t>, es decir, obtenga el tipo específico de entidad t = persistentClass.newinStance (); // almacenamiento del objeto de método que almacena la clave principal de POJO (o la tabla que está operando) método idmethod = null; List <setmet> list = this.matchPOJomethods (entidad, "set"); Iterador <method> iter = list.iterator (); // Filtrar para obtener el objeto del método mientras (iter.hasnext ()) {método tempMethod = iter.next (); if (tempMethod.getName (). indexOf ("id")! = -1 && tempMethod.getName (). Substring (3) .Length () == 2) {idmethod = tempMethod; } else if ((entity.getClass (). getSimplename () + "id"). EqualSignorEcase (tempMethod.getName (). sustring (3))) {idmethod = tempMethod; }} // La primera letra se convierte en SQL += idmethod.getName (). Substring (3,4) .tolowercase () +idmethod.getName (). Substring (4) +"=?"; // Después de la declaración de encapsulación, imprima la instrucción SQL System.out.println (SQL); // Obtener la Conexión de la instrucción preparada = this.connection.prepareStatement (SQL); // juzga el tipo de id if (objeto instanceof integer) {Declary.SetInt (1, (Integer) Object); } else if (objeto instanciaf string) {Declary.setString (1, (string) objeto); } // Ejecutar SQL para obtener el resultado de los resultados de la consulta. ResultSet rs = conn.execquer (declaración); // registrar, registrar bucles en el número de campos int i = 0; // apunte el puntero a la primera línea del iterador iterator = list.iterator (); // encapsulate while (rs.next ()) {while (iter.hasnext ()) {método método = iter.next (); if (método.getParametertyPes () [0] .getSimplename (). IndexOf ("String")! = -1) {// Porque en el conjunto de listas, el orden del objeto del método a recuperar es inconsistente con el orden del campo de la base de datos (por ejemplo: el primer método de lista es set Date, y el valor de la database "123" en orden) nombre. this.setString (método, entidad, rs.getString (método.getName (). Substring (3) .tolowerCase ())); } else if (método.getParametertypes () [0] .getSimplename (). indexOf ("date")! = -1) {this.setDate (método, entidad, rs.getDate (método.getName (). substring (3) .tolowercase ())); } else if (método.getParametertyPes () [0] .getSimplename (). indexOf ("inputStream")! = -1) {this.setBlob (método, entidad, rs.getBlob (método.getName (). Substring (3) .tOlowerCase ()). GetBinaryStream ()); } else {this.setInt (método, entidad, rs.getInt (método.getName (). Substring (3) .tolowerCase ())); }}} // Cerrar el resultado establecido rs.close (); // cierre la declaración de objeto precompilado.close (); entidad de retorno; } /*** Filtre todos los objetos de método con cadenas entrantes en la clase POJO actual y devuelva la colección de listas. */Private List <Method> MatchPoJomethods (T Entity, String MethodName) {// Obtener todos los objetos de método POJO actual método [] métodos = entity.getClass (). getDeclaredMethods (); // List contenedor almacena todos los objetos de método con la lista de cadenas <método> list = new ArrayList <Method> (); // Filtrar todos los objetos del método con las cadenas Get en la clase POJO actual y almacenarlos en el contenedor de lista para (int index = 0; index <métodss.length; index ++) {if (métodos [index] .getName (). IndexOf (métode)! = -1) {list.Add (métodos [index]); }} lista de retorno; } /*** El método devuelve el valor de la instrucción SQL cuando el tipo es int o entero. Correspondiente a get */ public integer getInt (método método, entidad t) arroja excepción {return (integer) método.invoke (entidad, nuevo objeto [] {}); } /*** El método devuelve el valor de ensayo de la instrucción SQL cuando el tipo es cadena. Por ejemplo, 'ABC', correspondiente a Get */ public String getString (método método, t entidad) lanza la excepción {return (string) método.invoke (entidad, nuevo objeto [] {}); } /*** El método devuelve el valor ensamblado de la instrucción SQL cuando el tipo de blob. Correspondiente a get */ public inputStream getBlob (método método, entidad t) arroja excepción {return (inputStream) método.invoke (entidad, nuevo objeto [] {}); } / ** * El método devuelve el valor ensamblado de la instrucción SQL cuando el tipo de fecha, correspondiente a Get * / public Date GetDate (Método Método, Entidad T) lanza la excepción {return (date) Method.invoke (entidad, nuevo objeto [] {}); } / ** * Cuando el tipo de parámetro es entero o int, establecer parámetros para el campo Entity, correspondiente a SET * / public Integer setInt (método método, entidad t, entero arg) lanza la excepción {return (integer) Method.invoke (entidad, nuevo objeto [] {arg}); } / ** * Cuando el tipo de parámetro es cadena, establecer parámetros para el campo Entity, correspondiente a SET * / public String setString (método método, entidad t, string arg) lanza la excepción {return (string) método.invoke (entidad, nuevo objeto [] {arg}); } / ** * Cuando el tipo de parámetro es InputStream, SET Parámetros para el campo Entity, correspondiente a SET * / public InputStream SetBlob (Método del método, entidad T, InputStream Arg) lanza la excepción {returnStream) método.Invoke (entidad, nuevo objeto [] {arg}); } / ** * Cuando el tipo de parámetro es fecha, establecer parámetros para el campo Entity, correspondiente a SET * / public feche setDate (método método, entidad t, date arg) lanza la excepción {return (date) método.invoke (entidad, nuevo objeto [] {arg}); }}EmployeeSdao hereda a base de base y puede usar directamente el método de clase principal, agregando la reutilización del código
paquete com.employees.dao; import java.util.arrayList; import java.util.list; import com.employees.po.employees; public class EmployeeeDao extiende a base a base a la base a la base a la información de la información de los empleados. devolver verdadero; } // Agregar información de los empleados a la tabla Lista pública <Espúms> AddEmployee (int id) Lanza la excepción {List <Espaissements> lstemployee = new ArrayList <Espaissers> (); Empleados empleados = findById (id); // Cargue los datos actualmente encerrados en el objeto lstemployes.Add (empleados); devolver lstemployes; } public void DeleteMp (Entidad de los empleados finales) lanza la excepción {this.delete (entidad); } public void UpdateEmp (Entidad de los empleados finales) lanza la excepción {this.update (entidad); }}No publicaré el código de la capa PO, ahora use JUnit4 para hacer una prueba
paquete com.employees.dao; import org.junit.test; import com.employees.po.employees; public class empleadosDaoTest {@test public void testAdd () lanza la excepción {empleados emp = nuevos empleados (); emp.setpName ("tly"); emp.setpsex ("macho"); emp.setpBeliefs ("xxxxx"); Emp.SetPaddr ("Tianhe"); Emp.SetPhobby ("Jugar baloncesto"); emp.setPsubject ("computadora"); Emp.SetPtel ("123456"); EmployeeSdao Dao = New EmployeeDao (); Dao.Addemployes (EMP); } @Test public void topupdate () lanza la excepción {EmployeeDao Dao = new EmployesDao (); Empleados emp = dao.findbyid (14); Emp.SetPtel ("9999999"); dao.updateemp (emp); } @Test public void testDelete () lanza la excepción {EmployeeDao Dao = New EmployeeSDao (); Empleados emp = dao.findbyid (15); dao.deleteemp (emp); }}Después de las pruebas, estos tres métodos pueden ejecutarse normalmente, el tiempo se apresura. Algunos códigos son utilizados por otros amigos. Es posible que algunos lugares no se consideren muy completos o algunos códigos serán redundantes. La operación General Crud en BasedAo no se ha escrito en su totalidad. Si algún amigo está interesado, puede volver a escribirlo, como consulta, operación por lotes, etc. Si la prueba pasa, recuerde enviarme una copia, jaja
El paquete auxiliar JDBC (ejemplo) de JDBC (ejemplo) de JDBC (ejemplo) (ejemplo) es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.