Infelizmente, não escrevi nada há muito tempo recentemente. Por razões de trabalho, entrei em contato com a estrutura ORM subjacente desenvolvida pela empresa. Achei acidentalmente que, ao ligar para as operações do JDBC, a estrutura refere -se ao simplesjdbctemplate no hibernado. Aqui pensei em um simples encapsulamento JDBC que usei quando estava na faculdade. Agora vou postar o código e compartilhar com você:
Classe de configuração: leia o arquivo de configuração de conexão do banco de dados no mesmo pacote, para que seja melhor para considerações de generalização.
pacote com.tly.dbutil; importar java.io.ioException; importar java.util.properties; public class config {private static Properties Prop = new Properties (); estático {try {// carregar dbconfig.properties Arquivo de configuração Prop.load (config.class.getResourceasStream ("dbconfig.properties")); } catch (ioexception e) {// TODO GATO GENERADO AUTOMENTADO BLOCO E.PRINTSTACKTRACE (); }} // defina 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 ("nome de usuário"); public static final string senha = prop.getProperty ("senha"); }dbconfig.properties: arquivo de configuração do banco de dados, você também pode usar o formato XML, etc., preste atenção à localização da chamada do arquivo na classe Config
Class_name = com.mysql.jdbc.driverdatabase_url = jdbc: mysqlserver_ip = locicalHostserver_port = 3306database_sid = funcionáriosusename = rootpassword = 1
Em seguida é a classe Auxiliar de conexão do banco de dados DBConn
pacote com.employees.dbutil; importar java.sql.connection; importar java.sql.driverManager; importar java.sql.preparedStatement; importar java.sql.resultset; import java.SQL.SqLexception; Public Class Dbconn { Private PreparedStatement Pstmt = NULL; Resultado privado rs = nulo; // quatro métodos // Método1: Crie uma conexão com a conexão pública do banco de dados getConntion () {try {// 1: carregue o driver de conexão, Java Reflection Princípio Class.ForName (config.class_name); // 2: Crie um objeto de interface de conexão para obter o objeto de conexão do banco de dados MySQL. Três parâmetros: URL Connection String Senha String 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 (); } retornar Conn; } // Method2: Método para fechar o banco de dados public void closeconn () {if (rs! = null) {try {rs.close (); } catch (sqLexception e) {e.printStackTrace (); }} if (pstmt! = null) {tente {pstmt.close (); } catch (sqLexception e) {e.printStackTrace (); }} if (conn! = null) {try {Conn.Close (); } catch (sqLexception e) {e.printStackTrace (); }}} // Método3: Método usado especificamente para enviar add, excluir e modificar instruções public int execotador (preparado estatamento pstmt) {try {// 1. Use o objeto de instrução para enviar a instrução sql int afetada = pstmt.executeUpdate (); // 2. Devolver o resultado retornou o afetado; } catch (sqLexception e) {e.printStackTrace (); retornar -1; }} // Method4: Usado especificamente para enviar instruções de consulta ExecQuery PublicSet (preparado PSTMT) {try {// 1. Use o objeto de instrução para enviar a instrução SQL RS = pstmt.executeQuery (); // 2. Retornar o resultado retornar Rs; } catch (sqLexception e) {e.printStackTrace (); retornar nulo; }}}Geralmente, o uso do código acima pode resolver alguns aplicativos CRUD simples, mas existem muitas restrições. Por exemplo, toda vez que o programa leva uma conexão, ele aumentará o ônus do sistema, não há transações, nenhuma fonte de dados, etc. Hoje eu vi um amigo no parque escrevendo um artigo no jardim usando a reflexão para resolver o CRUD diretamente nos parâmetros de objeto. Eu já escrevi isso antes, mas não terminei. Eu quero principalmente escrever um dbutil geral. Por fim, estudei e descobri que ele está se aproximando do simplesjdbctemplate em Hibernate, então fui ver o código -fonte de hibernação. Além disso, houve algumas coisas durante esse tempo, e eu não tive tempo, então deixei esse assunto ocioso. Agora eu compenso essa coisa e reviso -a para mim.
Classe baseada em base
pacote com.employees.dao; importar java.io.inputStream; importar java.lang.reflect.method; importar java.lang.reflect.parameterizedtype; import java.sql.connection; import java.sql.date; import java.sql.sql.sQl.sPered; java.util.ArrayList; importar java.util.iterator; importar java.util.list; importar com.employees.dbutil.dbconn; public class BasedAo <t> {dbconn conn = new dbconn (); conexão privada conexão = nulo; @Suppresswarnings ("não utilizados") Classe privada <T> persistente; @Suppresswarnings ("desmarcado") public BasedAo () {initConnection (); // obtém tipo parametrizado tipo parametrizeType type = (parameterizedtype) getClass (). GetGenericsuperclass (); PersistentClass = (classe <T>) tipo.getActualTyPearguments () [0]; } / *** Obtenha conexão com o banco de dados* / public void initConnection () {Connection = Conn.getConntion (); } /** * Salvar * /public void salvar (entidade t) lança Exceção {// instrução sql, insira no nome da tabela (string sql = "insert in" + entity.getclass (). GetSImpleName (). TolowerCase () + "("; // obtenha o objeto de todos os métodos com string (). iter = list.iterator (); sql.substring (0, sql.lastindexOf (",")) +") valores ("; // Sump up up pré -compilado SQL Inserir inserção no nome da tabela (id, nome, email) valores (?,? Nome (id, nome, email) valores (?,?); // Obtenha a referência ao objeto pré -compilado Preparadostatement Declarect = Connection.Preparestatement (SQL); int i = 0; // Mova o ponteiro para a última linha do iterador para a primeira linha. iter = list.iterator (); while (iter.hasnext ()) {método método = iter.Next (); // Isso determina inicialmente o tipo de valor de retorno, porque alguns formatos de valor de campo precisam ser alterados quando armazenados no banco de dados. Por exemplo, String, a instrução SQL é '"+abc+"' if (method.getRenterntype (). GetSImplename (). } else if (method.getRettype (). getSImplename (). } else if (method.getRettype (). getSImplename (). } else {declaration.setInt (++ i, this.getInt (método, entidade)); }} // Execute conn.execother (instrução); // closeConn (); } / ** * Modify * / public void update (entidade t) lança Exceção {string sql = "update" + entity.getclass (). GetSImpleName (). ToLowerCase () + "set"; // Get All Get Method Objects Collections desta lista de classe <Sodhod> list = this.matchpojomethods (entidade, "get"); // Objeto de método temporário, responsável por iterar o objeto do método da moda. Método tempmethod = null; // Como o ID não é necessário para ser modificado ao modificar, a adição de parâmetros para a ordem deve mover o ID para o final. Método idMethod = null; Iterator <Sodhod> iter = list.iterator (); while (iter.hasnext ()) {tempmethod = iter.Next (); // Se o nome do método contiver uma sequência de identificação e o comprimento for 2, é considerado um ID. if (tempMethod.getName (). LastIndexOf ("id")! = -1 && tempMethod.getName (). Substring (3) .Length () == 2) {// salve o objeto do campo de identificação em uma variável e a exclua na coleção. idMethod = tempmethod; iter.remove (); // Se o nome do método for removido e a sequência de set/get for incompatível com Pojo + "ID" (insensível ao caso), é considerado um id} else if ((entity.getClass (). GetSplename () + "id"). (Idsignorecase (tempmethod.getName (). Substring (3)). iter.remove (); }} // mova o ponteiro iterativo para a primeira posição iter = list.iterator (); while (iter.hasnext ()) {tempmethod = iter.Next (); sql + = tempmethod.getName (). Substring (3) .tolowerCase () + "=?,"; } // Remova o último, símbolo sql = sql.substring (0, sql.lastIndexOf (",")); // Adicionar condição sql + = "where" + idMethod.getName (). Substring (3) .tolowerCase () + "=?"; // O splicing SQL é concluído, imprima SQL Declaration System.out.println (SQL); Declaração de estatamento preparado = this.Connection.Preparestatement (SQL); int i = 0; iter = list.iterator (); while (iter.hasnext ()) {método método = iter.Next (); // Isso determina inicialmente o tipo de valor de retorno, porque alguns formatos de valor de campo precisam ser alterados quando armazenados no banco de dados, por exemplo, String, a instrução SQL é '"+abc+"' if (métod.getrendrtype (). GetSplename (). } else if (method.getRettype (). getSImpleName (). } else if (method.getRettype (). getSImplename (). } else if (method.getRettype (). getSImplename (). } else {declaration.setInt (++ i, this.getInt (método, entidade)); }} // Adicione o valor ao campo de identificação se (idMethod.getReturntype (). GetSImplename (). } else {declaration.setInt (++ i, this.getInt (idmethod, entidade)); } // Executa a instrução SQL.ExecuteUpdate (); // fechar a instrução Objeto pré -compilado.close (); // fechar o conexão.close (); } / ** * delete * / public void Delete (entidade t) lança Exceção {string sql = "delete de" + entity.getclass (). GetSImplename (). ToLowerCase () + "onde"; // armazenando objeto de campo com string "id" método idMethod = null; // Obter objeto de campo com string "ID" List <Sodhod> list = this.matchpojomethods (entidade, "get"); Iterator <Sodhod> iter = list.iterator (); while (iter.hasnext ()) {método tempmethod = iter.Next (); // Se o nome do método contiver a sequência de ID e o comprimento for 2, é considerado um ID. if (tempMethod.getName (). LastIndexOf ("id")! = -1 && tempMethod.getName (). Substring (3) .Length () == 2) {// salve o objeto do campo de identificação em uma variável e a exclua no conjunto. idMethod = tempmethod; iter.remove (); // Se o nome do método for removido e o conjunto/get string for incompatível com Pojo + "ID" (insensível ao caso), é considerado um id} else if ((entity.getclass (). GetSplename () + "id"). iter.remove (); }} sql + = idmethod.getName (). substring (3) .tolowerCase () + "=?"; Declaração de estatamento preparado = this.Connection.Preparestatement (SQL); // Adicione valor ao campo de identificação int i = 0; if (idMethod.getRettype (). getSImplename (). } else {declaration.setInt (++ i, this.getInt (idmethod, entidade)); } // execute conn.execother (instrução); // closeConn (); } / *** consulta por id* / public t findById (objeto objeto) lança a exceção {string sql = "selecione* de" + persistentClass.getSimplename (). TolowerCase () + "where"; // Use o construtor da subclasse para obter o tipo específico do tipo parametrizado. Por exemplo, baseado em <t>, ou seja, obtenha o tipo específico de entidade t = persistentclass.newinstance (); // armazenamento O objeto Método que armazena a chave primária do POJO (ou a tabela que está sendo operada) Método IDMETHOD = NULL; List <Sodhod> list = this.matchpojomethods (entidade, "set"); Iterator <Sodhod> iter = list.iterator (); // filtre para obter o objeto Método While (iter.hasNext ()) {Method 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 (). substring (3))) {idmethod = tempmethod; }} // A primeira letra é convertida em minúsculo sql += idmethod.getName (). Substring (3,4) .tolowercase () +idmethod.getName (). Substring (4) +"=?"; // Após a declaração de encapsulamento, imprima o SQL Declaration System.out.println (SQL); // obtenha a instrução de conexão preparada estatement = this.connection.preparestatement (sql); // julgar o tipo de id if (objeto instância do número inteiro) {declaration.setInt (1, (inteiro) objeto); } else if (object instanceof string) {instrutation.SetString (1, (string) objeto); } // Execute o SQL para obter o conjunto de resultados de consulta. ResultSet rs = Conn.ExecQuery (instrução); // Registre -se, registre loops no número de campos int i = 0; // apontar o ponteiro para a primeira linha do iterador iter = list.iterator (); // encapsular while (rs.Next ()) {while (iter.hasNext ()) {método Method = iter.Next (); if (métod.getParameterTypes () [0] .getSimpleName (). nome. this.SetString (método, entidade, rs.getString (métod.getName (). Substring (3) .tolowerCase ())); } else if (method.getParameterTypes () [0] .getSimpleName (). IndexOf ("Date")! = -1) {this.setDate (método, entidade, rs.getDate (method.getName (). Substring (3) .tolowerCase ())); } else if (métod.getParameterTypes () [0] .getSimpleName (). } else {this.setInt (método, entidade, rs.getInt (métod.getName (). substring (3) .tolowerCase ())); }}} // Fechar o conjunto de resultados rs.close (); // fechar a instrução Objeto pré -compilado.close (); entidade de retorno; } /*** Filtre todos os objetos do método com strings recebidos na classe Pojo atual e retorne a coleção da lista. */Private List <Sodhod> MatchPojomethods (entidade t, string métodName) {// Obtenha todos os objetos do método POJO atuais métodos [] métodos = entity.getClass (). getDecLaredMethods (); // Listar contêiner armazena todos os objetos de método com a lista de strings <Método> list = new ArrayList <Sodhod> (); // Filtre todos os objetos do método com seqüências de caracteres na classe Pojo atual e armazenam -os no contêiner da lista para (int index = 0; index <methods.length; index ++) {if (métodos [index] .getName (). Indexof (MethodName)! = -1) {list.add (Methods [index]); }} Lista de retorno; } /*** O método retorna o valor da instrução SQL quando o tipo é int ou inteiro. Correspondente para obter */ public integer getInt (método do método, entidade t) lança exceção {return (integer) método.invoke (entidade, novo objeto [] {}); } /*** O método retorna o valor da assembléia da instrução SQL quando o tipo é string. Por exemplo, 'ABC', correspondente para obter */ public String getString (método do método, entidade t) lança exceção {return (string) métod.invoke (entidade, new objeto [] {}); } /*** O método retorna o valor da instrução SQL quando o tipo de blob. Correspondente para obter */ public inputStream getBlob (método do método, entidade t) lança Exceção {return (inputStream) método.invoke (entidade, new Object [] {}); } / ** * O método retorna o valor montado da instrução SQL quando o tipo de data, correspondente para obter * / public Date GetDate (método do método, entidade t) lança a exceção {return (date) method.invoke (entidade, novo objeto [] {}); } / ** * Quando o tipo de parâmetro é inteiro ou int, defina parâmetros para o campo da entidade, correspondendo a definir * / public integer setInt (método do método, entidade t, inteiro arg) lança exceção {return (integer) método.inVoke (entidade, new Object [] {arg}); } / ** * Quando o tipo de parâmetro é string, defina parâmetros para o campo da entidade, correspondendo ao set * / public String setString (método do método, entidade t, string arg) lança a exceção {return (string) método.invoke (entidade, novo objeto [] {arg}); } / ** * Quando o tipo de parâmetro é inputStream, defina parâmetros para o campo da entidade, correspondendo ao set * / public inputStream setBlob (método do método, entidade t, inputStream arg) lança exceção {return (inputStream) método.invoke (entidade, novo objeto [] {arg}); } / ** * Quando o tipo de parâmetro é a data, defina parâmetros para o campo da entidade, correspondendo ao set * / public Date setDate (método do método, entidade t, date arg) lança a exceção {return (date) método.invoke (entidade, novo objeto [] {arg}); }}Funcionários que herda a base de base e pode usar diretamente o método da classe pai, adicionando reutilização de código
pacote com.employees.dao; importar java.util.ArrayList; importar java.util.list; importar com.employees.po.employes; public class Funcionáriosdao estende -se baseado em <funcionários> {// operação de informações sobre os funcionários públicos boolean addemployes (funcionários finais) excepção (funcionários); retornar true; } // Adicione as informações do funcionário à tabela Lista pública <Puseis> addEmployees (int id) lança exceção {list <furyws> LotSomployees = new ArrayList <Gursion> (); Funcionários funcionários = findbyId (id); // Carregar os dados atualmente fechados no objeto lystemployees.add (funcionários); retornar LotSomployeees; } public void DeLeteemp (entidade final dos funcionários) lança exceção {this.Delete (entidade); } public void updateemp (entidade dos funcionários finais) lança exceção {this.update (entidade); }}Não vou postar o código da camada PO, agora use o Junit4 para fazer um teste
pacote com.employees.dao; importar org.junit.test; importar com.employees.po.employees; public class FuncionáriosDaotest {@test public void testadd () lança exceção {funcionários emp = new Funcionários (); Emp.setpName ("Tly"); Emp.setpsex ("masculino"); Emp.setpBeliefs ("xxxxx"); Emp.setPaddr ("Tianhe"); Emp.setPhobby ("Play Basketball"); Emp.setPSubject ("Computer"); Emp.setpTel ("123456"); Funcionário DAO = New Funcionáriosdao (); dao.addemployees (EMP); } @Test public void testUpDate () lança exceção {funcionáriodao dao = new Funcionáriodao (); Funcionários emp = dao.findbyId (14); Emp.setpTel ("999999"); Dao.Updateemp (EMP); } @Test public void testDelete () lança exceção {funcionáriosdaoo dao = new Funcionáriodao (); Funcionários emp = dao.findbyId (15); Dao.DeleteEmp (EMP); }}Após o teste, esses três métodos podem ser executados normalmente, o tempo está correndo. Alguns códigos são usados por outros amigos. Alguns lugares podem não ser considerados muito abrangentes ou alguns códigos serão redundantes. A operação geral do CRUD em Baseao não foi escrita na íntegra. Se algum amigo estiver interessado, você pode escrevê -lo novamente, como consulta, operação em lote etc. Se o teste passar, lembre -se de me enviar uma cópia, haha
A embalagem auxiliar JDBC acima acima e geral é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.