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