JAVA實現JNDI串連資料庫

來源:互聯網
上載者:User

第一步:實現一個Java類:

package com.citichy.fileupload.property;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import java.sql.Date;
public class Test{
  private Connection con;
  private Statement stmt;
  private ResultSet rs;
  private PreparedStatement pstmt;
  public static int error=0;
  public static synchronized Connection getCon()throws Exception{
     Context ctx;
     DataSource ds;
     try{
      ctx = new InitialContext();
      ds = (DataSource)ctx.lookup("java:comp/env/jdbc/DBPool");
      if(ds==null){
       System.err.println();
       System.err.println("資料連線開啟+"+(++error));
      }
      return ds.getConnection();
     }catch(SQLException e){
      System.out.println(e);
      throw e;
  }catch(NamingException e){
      System.out.print(e);
      throw e;
  }
   }
 
 public Statement getStmtread(){
  try{
   con=getCon();
   stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
  }catch(Exception e){
   System.out.println("getStmtread");
   System.out.println(e.getMessage());
  }
  return stmt;
 }
 
public int getRowCount(String sql){
 int count=0;;
 try{
  stmt=this.getStmtread();
  rs=stmt.executeQuery("SELECT COUNT(*) FROM "+sql);
  rs.getMetaData();
  if(rs.next()){
   count=rs.getInt(1);
  }else{
   count=-1;
  }
 }catch(Exception e){
  System.out.println("getRowCount");
  System.out.println(e.getMessage());
  count=-2;
 }finally{
  this.close();
 }
  return count;
 }
 
 public Statement getStmt(){
  try{
   con=getCon();
   stmt=con.createStatement();
  }catch(Exception e){
   System.out.println("getStmt");
   System.out.println(e.getMessage());
  }
  return stmt;
 }
 
 
 public PreparedStatement getPstmt(String sql){
  try{
   con=getCon();
   pstmt=con.prepareStatement(sql);
  }catch(Exception e){
   System.out.println("getPstmt");
   System.out.println(e.getMessage());
  }
  return pstmt;
 }
  
 public void close(){
  try{
  if(rs!=null)rs.close();
   }catch(Exception e){
   }
   try{
    if(stmt!=null)stmt.close();
   }catch(Exception e){
   }
   try{
    if(con!=null){
     con.close();
     con=null;
     System.err.println();
     System.err.println("資料連線關閉-"+(--error));
    }
   }catch(Exception e){
    System.out.println("close");
    System.out.println(e.getMessage());
   }
 }
 
 public String inStr(String str){
  String tempstr=null;
   if(str==null){
    str="";
   }else{
    try{
     tempstr=new String(str.getBytes("ISO-8859-1"),"GB2312");
    }catch(Exception e){
     System.out.println(e.getMessage());
    }
   }
  return tempstr;
 }
  
 public String outStr(String str){
  if(str==null){
   str="";
  }else{
   try{
    str=str.replace((char)1,'\'');
   }catch(Exception e){
    System.out.println("outStr");
    System.out.println(e.getMessage());
   }
  }
  return str;
 }
  
 public int selectdata(String sqls){
  int k=-10;
  try{
   k=0;
   rs=this.getStmtread().executeQuery(sqls);
   while(rs.next()){
    k++;
   }
  }catch(Exception ex){
   k=-1;
   System.out.println("select");
   System.out.println(ex.getMessage());
   this.close();
  }finally{
   this.close();}
   return k;
 }
 
 public int updata(String sqls){
  int k=-10;
  try{
   k=0;
   k=this.getStmt().executeUpdate(sqls);
  }catch(Exception ex){
   k=-1;
   System.out.println("updata");
   System.out.println(ex.getMessage());
   this.close();
  }finally{this.close();}
   return k;
 }
  
  
 public Date StrConvertDate(String strdate{ 
  Date convertdate=null;
  try{   
   convertdate= Date.valueOf(strdate);
   System.out.print("列印日期");
   System.out.print(convertdate.toString());
  }catch(Exception ex){ex.printStackTrace();}
   return convertdate;
  }
}
 
 
 //接下來是重點,也就是getCon()是如何擷取到串連的
 
 //第二部:配置web.xml檔案
 
   <!-- JNDI -->
   <resource-ref>
     <description> MySQL DB Connection Pool </description>
     <res-ref-name> jdbc/DBPool </res-ref-name>
     <res-type> javax.sql.DataSource </res-type>
     <res-auth> Container </res-auth>
     <res-sharing-scope> Shareable </res-sharing-scope>
   </resource-ref>
 
 紅色字型與Java檔案中的必需一致,編譯時間時通過這些描述符來實現映射
 java:comp/env/jdbc/DBPool(虛地址)   ------>    映射描述符   ------>       jdbc/DBPool(實際的地址)
 單單這樣子還是不夠的,在Tomcat中還需要和該web.xml檔案建立串連
 
 
 
// 第三步:配置Tomcat目錄下conn檔案夾中的context.xml設定檔
 
 在<Context>
 
   <Resource
     name="jdbc/DBPool"
     type="javax.sql.DataSource"
     password=""
     driverClassName="com.mysql.jdbc.Driver"
     maxIdle="20"
     maxWait="5000"
     username="root"
     url="jdbc:mysql://localhost:3306/logistic"
    />
 
 </Context>
 
 以上是以MySql作為資料庫,如果用其他資料庫,改變url和driverClassName即可,但必需保證使用者名稱、密碼正確。
 完成以後,還要將串連資料庫的jar包,放在    Tomcat6/lib    目錄下,而  Tomcat6/bin  下不需要放此jar包 。
 
 可能有的網友調試的時候會報這個錯誤:
  javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter,  or in an application resource file:  java.naming.factory.initialException in thread "main" javax.naming.NoInitialContextException:
Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
  at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
  at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
  at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
  at javax.naming.InitialContext.lookup(InitialContext.java:392)
  at gzgl.DataConnect.getCon(DataConnect.java:31)
  at gzgl.DataConnect.main(DataConnect.java:23)
 
 這是因為通過JNDI擷取串連,程式必須通過Tomcat容器來載入串連,即通過web.xml來建立串連,如果只是在Java代碼裡面測試,是無法擷取到串連的,因此,可以通過JSP(如index,jsp裡面)進行如下測試:
 
 <%@ page language="java"  pageEncoding="UTF-8"%>   
 <%@page contentType="text/html; charset=UTF-8"%>   
 <%@page import="java.sql.*" %>   
 <%@page import="javax.naming.*" %>   
 <%@page import="javax.sql.DataSource" %> 
 <%@page import="com.logistic.data.*" %> 
 <head>   
 <title>Tomcat6.0 JNDI!</title>  
 </head>  
     
   <body>   
     This is my JSP page. <br>   
     JNDI ... <br>   
 <%   
 try {    
    DataConnect.getCon();
    out.println("串連成功...");
 } catch (Exception e) {   
     e.printStackTrace();   
 }
 %>   
   </body>   
 </html> 
 
 在瀏覽器輸入地址,可以看到運行結果
 
 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.