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();
}
}
}
}