La información del estudiante en este ejemplo agrega transacciones a la base de datos (la transacción se puede enviar, las transacciones se pueden retroceder y mejorar con los hilos locales)
Página principal índice.jsp
<%@ page lenguaje = "java" import = "java.util.*" PageEncoding = "Utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%> <html> <shead> <bitle> estudiante de gestión de la información </title> </head> <body> <body> <Art) <Arly <coder> <Art <Art <Art <Arly <Art <Art <Art <Art <Arly <Art <A HEHLY <A HEMLY <A HREFEMF. value = "/QUERY"/>? CMD = QUIERY '> Ver información del estudiante </a> <br> <br> <!-<a href = "<c: url value ='/studservlet? cmd = save '/>"> información del estudiante agregar </a>-> <h2> Información del estudiante ADD </h2> <Action de formulario =' <c: Value url = "/query"/>>? Nombre: <input type = "text" name = "name"/> <br> <br> <br> <Fieldset style = "border: sólido; border-color: rojo; ancho: 250px;"> <legend> book1 </legend> title: <input type = "text" name = "libro"/> <br> <br> precio: <input type = "text" name = "precio" style = "Border: Solid; Border-Color: Green; Width: 250px;"> <legend> Libro 2 </legend> Título: <input type = "text" name = "book"/> <br> <br> Price: <input type = "text" name = "precio"/> </fieldset> <br> <br> <input type = "Subting" Subt = "Subsit"/> <<r> <br> <br> <br> <br> <br> <br> <br> </body> </html>
Herramienta para obtener conectilos de conexión de base de datos 5.Java
paquete cn.hncu.utils; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; import java.lang.reflect.proxy; import java.sql.connection; import java.sql.drivermanager; import java.util.Arraylist; import java.sql.Squister; java.util.properties; public class Connutils5 {// Objeto de gestión de subprocesos local, utilizada para implementar: la conexión obtenida por el mismo hilo es el mismo shifhlocal estático privado <Conexión> t = new ThreadLocal <Enection> (); Lista estática final privada <Enection> Pool = New ArrayList <Enection> (); Tamaño de intstatat intivate privado; // Leer connutils private5 () {} static {Propiedades p = new Properties (); Pruebe {// El siguiente método puede leer el archivo de recursos en classpath en un proyecto Java puro, pero el proyecto Javaee no se puede leer. Porque Tomcat cambió el cargador de clase predeterminado del sistema //p.load (classloader.getSystemClassLoader (). // P.Load (classLoader.getSystemResourceASStream ("JDBC.Properties")); // Lea el archivo de recursos en el ClassPath del proyecto web, use esto en P.Load (connutils3.class.getClassLoader (). GetResourceASStream ("JDBC.Properties")); Controlador de cadena = p.getProperty ("controlador"); String url = p.getProperty ("url"); Name de cadena = p.getProperty ("nombre de usuario"); Cadena pwd = p.getProperty ("contraseña"); Cadena ssize = p.getProperty ("tamaño"); Size = Integer.ParseInt (ssize); Class.forname (controlador); for (int i = 0; i <size; i ++) {Conexión final con = drivermanager.getConnection (url, nombre, pwd); System.out.println ("con =="+con); // Cambie el método conn.close () // use el modo proxy para generar una versión mejorada del objeto conn, intercepte y cambie su método Cerrar () a objeto ncon = proxy.newproxyInstance (connutils3.class.getClassLoader (), // conn.getClass (). GetInterfaces (), // Este método no funciona, es que el controlador de la implementación en el controlador está en el mismo espacio en el controlador en el mismo espacio en el controlador en el mismo espacio en el controlador en el mismo espacio en el mismo espacio en el controlador en el mismo espacio en el mismo espacio en el controlador en el mismo espacio en el control de la misma manera que está en el mismo espacio en el que está en el mismo espacio en el mismo espacio en el que no funciona en el que no funciona en el que no funciona, lo que no funciona en el que no funciona, lo que no funciona, lo que debe ser el que está en el mismo espacio. programa (el cargador de clases es diferente) nueva clase [] {Connection.Class}, New InvocationHandler () {@Override Public Object Invoke (Object Proxy, Method Method, Object [] Args) lanza showable {if (método.getName (). Equals ("Close") {System.Println ("Devuelve un enlace:"+(Conexión); nulo; Pool.add ((conexión) ncon); }} catch (Exception e) {E.PrintStackTrace (); }} Public static sincronizada conexión getConnection () {// Get de t primero, si hay una, tómelo. Si no, agarrarlo en la piscina y colocar el objeto en t conexión con = t.get (); if (con == null) {if (prool.size () <= 0) {system.out.println ("La conexión en el grupo se ha ido ..."); intente {Thread.sleep (1000); } catch (InterruptedException e) {E.PrintStackTrace (); } return getConnection (); } Con = Pool.remove (0); t.set (con); // Ponlo en t} return con; // consigue uno para mover uno}}Archivo de recursos JDBC.Properties
## mysqlDriver = com.mysql.jdbc.driverurl = jdbc: mysql: //127.0.0.1: 3306/hncu? UseUnicode = true & caracteringoding = utf-8Username = rootpasswor d = 1234Size = 3 ## Oracle#Driver = oracle.jdbc.driver.oracledriver#url = jdbc: oracle: delgado:@127.0.0.1: 1521: orcl#username = scott#contraseña = tiger
Value Objeto
Stud.java
paquete cn.hncu.domain; import java.util.arrayList; import java.util.list;/** método para crear un objeto de valor cuadrado "un" en uno a Many*/public class Stud {private String id; nombre de cadena privada; // ※ Agregue una colección específicamente para cuadrados "multi", reflejando la "relación de uno a muchos" en una lista privada de la mesa <book> books = new ArrayList <Book> (); // Tenga en cuenta que la colección debe ser nueva en o antes de la construcción. public String getId () {return id; } public void setid (ID de cadena) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } Lista pública <Book> getBooks () {return books; } public void setbooks (List <Book> Books) {this.books = books; } @Override public string toString () {return "id =" + id + "," + nombre + "," + libros; }}Libro.java
paquete cn.hncu.domain;/** Método para crear objetos de valor cuadrado "multi" en uno a grany*/public class Book {private entero ID; // Los tipos de datos básicos son declarados por la clase de empaque para prepararse para el uso futuro de los marcos --- la clase de empaque es compatible con los marcos (porque generalmente los marcos usan la reflexión de la clase) Nombre de cadena privada; precio doble privado; // ※ Agregue una variable de tipo de objeto específicamente para "un" cuadrado (nota, no use StudyD) --- refleje la "relación de uno a muchos" en múltiples tablas privadas de stud s; // establecer el maestro // string privado studingd; // ★★ No configure el entero público getId () {return Id; } public void setid (ID de entero) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public Double GetPrice () {Return Price; } public void setPrice (doble precio) {this.price = precio; } Public Stud gets () {return s; } sets public void (stud s) {this.s = s; } / * * Cuando la asociación múltiple, debe prestar atención a una trampa, es decir, una parte emite a la otra parte, y la otra parte a su vez genera la parte anterior, formando una recursión infinita. */@Override public String toString () {return "id =" + id + "," + nombre + "," + precio; // El objeto de perno no se puede obtener aquí, de lo contrario, infinita recursión}}QueryServlet.java Servlet capa de capa de perno
paquete cn.hncu.stud.servlet; import java.io.ioexception; import java.util.list; import java.util.map; import javax.servlet.servletexception; import javax.servlet.http.htttttttpServlet; import javax.servlet.http.httpservletRequest; importar; javax.servlet.http.httpServletResponse; import cn.hncu.domain.book; import cn.hncu.domain.stud; import cn.hncu.stud.service.istudservice; import cn.hncu.stud.service.studserviceImpl; public classervlet Extends Httends Httends Htttends IstudService Service = new StudServiceImpl (); Public void doget (httpservletRequest, respuesta, respuesta httpservletResponse) lanza ServletException, ioexception {dopost (solicitud, respuesta); } public void dopost (httpservletRequest solicitud, respuesta httpServletResponse) lanza ServletException, ioException {String cmd = request.getParameter ("cmd"); System.out.println ("cmd:"+cmd); if ("consulta" .equals (cmd)) {consulta (solicitud, respuesta); } else if ("agregar" .equals (cmd)) {add (request, respuesta); }} Public void Query (HttpServletRequest solicitud, respuesta httpServletResponse) lanza ServletException, ioException {list <map <string, string >> studs = servicio.query (); request.setAttribute ("Studs", Studs); request.getRequestDIsPatcher ("/jsps/show.jsp"). Forward (solicitud, respuesta); } public void add (httpservletRequest solicitud, httpservletResponse respuesta) arroja servletException, ioexception {// 1 recopilar parámetros 2 organizar parámetros (el campo de identificación se deja en dao to Supplement) Nombre de cadena [] = request.getParametervalues ("nombre"); System.out.println (nombre [0]); Stud S = New Stud (); s.setName (nombre [0]); // Book Information String Books [] = request.getParametervalues ("libro"); // Protect --- La protección de precios también debe escribirse, aquí somos perezosos si (books == null || books.length <= 0) {return; } Precios de cadena [] = request.getParametervalues ("precio"); para (int i = 0; i <books.length; i ++) {libro b = nuevo libro (); B.SetName (libros [i]); B.SetPrice (doble. PARSEDOBLE (precios [i])); // ※ Complete la relación "uno a muchos" de dos objetos de valor s.getBooks (). Add (b); // Sets B.Set (S); // Party múltiple} // 3call Service Layer intente {servicio.save (s); } catch (excepción e) {// Página fallida de dirección}}}La interfaz de la capa de servicio de la capa de perno:
paquete cn.hncu.stud.service; import java.util.list; import java.util.map; import cn.hncu.domain.stud; interfaz pública istudservice {lista pública <map <string, string >> query (); Public void save (Stud Stud);}Clase de implementación
paquete cn.hncu.stud.service; import java.sql.connection; import java.sql.sqlexception; import java.util.list; import java.util.map; import cn.hncu.domain.stud; import cn.hncu.stud.dao.bookdao; importar; import cn.hncu.stud.dao.bookdao; import cn.hncu.stud.dao.bookjdbcdao; import cn.hncu.stud.dao.studdao; import cn.hncu.utils.connutils3;/*En el futuro, generalmente usamos una tabla para operar de forma independiente. Si hay varias tablas de entidad en el sistema, escriba algunas DAO. * En el futuro, el marco hará esto, y debemos hacer esto, ¡porque la arquitectura es buena! * * En el caso de usar transacciones: * 1. Si solo hay un DAO, pero se deben ejecutar múltiples declaraciones SQL y agregar, eliminar y modificar, la transacción debe abrirse. 2. Si un servicio llama a múltiples DAO, la transacción también debe abrirse. */public class StudServiceImpl implementa Istudservice {// inyect studdao dao_stud = new studjdbcdao (); Bookdao dao_book = nuevo bookJdbcdao (); @Override Public List <Map <String, String >> Query () {return dao_stud.query (); } @Override public void save (Stud Stud) {Connection con = null; intente {con = connutils3.getConnection (); System.out.println ("Obtener un enlace:"+Con); con.setAutOcommit (falso); dao_stud.save (stud); dao_book.save (stud.getBooks ()); System.out.println ("Commit una transacción ..."); con.commit (); } catch (excepción e) {try {System.out.println ("Rolle hacia atrás una transacción ..."); con.rollback (); } catch (sqlexception e1) {e1.printstackTrace (); }} finalmente {try {con.setAutOcommit (true); con.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); }}}} La capa Dao de la capa STU
Interfaz de semental
paquete cn.hncu.stud.dao; import java.util.list; import java.util.map; import cn.hncu.domain.stud; interfaz pública studdao {lista pública <map <string, string >> query (); Public void save (stud stand) lanza la excepción;}Clase de implementación de sementales
paquete cn.hncu.stud.dao; import java.sql.connection; import java.sql.preparedStatement; import java.sql.resultset; import java.sql.sqlexception; import java.sql.Statement; import java.util.arraylist; import java.util.util.util.util. java.util.list; import java.util.map; import java.util.uuid; import cn.hncu.domain.book; import cn.hncu.domain.stud; import cn.hncu.utils.connutils3; public class studjdbcdao implementa studdao {@override <map <string> byer (studjdbcdao implementa studdao {@override <map <string> Sing {>>>>) List <map <string, string >> list = new ArrayList <map <string, string >> (); // Un mapa es una fila de datos, la lista <s map> es la conexión de tabla de datos completa con = null; intente {con = connutils3.getConnection (); Declaración st = con.createStatement (); Cadena sql = "seleccionar * de stud"; ResultSet rs = St.ExecuteQuery (SQL); while (rs.next ()) {map <string, string> m = new HashMap <String, String> (); m.put ("id", (string) rs.getObject (1)); m.put ("nombre", (cadena) rs.getObject (2)); list.add (m); } rs.close (); St.Close (); } Catch (Sqlexception e) {E.PrintStackTrace (); } finalmente {try {con.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); }} lista de retorno; } @Override public void save (stud stud) lanza la excepción {Connection con = connutils3.getConnection (); System.out.println ("Obtener un enlace:"+Con); Cadena sql = "insertar en los valores del perno (?,?)"; Cadena uuid = uuid.randomuuid (). ToString (). Reemplazar ("-", ""); Preparado PST = Con.PrepareStatement (SQL); stud.setId (uuid); // Para "múltiples partes", es decir, el libro puede obtener la identificación de "una parte", se complementa especialmente con pst.setstring (1, uuid); pst.setString (2, stud.getName ()); System.out.println ("1:"+uuid+", 2:"+stud.getName ()); pst.executeUpdate (); // con.close (); // Obtenga la misma estafa, no hay necesidad de cerrarlo aquí}}Interfaz de libros
paquete cn.hncu.stud.dao; import java.util.list; import cn.hncu.domain.book; interfaz pública bookdao {public void save (list <book> books) arroja excepción;}Clase de implementación de libros
package cn.hncu.stud.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.util.List;import cn.hncu.domain.Book;import cn.hncu.utils.ConnUtils3;public class BookJdbcDao implements BookDAO { @Override public void save(List<Book> libros) lanza la excepción {Connection Con = Connutils3.getConnection (); System.out.println ("Obtener un enlace:"+Con); Cadena sql = "insertar en el libro (nombre, precio, estudios) valores (?,?,?)"; Preparado PST = Con.PrepareStatement (SQL); para (libro B: libros) {Pst.setString (1, b.getName ()); pst.setDouble (2, b.getPrice ()); pst.setObject (3, "12132312"); // Excepción (Deliberadamente, proporcione un campo de clave extranjera inexistente para probar la reversión de la transacción) -La de transacción de la prueba Rollback // Pst.SetObject (3, B.gets (). getId ()); System.out.println ("1:"+B.getName ()+", 2:"+B.getPrice ()+", 3:"+B.gets (). GetId ()); pst.addbatch (); // Agregar al lote} pst.executeBatch (); // ejecutar lotes // con.close (); // Obtenga la misma estafa aquí, no es necesario cerrar aquí}}Mostrar la página de información del estudiante JSPS/show.jsp
<%@ page lenguaje = "java" import = "java.util.*" pageEncoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%> <html> <shead> <bitle> Gestión de la información del estudiante </title> </head> </head> <HEAD> <c: foreach elementos = "$ {studs}" var = "x"> $ {x.id}, $ {x.name} <br/> </c: foreach> </body> </html>Imagen de reproducción:
Para obtener más información sobre el sistema de gestión, haga clic en "Tema especial del sistema de gestión" para aprender
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.