天天看點

JDBC資料庫增删查改工具類

package com.jdbc.utils;
/* 
*   資料庫增删查改工具類
*   資料庫查詢資料集json化工具  getRes()
*	1、擷取資料庫資料
*	2、将查詢的資料轉換為json格式
*	3、将json資料傳給前端
*/
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.imageio.IIOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;
import Module.course;
import Module.xs;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
//可以看到一個很明顯的差別,一個用的是 { } ,一個最外面用的是 [ ] 
//JSONObject的資料是用 { } 來表示
//而JSONArray,顧名思義是由JSONObject構成的數組,用 [ { } , { } , ...... , { } ] 來表示
public class JdbcCRUDUtil {
	
//	查詢資料庫操作
/*
*servlet測試代碼:
*sqlstr1="select * from student where sex=?";
*jsonarry0=JdbcCRUDUtil.getRes(sqlstr1, request, response,xbsno0);
*/
	public static  JSONArray QueryTable(String sql0,HttpServletRequest request, HttpServletResponse response,Object...args) throws ServletException, IOException, SQLException
	{
		System.out.println("開始查詢資料庫");
//		Object...args就是object[] args參數,意思是該方法的參數是動态的,寫任意個參數都可以
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;Charset=UTF-8");

	    Connection con1=(Connection) JdbcConUtil.getConnection();
		ResultSet rs1=null;
//		rs1傳回的并不是資料庫中的資料,而是rs1相當于一個指針,此時指向資料庫中的第一行資料
	    JSONArray jsonarr1=new JSONArray();
		PreparedStatement st1=null;
		try {
			 st1=(PreparedStatement) con1.prepareStatement(sql0);
		 	for(int i=0;i<args.length;i++){
				System.out.println( args[i]);
				st1.setObject(i+1, args[i]);
			}
//			serObject的作用就是為SQL語句中變量設定值,第一個參數是第幾個屬性的意思,第二個參數是所要設的值value
		  rs1=st1.executeQuery();
			 System.out.println("st1.executeQuery()傳回查詢到的數量:"+rs1);
	   	java.sql.ResultSetMetaData md0= rs1.getMetaData();
		//getMetaData得到結果集的結構資訊,比如字段數(指資料庫該表有多少個屬性)、字段名(表中的屬性的名字)等。
		//rs.getMetaData().getColumnCount()字段數,也就是列數
		//rs.getMetaData().getColumnName(i));字段名,也就是每一列的名字
		int colno=md0.getColumnCount();//取得表的列數
			System.out.println("字段數:"+colno);
				while(rs1.next()) //可以用下面代碼實作地任何查詢結果封裝成一個Json數組
				{ 
					JSONObject json1=new JSONObject();
				  for(int i=1;i<=colno;i++)
				  { //Object obj0=rs1.getObject(i);
					json1.put(md0.getColumnName(i), rs1.getString(i));
					 System.out.println("字段名+值:"+md0.getColumnName(i)+":"+ rs1.getString(i));
				  }
				  jsonarr1.add(json1);
				}
		 }   catch (Exception e) {
					 e.printStackTrace();
		}
			JdbcConUtil.close(rs1 ,st1, con1);//關閉連接配接
			System.out.println("查詢完畢");
			return jsonarr1;
		   }
/*
*PrintWriter out1=response.getWriter();
*out1.print(jsonarr1);
*out1.flush();
*out1.close();
*前端的ajax技術将收到該jsonarray資料.
*用flush()方法,就會強制把資料輸出,緩存區就清空了,最後再關閉讀寫流調用close()就完成了.
*避免一部分資料可能會留在緩存區,造成資料丢失,清空的意思,用于清空緩沖區的資料流.
*/

	
//	插入操作
/*	Servlet的代碼:s
*   String sql0 = "insert into student(sno,sname,born,photo) values(?,?,?,?)";
*	JdbcCRUDUtil.Insert(sql0, sno0, sname0, sr0, filename);
*/
	public static Integer Insert(String sql0,Object...args) {
		Integer re=0;
		Connection con1=(Connection) JdbcConUtil.getConnection();
		java.sql.PreparedStatement pst1 = null;
		
		try {
			pst1=con1.prepareStatement(sql0);
			System.out.println("數組長度"+args.length);
			for(int i=0;i<args.length;i++) {
				System.out.println(i+1+":"+args[i]);
				pst1.setObject(i+1, args[i]);//循環為sql語句中的參數設定值,args[i]中儲存的就是前端傳過來的資料
			}
			 re=pst1.executeUpdate();
			JdbcConUtil.close(pst1, con1);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return re;
	}
	
/*	  Servlet的代碼:
 * 	  xs tempXs=new xs(sno0,sname0,sex0,sr0,filename);
	  String sql0 = "insert into student(sno,sname,sex,born,photo) values(?,?,?,?,?)";
	  JdbcCRUDUtil.InsertObject(sql0, tempXs);
*/
	public static Integer InsertObject(String sql0,xs tempXs) {
		Integer re=0;
		Connection con1=(Connection) JdbcConUtil.getConnection();
		java.sql.PreparedStatement pst1 = null;
		
		try {
			pst1=con1.prepareStatement(sql0);
			pst1.setString(1, tempXs.getSno());
			pst1.setString(2, tempXs.getSname());
			pst1.setString(3, tempXs.getSex());
			pst1.setObject(4, tempXs.getBorn());
			pst1.setString(5, tempXs.getPhoto());
			 re=pst1.executeUpdate();
			JdbcConUtil.close(pst1, con1);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return re;
	}
	
//	參數:表名,sql字段名,sql值,檔案名
	
	public static void  InsertTable(String tablename, String sqlfiestr1,String  sqlvalSTR1,String fname1,String tablname1 ) {
		if(sqlfiestr1.length()<1||sqlvalSTR1.length()<1) //那說明沒有資料上傳
			;
		else { //說明表單中有資料上傳 ,這樣才有必要寫到資料庫中。 同學們,這種偷懶 方法前提是HMTL表單中的控件name要與資料庫表列名相同才行。
		String sqlstr1="";
		if(fname1==""||fname1.equals(""))//說明沒有上傳檔案
		{	//要去掉字段名串最後多的一個逗号
			sqlfiestr1=sqlfiestr1.substring(0,sqlfiestr1.length()-1);
			sqlvalSTR1=sqlvalSTR1.substring(0,sqlvalSTR1.length()-1);
			sqlstr1="insert into "+tablename+"("+sqlfiestr1+")values("+sqlvalSTR1+")";
		 
		}
		else //表示有檔案上來,檔案名不為空 .調整insert串照片參數
		{  sqlfiestr1=sqlfiestr1+"photo";
		  int po=fname1.lastIndexOf("\\"); //隻保留後面的檔案名,不要前面路徑
		 if(po!=-1)//說明找到了右斜杠\
		 { fname1=fname1.substring(po+1);}
		  sqlvalSTR1=sqlvalSTR1+"'"+fname1+"'";  
		   sqlstr1="insert into "+tablename+"("+sqlfiestr1+")values("+sqlvalSTR1+")";
		}
		   
		System.out.println(sqlstr1);
		Connection con1=(Connection) JdbcConUtil.getConnection();
		Statement st1;
		try {
			st1 = (Statement) con1.createStatement();
			  st1.execute(sqlstr1);
			  JdbcConUtil.close(st1, con1);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
	}

	
}