As informações do aluno neste exemplo adicionam transações ao banco de dados (a transação pode ser enviada, as transações podem ser revertidas e melhoradas com threads locais)
Página principal Index.jsp
<%@ Page Language = "java" import = "java.util. value = "/Query"/>? cmd = Query '> Ver informações do aluno </a> <br> <br> <!-<a href = "<c: url value ='/StudServlet? cmd = salvar '/>"> Informações do aluno ADD </a>-> <h2> Student Information </h2> <form? Nome: <input type = "text" name = "name"/> <br> <br> <fieldset style = "borda: sólido; borda-cor: vermelha; largura: 250px;"> <legend> book1 </legend> título: <input type = "text" name = "book"/> <br> <br> <briels> preço: <input = "" style = "borda: sólido; cor de borda: verde; largura: 250px;"> <legend> livro 2 </legend> título: <input type = "text" name = "book"/> <br> <br> Preço: <br) srim "name =" price "/> </fieldset> <br> <br> <nput =" srim "srim" name = "price"/> </fields> <br> <br> <br = "typen" srim "srim" sigl = "price"/> </fields> <br> <br> <br = "typen" srim "srim"/"/fieldsht> <br) <br) </body> </html>
Ferramenta para obter conexão com o banco de dados ConnUtils5.java
pacote cn.hncu.utils; importar java.lang.reflect.invocationHandler; importar java.lang.reflect.method; importar java.lang.reflect.proxy; importação java.sql.connection; import java.sql.ndriverManager; java.util.properties; classe pública ConnUtils5 {// Objeto de gerenciamento de threads local, usado para implementar: a conexão obtida pelo mesmo thread é o mesmo threadlocal estático privado <conexão> t = novo threadlocal <neconnect> (); Lista estática final privada <Cneconoming> pool = new ArrayList <neconned> (); private static int tamanho; // leia private ConnUtils5 () {} static {Propriedades p = new Properties (); tente {// O método a seguir pode ler o arquivo de recursos no ClassPath em um projeto Java Pure, mas o projeto Javaee não pode ser lido. Porque o TomCat alterou o carregador de classe padrão do sistema //p.load (classLoadler.getSystemclassloader (). GetSystemResourceasStream ("jdbc.properties")); // P.Load (ClassLoader.GetSystemResourCeasStream ("JDBC.Properties")); // Leia o arquivo de recursos sob o caminho de classe do projeto da web, use -o para P.load (ConnUtils3.class.getclassloader (). GetResourceasStream ("jdbc.properties")); Driver string = p.getProperty ("driver"); String url = p.getProperty ("url"); Nome da string = P.GetProperty ("Nome de usuário"); String pwd = p.getProperty ("senha"); String ssize = p.getProperty ("size"); Tamanho = integer.parseint (ssize); Class.ForName (Driver); para (int i = 0; i <tamanho; i ++) {conexão final con = driverManager.getConnection (url, nome, PWD); System.out.println ("con =="+con); // altere o método conn.close () // use o modo proxy para gerar uma versão aprimorada do objeto Conn, interceptar e alterar seu método Close () para objeto ncon = proxy.newproxyInstance (ConnUtils.Class. Programa (o carregador de classe é diferente) nova classe [] {Connection.class}, novo InvocationHandler () {@Override Public Object Invoke (proxy do objeto, método, objeto [] args) lança throwable {if (Method.getName () nulo; pool.add ((conexão) nCon); }} catch (Exceção e) {e.printStackTrace (); }} conexão sincronizada estática pública getConnection () {// Obtenha de t primeiro, se houver um, retire -o. Caso contrário, pegue -o na piscina e coloque o objeto na conexão t con = t.get (); if (con == null) {if (pool.size () <= 0) {System.out.println ("A conexão no pool se foi ..."); tente {thread.sleep (1000); } catch (interruptedException e) {e.printStackTrace (); } retornar getConnection (); } con = pool.remove (0); t.set (con); // coloque -o em t} retornar con; // obtenha um para mover um}}Arquivo de recursos jdbc.properties
## mysqldriver = com.mysql.jdbc.driverurl = jdbc: mysql: //127.0.0.1: 3306/hncu? Useunicode = true & caracterenCoding = utf-8Username = rootpasswor d = 1234size = 3 ## Oracle#driver = oracle.jdbc.driver.oracledriver#url = jdbc: oracle: thin:@127.0.1: 1521: orcl#nome de usuário = scott#senha = tigre
Objeto de valor
Stud.java
pacote cn.hncu.Domain; importar java.util.ArrayList; importar java.util.list;/** Método para criar um objeto de valor quadrado "um" em um para a classe*/public class Stud {private string id; nome de string privado; // ※ Adicione uma coleção especificamente para quadrados "multi"-refletindo o "relacionamento de um para muitos" em uma lista privada de várias mesas <Book> books = new ArrayList <Book> (); // Observe que a coleção deve ser nova na ou antes da construção. public string getId () {return id; } public void setId (string id) {this.id = id; } public string getName () {return name; } public void setName (nome da string) {this.name = name; } Lista pública <Book> getBooks () {return books; } public void Setbooks (List <Book> livros) {this.books = books; } @Override public string tostring () {return "id =" + id + "," + nome + "," + books; }}Book.java
pacote cn.hncu.Domain;/** Método para criar objetos de valor quadrado "multi" em um livro de classe One para muitos*/público {ID inteiro privado; // Todos os tipos de dados básicos são declarados pela classe de embalagem para se preparar para o uso futuro de estruturas --- A classe de embalagem é compatível com as estruturas (porque geralmente as estruturas usam a reflexão da classe) Nome da sequência privada; preço duplo privado; // ※ Adicione uma variável do tipo de objeto especificamente para o quadrado "One" (observe, não use o estudod)-reflita o "relacionamento de um para muitos" em várias tabelas privadas sções; // Defina o mestre // Private String studyd; // ★★ Não defina o público público get () {return id; } public void SetId (ID inteiro) {this.id = id; } public string getName () {return name; } public void setName (nome da string) {this.name = name; } public Double getPrice () {Return Price; } public void setPrice (preço duplo) {this.price = price; } public stud gets () {return s; } public void Sets (Studs) {this.s = s; } / * * Quando a associação multi-tabela, você deve prestar atenção a uma armadilha, ou seja, uma parte gera a outra parte e a outra parte, por sua vez, produz a parte anterior, formando uma recursão infinita! */@Override public string tostring () {return "id =" + id + "," + nome + "," + price; // o objeto Stud não pode ser emitido aqui, caso contrário, Infinite Recursion}}QueryServlet.java servlet camada de camada de pino
pacote cn.hncu.stud.servlet; importar java.io.ioException; importar java.util.list; importar java.util.map; importar javax.servlet.servletexception; importtletL.htlet.htlet.http.httpslets; javax.servlet.http.httpServletResponse; importar cn.hncu.domain.book; importar cn.hncu.domain.stud; importar cn.hncu.stud.Service.istudStud; ISTUDService Service = new StudServiceImpl (); Public void Doget (solicitação httpServletRequest, httpServletResponse Response) lança servletexception, ioexception {DoPost (solicitação, resposta); } public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {string cmd = request.getParameter ("cmd"); System.out.println ("cmd:"+cmd); if ("Query" .equals (cmd)) {Query (solicitação, resposta); } else if ("add" .equals (cmd)) {add (solicitação, resposta); }} public void Query (solicitação httpServletRequest, resposta httpServletResponse) lança servletexception, ioexception {list <map <string, string >> studs = service.query (); request.setAttribute ("Studs", Studs); request.getRequestDispatcher ("/jsps/show.jsp"). Forward (solicitação, resposta); } public void add (httpServletRequest Solicy, httpServletResponse Resposta) lança servletexception, ioexception {// 1 coleta parâmetros 2 organize parâmetros (o campo de id é deixado no DAO para suplementar) nome da string [] = request.GetPeReMeterValues ("nome"); System.out.println (nome [0]); Stud s = new Stud (); s.setName (nome [0]); // livros de informações de strings [] = request.getParameterValues ("livro"); // Protect --- A proteção de preços também deve ser escrita, aqui estamos preguiçosos se (livros == null || books.length <= 0) {return; } String preços [] = request.getParameterValues ("preço"); for (int i = 0; i <books.length; i ++) {livro b = new Book (); b.setName (livros [i]); b.setPRICE (Double.parseDouble (preços [i])); // ※ Complete o relacionamento "um para muitos" de dois objetos de valor s.getbooks (). Add (b); // B.Sets (s) de unidade (s); // MULTILHO-PARTY} // Camada de serviço 3CALL Try {Service.Save (S); } catch (Exceção e) {// Página falhada de direção}}}A interface da camada de serviço da camada de pino:
pacote cn.hncu.stud.service; importar java.util.list; importar java.util.map; importar cn.hncu.domain.stud; interface pública ISTUDSERVICE {public list <map <string, string >> Query (); Public Void Save (Stud Stud);}Classe de implementação
pacote cn.hncu.stud.service; importar java.sql.connection; importar java.sql.sqlexception; importar java.util.list; importar java.util.map; importação cn.hncu.domain.stud; importar cn.hncu.stud.dao.da cn.hncu.stud.dao.bookdao; importar cn.hncu.stud.dao.bookjdbcdao; importar cn.hncu.stud.dao.studdao; importação cn.hncu.utils.connutils3;/*no futuro, geralmente usamos a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela para a tabela de tabela. Se houver várias tabelas de entidade no sistema, escreva alguns DAO. * No futuro, a estrutura fará isso, e devemos fazer isso, porque a arquitetura é boa! * * No caso de usar transações: * 1. Se houver apenas um DAO, mas várias instruções SQL precisam ser executadas e adicionar, excluir e modificar, a transação deve ser aberta. 2. Se um serviço chamar vários DAO, a transação também deverá ser aberta. */public class StudServiceImpl implementa ISTUDSERVICE {// injete studdao dao_stud = new studjdbcdao (); Bookdao dao_book = novo bookjdbcdao (); @Override Public List <Map <String, String >> query () {return Dao_Stud.Query (); } @Override public void Save (Stud Stud) {conexão con = null; tente {con = ConnUtils3.getConnection (); System.out.println ("Obtenha um link:"+con); Con.SetAutocomit (false); Dao_stud.save (Stud); dao_book.save (stud.getbooks ()); System.out.println ("Comprometa uma transação ..."); con.Commit (); } catch (Exceção e) {try {System.out.println ("rolle de volta uma transação ..."); con.rollback (); } catch (sqLexception e1) {e1.printStackTrace (); }} finalmente {tente {con.setautocomit (true); con.close (); } catch (sqLexception e) {e.printStackTrace (); }}}} A camada dao da camada STU
Interface de pino
pacote cn.hncu.stud.dao; importar java.util.list; importar java.util.map; importar cn.hncu.domain.stud; interface pública studdao {list public <p map <string, string >> query (); Public Void Save (Stud Stud) lança exceção;}Classe de implementação do Stud
pacote cn.hncu.stud.dao; importar java.sql.connection; importar java.sql.preparedStatement; importar java.sql.resultset; importação java.sql.sqLexception; import java.sql.statement; importUtAlilist.AliTayList; importar; java.util.list; importar java.util.map; importar java.util.uuid; importar cn.hncu.domain.book; importar cn.hncu.domain.stud; importar strings.hncu.utils.connutils3; public studjdbcdao suplenta studdao { List <map <string, string >> list = new ArrayList <map <string, string >> (); // Um mapa é uma linha de dados, list <pap> é a conexão inteira da tabela de dados con = null; tente {con = ConnUtils3.getConnection (); Declaração st = con.createstatement (); String sql = "selecione * do stud"; ResultSet RS = St.ExecuteQuery (SQL); while (rs.Next ()) {map <string, string> m = novo hashmap <string, string> (); m.put ("id", (string) rs.getObject (1)); m.put ("nome", (string) rs.getObject (2)); list.add (m); } rs.close (); St.Close (); } catch (sqLexception e) {e.printStackTrace (); } finalmente {tente {con.close (); } catch (sqLexception e) {e.printStackTrace (); }} Lista de retorno; } @Override public void Save (Stud Stud) lança Exceção {Connection con = ConnUtils3.getConnection (); System.out.println ("Obtenha um link:"+con); String sql = "inserir nos valores do pino (?,?)"; String uuid = uuid.randomuuid (). Tostring (). Substituir ("-", ""); Preparado Pstatement Pst = Con.Preparestatement (SQL); Stud.setId (UUID); // Para "várias partes", ou seja, o livro pode obter o ID "One Party", é especialmente complementado com Pst.SetString (1, UUID); pst.SetString (2, stud.getName ()); System.out.println ("1:"+uuid+", 2:"+stud.getName ()); pst.execUteUpdate (); // CO.Close (); // Obtenha o mesmo golpe, não há necessidade de fechá -lo aqui}}Interface do livro
pacote cn.hncu.stud.dao; importar java.util.list; importar cn.hncu.domain.book; interface pública bookdao {public void save (list <book> lança exceção;}Classe de implementação de livros
pacote cn.hncu.stud.dao; importar java.sql.connection; importar java.sql.preparedStatement; importar java.util.list; importar cn.hncu.Domain.Book; import cn.hncu.utils.connutils3; Livros) lança a exceção {conexão con = connutils3.getConnection (); System.out.println ("Obtenha um link:"+con); String sql = "inserir no livro (nome, preço, studid) valores (?,?)"; Preparado Pstatement Pst = Con.Preparestatement (SQL); para (Livro B: Livros) {Pst.SetString (1, B.GetName ()); pst.setDouble (2, b.getprice ()); pst.setObject (3, "12132312"); // Exceção (deliberadamente dê um campo de chave estrangeira inexistente para testar reversão de transações)-reversão de transações de teste // pst.setObject (3, b.gets (). getId ()); System.out.println ("1:"+b.getName ()+", 2:"+b.getprice ()+", 3:"+b.gets (). GetId ()); pst.addbatch (); // Adicionar ao lote} pst.executeBatch (); // Executar lote // con.close (); // obtenha o mesmo golpe aqui, não há necessidade de fechar aqui}}}}}}}}Mostre a página de informações do aluno JSPs/Show.jsp
<%@ Page Language = "java" import = "java.util. <c: foreach itens = "$ {studs}" var = "x"> $ {x.id}, $ {x.name} <br/> </c: foreach> </body> </html>Imagem de reprodução:
Para obter mais informações sobre o sistema de gerenciamento, clique em "Tópico especial do sistema de gerenciamento" para aprender
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.