Информация о студенте в этом примере добавляет транзакции в базу данных (транзакция может быть представлена, транзакции могут быть переданы обратно и улучшены с помощью локальных потоков)
Главная страница index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html> <head> <title>Student Information Management</title> </head> <body> <a href='<c:url value = "/Query"/>? cmd = Query '> Просмотреть информацию о студенте </a> <br> <br> <!-<a href = "<C: url value ='/studservlet? cmd = save '/>"> Информация о студенте Add </a>-> <H2> Информация о студенте add </h2> <com =' <c: url value = "/>? Имя: <input type = "text" name = "name"/> <br> <br> <fieldset style = "граница: твердое; style="border: solid;border-color:green;width: 250px;"> <legend>Book 2</legend> Title:<input type="text" name="book"/><br><br> Price:<input type="text" name="price"/> </fieldset> <br><br> <input type="submit" value="submit"/><br><br> </form> </body> </html>
Инструмент для получения Connutils Connutils5.java5.java.
Пакет cn.hncu.utils; импорт java.lang.reflect.invocationHandler; импорт java.lang.reflect.method; импорт java.lang.reflect.proxy; импорт java.sql.concection; импорт java.sql.drivermanager; импорт Java.Util.ArrayList; java.util.properties; открытый класс Connutils5 {// локальный объект управления потоком, используемый для реализации: подключение, полученное одним и тем же потоком, является тем же частным статическим потоком <nectedcal> t = new Threadlocal <nected> (); Частный окончательный статический список <neplyse> pool = new ArrayList <nectation> (); private static int size; // читать private connutils5 () {} static {свойства p = new Properties (); Try {// Следующий метод может прочитать файл ресурса в разделе ClassPath в проекте Pure Java, но проект Javaee не может быть прочитал. Потому что Tomcat изменил загрузку класса системы по умолчанию //p.load (classloader.getSystemClassloader (). GetSystemresourceasStream ("jdbc.properties")); // p.load (classloader.getsystemresourceasstream ("jdbc.properties")); // Читать файл ресурса под классной дорожкой веб -проекта, используйте его для p.load (connutils3.class.getClassloader (). GetResourCeasStream ("jdbc.properties")); String Driver = P.GetProperty ("Driver"); String url = p.getproperty ("url"); String name = p.getproperty ("имя пользователя"); String pwd = p.getProperty ("пароль"); String ssize = p.getProperty ("size"); Size = integer.parseint (ssize); Class.forname (драйвер); for (int i = 0; i <size; i ++) {окончательное соединение con = drivermanager.getConnection (url, имя, pwd); System.out.println ("con =="+con); // изменить метод conn.close () // Использовать режим прокси для генерации улучшенной версии объекта Conn, Intercept и изменить свой метод Close () для объекта ncon = proxy.newproxyinstance (connutils3.class.getClassloader (), // conn.getClass (). Program (Class Loader отличается) Новый класс [] {connection.class}, New InvocationHandler () {@Override Public Object Invoke (Object Proxy, метод, объект [] args) бросает Throwable {if (method.getName () null; Pool.Add ((соединение) NCON); }} catch (Exception e) {e.printstackTrace (); }} public Static Synchronized Connection getConnection () {// Get From T Сначала, если есть, выберите его. Если нет, возьмите его в бассейн и поместите объект в T -соединение con = t.get (); if (con == null) {if (pool.size () <= 0) {System.out.println («Соединение в пуле исчезло ...»); try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } return getConnection (); } con = pool.remove (0); t.set (con); // Поместите его в t} return con; // Получить один, чтобы переместить один}}Файл ресурсов JDBC.Properties
## mysqldriver = com.mysql.jdbc.driverurl = jdbc: mysql: //127.0.0.1: 3306/hncu? UseUnicode = true & haremencoding = utf-8username = rootpasswor d = 1234size = 3 ## oracle#Driver = oracle.jdbc.driver.oracledriver#url = jdbc: oracle: thin:@127.0.0.1: 1521: orcl#username = scott#password = tiger
Значение объекта
Stud.java
пакет cn.hncu.domain; импортировать java.util.arraylist; import java.util.list;/** Метод создания объекта «одно» в квадратном значении в одном к человеку*/public class stud {private String id; Приватное название строки; // ※ Добавить коллекцию специально для «много» квадратов --- Отражая «Относительные отношения» в многотоком частного списка <book> books = new Arraylist <book> (); // Обратите внимание, что коллекция должна быть новой на или до строительства. public String getId () {return id; } public void setId (String id) {this.id = id; } public String getName () {return name; } public void setName (string name) {this.name = name; } public List <book> getBooks () {return Books; } public void setbooks (list <book> books) {this.books = books; } @Override public String toString () {return "id =" + id + "," + name + "," + books; }}Book.java
Пакет Cn.hncu.domain;/** Метод создания объектов «мульти» квадратного значения в книге «Одно до»*/Public Class Book {Private Integer ID; // Все основные типы данных объявляются классом упаковки для подготовки к будущему использованию фреймворков. Класс упаковки совместим с Frameworks (потому что, как правило, фреймворки используют Class Reflection) Private String Имя; частная двойная цена; // ※ Добавить переменную типа объекта, специально для «одного», квадрат (примечание, не используйте исследование) --- Отражите «Относительные отношения» в нескольких таблицах. } public void setId (Integer id) {this.id = id; } public String getName () {return name; } public void setName (string name) {this.name = name; } public Double GetPrice () {return Price; } public void setPrice (двойная цена) {this.price = цена; } public Stud Gets () {return s; } public void sets (Stud S) {this.s = s; } / * * Когда многоточная ассоциация, вы должны обратить внимание на ловушку, то есть одну сторону выводит другую сторону, а другая сторона, в свою очередь, выводит предыдущую сторону, образуя бесконечную рекурсию! */@Override public String toString () {return "id =" + id + "," + name + "," + price; // объект Stud не может быть выведен здесь, в противном случае Infinite Recursion}}QueryServlet.java Servlet слой слоя шпильки
Пакет cn.hncu.stud.servlet; import java.io.ioexception; import java.util.list; импорт java.util.map; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.http.http.httpservlet; import javax.servlet.http.http.httpservlet; import javax.servlet.htt javax.servlet.http.httpservletresponse; import cn.hncu.domain.book; import cn.hncu.domain.stud; импорт cn.hncu.stud.service.istudservice; import.hncu.stud.service.studservice Querservices velectledends. // инъекция istudservice service = new studserviceimpl (); public void Doget (httpservletrequest, httpservletresponse response) бросает Servletexception, ioException {DoPost (запрос, ответ); } public void dopost (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {string cmd = request.getParameter ("cmd"); System.out.println ("cmd:"+cmd); if ("Query" .equals (cmd)) {Query (запрос, ответ); } else if ("add" .equals (cmd)) {add (request, response); }} public void Query (httpservlectrequest, httpservletresponse response) throws servletexception, ioexception {list <map <string >> studs = service.query (); request.setattribute ("Studs", Studs); request.getRequestDispatcher ("/jsps/show.jsp"). } public void add (httpservletRequest, httpservletresponse response) Throws ServletException, ioException {// 1 Соберите параметры 2 Организация параметров (идентификационное поле остается в DAO в дополнение) string name [] = request.getParametervalues ("name"); System.out.println (имя [0]); Стад S = новый stud (); S.SetName (имя [0]); // информация книги String Books [] = request.getParametervalues ("book"); // Защита --- Также должна быть написана защита цен, здесь мы ленивы, если (books == null || books.length <= 0) {return; } Строковые цены [] = request.getParametervalues ("цена"); for (int i = 0; i <books.length; i ++) {book b = new book (); b.setname (книги [i]); B.SetPrice (Double.Parsedouble (цены [i])); // ※ Заполните связь «один ко многим» двух объектов значения s.getbooks (). Add (b); // однопартийные B.sets (ы); // Многопартийный} // 3Call Service Service Layer try {service.save (s); } catch (Exception e) {// Неудача направления}}}Интерфейс сервисного уровня слоя шпильки:
пакет cn.hncu.stud.service; import java.util.list; import java.util.map; import cn.hncu.domain.stud; публичный интерфейс istudservice {public list <map <string, string >> Query (); Public void Save (Stud Stud);}Класс реализации
Пакет cn.hncu.stud.service; import java.sql.connection; импорт java.sql.sqlexception; import java.util.list; import java.util.map; import cn.hncu.domain.stud; импорт cn.hncu.stud.dao.boop; cn.hncu.stud.dao.bookdao; импорт cn.hncu.stud.dao.bookjdbcdao; import cn.hncu.stud.dao.studdao; импорт cn.hncu.utils.connutils3;/*В будущем мы обычно используем таблицу для самостоятельного. Если в системе есть несколько объектов, напишите несколько DAO. * В будущем структура сделает это, и мы должны сделать это, потому что архитектура хороша! * * В случае использования транзакций: * 1. Если есть только один DAO, но необходимо выполнить несколько операторов SQL, удалить и изменить, транзакция должна быть открыта. 2. Если служба вызывает несколько DAO, транзакция также должна быть открыта. */public class studserviceimpl реализует istudservice {// inject studdao dao_stud = new studjdbcdao (); Bookdao dao_book = new bookjdbcdao (); @Override public list <map <string, string >> Query () {return dao_stud.query (); } @Override public void Said (Stud Stud) {connection con = null; try {con = connutils3.getConnection (); System.out.println («Получите ссылку:»+con); con.setautocommit (false); dao_stud.save (stud); dao_book.save (stud.getbooks ()); System.out.println ("совершить транзакцию ..."); con.commit (); } catch (Exception e) {try {System.out.println ("Rolle обратно транзакции ..."); con.rollback (); } catch (sqlexception e1) {e1.printstacktrace (); }} наконец {try {con.setautocommit (true); con.close (); } catch (sqlexception e) {e.printstacktrace (); }}}} Слой DAO слоя STU
Интерфейс шпильки
пакет cn.hncu.stud.dao; import java.util.list; import java.util.map; import cn.hncu.domain.stud; публичный интерфейс studdao {public list <map <string, string >> Query (); Public void Said (Stud Stud) бросает исключение;}Класс реализации стада
Пакет cn.hncu.stud.dao; импорт java.sql.connection; импорт java.sql.preparedStatement; импорт java.sql.resultset; импорт java.sql.sqlexception; импорт java.sql.statement; импорт; импорт; 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.contils3; public class studjdbcdao imptuments studdao { @ @wisoverride publicle <string >> Qustery <tring >> Qustery <tring >> qupery <tring >> Qustery (QUSTERIP <TriseRide >> Список <map <string, string >> list = new ArrayList <map <string, string >> (); // Карта - это строка данных, список <Map> - это полная таблица данных connection con = null; try {con = connutils3.getConnection (); Утверждение st = con.createStatement (); String sql = "select * from 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 ("name", (String) rs.getObject (2)); list.add (m); } rs.close (); S.Close (); } catch (sqlexception e) {e.printstacktrace (); } наконец {try {con.close (); } catch (sqlexception e) {e.printstacktrace (); }} return List; } @Override public void Said Said (Stud Stud) Throws Exception {connection con = connutils3.getConnection (); System.out.println («Получите ссылку:»+con); String sql = "вставьте значения шпильки (?,?)"; String uuid = uuid.randomuuid (). Подготовленное Statatement PST = con.PreArestatement (SQL); stud.setId (uuid); // Чтобы «несколько сторон», то есть книга может получить идентификатор «одна сторона», она специально дополняется pst.setstring (1, uuid); PST.SetString (2, stud.getName ()); System.out.println ("1:"+uuid+", 2:"+stud.getName ()); pst.executeupdate (); // con.close (); // Получить тот же Con, здесь нет необходимости закрывать его здесь}}}}}}Книжный интерфейс
Пакет cn.hncu.stud.dao; import java.util.list; import cn.hncu.domain.book;
Класс реализации книги
Пакет cn.hncu.stud.dao; import java.sql.connection; импорт java.sql.preparedStatement; import java.util.list; импорт cn.hncu.domain.book; импорт cn.hncu.utils.contils3; Сохранить (список <book> книги) бросает исключение {connection con = connutils3.getConnection (); System.out.println («Получите ссылку:»+con); String sql = "вставьте в книгу (имя, цена, studid) значения (?,?,?)"; Подготовленное Statatement PST = con.PreArestatement (SQL); Для (Книга B: книги) {pst.setString (1, b.getName ()); PST.SetDouble (2, B.GetPrice ()); PST.SetObject (3, "12132312"); // Исключение (намеренно дает несуществующее поле иностранного ключа для тестирования отката транзакции) -test Откат // pst.setObject (3, b.gets (). getId ()); System.out.println ("1:"+b.getName ()+", 2:"+b.getPrice ()+", 3:"+b.gets (). GetId ()); pst.addbatch (); // Добавить в партию} pst.executebatch (); // Выполнить пакет // con.close (); // Получить здесь тот же Con, нет необходимости закрывать здесь}}}}}}}}}}}Показать страницу информации о студентах jsps/show.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html> <head> <title>Student Information Management</title> </head> <body> <h2>Student Information</h2> <C: foreach emits = "$ {studs}" var = "x"> $ {x.id}, $ {x.name} <br/> </c: foreach> </body> </html>Изображение воспроизведения:
Для получения дополнительной информации о системе управления, пожалуйста, нажмите «Специальная тема управления», чтобы узнать
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.