この例の学生情報は、データベースにトランザクションを追加します(トランザクションを送信し、トランザクションをロールバックし、ローカルスレッドで改善できます)
メインページindex.jsp
<%@ page Language = "Java" Import = "Java.util。*" pageEncoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%> <html> <head> <head> < value = "/query"/>?cmd = query '>学生情報の表示</a> <br> <br> < name:<入力タイプ= "テキスト" name = "name"/> <br> <br> <fieldset style = "border:solid; border-color:red; width:250px;"> <legend> book1 </legent>タイトル:<入力タイプ= "テキスト" name = "book"/> <br> <br> <br> <br> SOLID; BORDER-COLOR:GREEN; WIDTH:250PX; "> LEGEND> BOOK 2 </LEGEND>タイトル:<入力タイプ="テキスト "name =" book "/> <br> <br>価格:<入力タイプ="テキスト "名="価格= "/> </fieldセット> <
データベース接続を取得するためのツールconnutils5.java
パッケージcn.hncu.utils; Import java.lang.refllect.invocationhandler; Import java.lang.refllect.method; import java.lang.lang.reflect.proxy; Import java.sql.connection; Import Java.sql.drivermanist; Import Java.util.util.util.util.util.util.util.util.util.util.util.util. java.util.properties; public class connutils5 {//ローカルスレッド管理オブジェクト、実装に使用される:同じスレッドで取得された接続は、同じプライベート静的threadlocal <connection> t = new threadlocal <connection>();プライベート最終静的リスト<connection>プール= new arrayList <connection>(); private static int size; // private connutils5(){} static {properties p = new Properties();を読み取ります。 {//次の方法では、純粋なJavaプロジェクトのClassPathの下のリソースファイルを読み取ることができますが、Javaeeプロジェクトは読み取ることができません。 TomcatがシステムのデフォルトのクラスLoader ///p.load(classloader.getSystemClassLoader()を変更したため。GetSystemResourceASStream( "JDBC.Properties")); // p.load(classloader.getSystemResourceAsStream( "JDBC.Properties")); // WebプロジェクトのClassPathの下のリソースファイルを読み取り、これを使用してp.load(connutils3.class.getClassLoader()。getResourceAsStream( "jdbc.properties")); string driver = p.getProperty( "driver"); string url = p.getProperty( "url");文字列名= p.getProperty( "username");文字列pwd = p.getProperty( "Password"); string ssize = p.getProperty( "size"); size = integer.parseint(ssize); class.forname(ドライバー); for(int i = 0; i <size; i ++){final connection con = drivermanager.getConnection(url、name、pwd); System.out.println( "con =="+con); // conn.close()メソッドを変更します現在のプログラム(クラスローダーは異なります){] {connection.class}、new InvocationHandler(){@Override Public Object(オブジェクトプロキシ、メソッド)スロー可能{if(method.getName()。 null; return methoke.invoke(con、args); pool.add((connection)ncon); }} catch(例外e){e.printstacktrace(); }} public static同期接続getConnection(){//最初にtから取得します。そうでない場合は、プールでそれをつかみ、オブジェクトをt接続に入れますcon = t.get(); if(con == null){if(pool.size()<= 0){system.out.println( "プールの接続がなくなった..."); try {thread.sleep(1000); } catch(arturnedexception e){e.printstacktrace(); } return getConnection(); } con = pool.remove(0); t.set(con); // to in t} return con; // 1つを移動するために1つを取得}}}リソースファイルjdbc.properties
## mysqldriver = com.mysql.jdbc.driverurl = jdbc:mysql://127.0.0.1:3306/hncu?useunicode = true&charatereCoding = 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; Import java.util.arraylist; Import java.util.list;/** 1対Many*/public class Stud {private string id;プライベート文字列名; // bultifically「マルチ」スクエア専用のコレクションを追加します---マルチテーブルプライベートリストの「1対Many関係」を反映して、<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;/** 1対多数の*/public class book {private integer id; //すべての基本的なデータ型は、フレームワークの将来の使用に備えるためにパッケージクラスによって宣言されます---パッケージングクラスは、フレームワークと互換性があります(通常、フレームワークはクラスリフレクションを使用するため)プライベート文字列名。プライベートダブル価格。 // office「1つの」正方形に特にオブジェクトタイプの変数を追加します(注、StudyDを使用しないでください)---複数のテーブルの「1対Many関係」を反映しますプライベートスタッド; //マスター//プライベート文字列勉強を設定します; } 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(2倍の価格){this.price = price; } public stud gets(){return s; } public void set(stud s){this.s = s; } / * *マルチテーブルアソシエーションの場合、トラップに注意を払う必要があります。つまり、一方の当事者が他方の当事者を出力し、もう一方の当事者は以前のパーティを出力し、無限の再帰を形成します! */@Override public String toString(){return "id =" + id + "、" + name + "、" + rice; //スタッドオブジェクトはここで出力できません。スタッド層のqueryservlet.javaサーブレット層
パッケージcn.hncu.stud.servlet; Import java.io.ioexception; import java.util.list; import java.util.map; import javax.servlet.servletexception; Import javax.servlet.servlet.http.httpservlet; Import javax.http.httptsequest; javax.servlet.http.httpservletresponse; Import cn.hncu.domain.book; Import cn.hncu.domain.stud; Import cn.hncu.stud.service.istudservice;インポートISTUDSERVICE SERVICE = new StudServiceImpl(); public void doget(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {dopost(request、response); } public void dopost(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {string cmd = request.getparameter( "cmd"); System.out.println( "cmd:"+cmd); if( "query" .equals(cmd)){query(request、response); } else if( "add" .equals(cmd)){add(request、response); }} public void query(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {list <map <string、string >> suds = service.query(); request.setattribute( "studs"、studs); request.getRequestDispatcher( "/jsps/show.jsp")。 } public void add(httpservletrequest request、httpservletResponse応答)スローservletexception、ioexception {// 1収集パラメーター2編成パラメーター(idフィールドはdaoに残されています)string name [] = request.getParametervalues( "name"); System.out.println(name [0]);スタッドs = new Stud(); S.SetName(name [0]); // Book Information String Books [] = request.getParametervalues( "book"); //保護---価格保護も書く必要があります、ここで私たちは怠zyです(books == null || books.length <= 0){return; }文字列価格[] = request.getParametervalues( "price"); for(int i = 0; i <books.length; i ++){book b = new book(); b.setname(books [i]); B.SetPrice(double.ParseDouble(Price [i])); //※2つの値オブジェクトの「1対多」関係を完了しますs.getbooks()。追加(b); // one-party b.sets(s); // Multiple-Party} // 3Call Service Layer try {service.save(s); } catch(例外e){//方向失敗ページ}}}スタッドレイヤーのサービスレイヤーインターフェイス:
パッケージcn.hncu.stud.service; Import java.util.list; import java.util.map; import cn.hncu.domain.stud; public interface istudservice {public list <map <string、string >> query(); public void save(スタッドスタッド);}実装クラス
パッケージ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; cn.hncu.stud.dao.bookdao; Import cn.hncu.stud.dao.bookjdbcdao; Import cn.hhncu.stud.dao.studdao;インポートcn.hncu.utils.connutils3;システムにいくつかのエンティティテーブルがある場合は、いくつかのDAOを書きます。 *将来、フレームワークはこれを行い、アーキテクチャが良いので、これを行う必要があります! * *トランザクションの使用の場合: *1。DAOは1つだけですが、複数の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 save(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 back a transaction ..."); con.rollback(); } catch(sqlexception e1){e1.printstacktrace(); }}最後に{try {con.setautocommit(true); con.close(); } catch(sqlexception e){e.printstacktrace(); }}}} STU層のDAO層
スタッドインターフェイス
パッケージcn.hncu.stud.dao; Import java.util.list; import java.util.map; import cn.hncu.domain.stud; public interface studdao {public list <map <map <string、string >> query(); public void save(スタッドスタッド)スロー例外;}スタッド実装クラス
パッケージ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.util.util.util.util.util.util.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 sudjdbcdao studdao {@override bip <<<< List <Map <String、String >> list = new ArrayList <Map <String、String >>(); //マップはデータの行です。リスト<マップ>はデータテーブル接続全体です。 try {con = connutils3.getConnection();ステートメントst = con.createstatement();文字列sql = "select * from stud"; resultet 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(); St.Close(); } catch(sqlexception e){e.printstacktrace(); }最後に{try {con.close(); } catch(sqlexception e){e.printstacktrace(); }} return list; } @Override public void Save(Stud Stud)スロー例外{接続con = connutils3.getConnection(); system.out.println( "リンクを取得:"+con); string sql = "surting into stud values(?、?)"; string uuid = uuid.randomuuid()。toString()。置換( " - "、 ""); predtatement PST = con.preparestatement(SQL); Stud.SetID(UUID); //「複数のパーティー」、つまり、本は「一方のパーティー」IDを取得できます。特に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; public interface bookdao {public void save(list <book> books)Throws Exception;}本の実装クラス
パッケージcn.hncu.stud.dao;インポートjava.sql.connection; Import java.sql.preparedStatement; Import java.util.list; Import cn.hhncu.domain.book; Import cn.hncu.utils.connutils3;公開book sablight book book sablements book sablement books)スロー例外{接続con = connutils3.getConnection(); system.out.println( "リンクを取得:"+con); string sql = "book(name、rice、studid)values(?、?、?)に挿入する"; predtatement PST = con.preparestatement(SQL); for(Book B:books){pst.setString(1、b.getName()); pst.setDouble(2、b.getprice()); PST.SetObject(3、 "12132312"); //例外(故意に存在しない外部キーフィールドをテストするトランザクションロールバックをテストする) - テストトランザクションロールバック// pst.setobject(3、b.gets()。getId()); System.out.println( "1:"+b.getName()+"、2:"+b.getPrice()+"、3:"+b.gets()。getId()); pst.addbatch(); // batchに追加} pst.executebatch(); // batch // con.close(); //ここで同じconを取得します、ここで閉じる必要はありません}}}Show Student Information Page jsps/show.jsp
<%@ page Language = "Java" Import = "Java.util。*" PageEncoding = "UTF-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core <c:foreach items = "$ {studs}" var = "x"> $ {x.id}、$ {x.name} <br/> </c:foreach> </body> </html>複製画像:
管理システムの詳細については、「管理システムの特別トピック」をクリックして学習してください
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。