天天看点

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

	
}