java連線MySQL資料庫 json資料前後端互動
先在下圖資料夾中匯入相應的jar包,其中第一個紅框中的是使用json資料需匯入的7個包,第二個紅框是用JDBC連線MySQL資料庫必須的包。
連線MySQL的工具類:
package com.XXXXXX.util;
import java.sql.Connection;
import java.sql.DriverManager;
public class MysqlUtil
{
private static Connection conn = null; //資料庫連線
private static String server = "localhost"; //服務ip
private static String port = "3306"; //服務埠
public static String dbname = "XXXXX"; //資料庫名
private static String user = "root"; //資料庫使用者名稱
private static String pass = "XXXXX"; //資料庫密碼
private static String drivername = "com.mysql.jdbc.Driver"; //MySql驅動類名
private static String url = "jdbc:mysql://" + server + ":" + port + "/" + dbname + "?user=" + user + "&password=" + pass + "&useUnicode=true&characterEncoding=UTF-8"; //連線地址
public static Connection getConn()
{
try
{
Class.forName(drivername).newInstance(); //載入JDBC驅動
conn = DriverManager.getConnection(url); //建立連線
} catch (Exception e)
{
e.printStackTrace();
}
return conn;
}
}
服務端上的查詢Servlet:
package com.XXXXX.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import com.webmappoi.util.MysqlUtil;
public class GetPoiInfoServlet extends HttpServlet
{
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
/*
* response.setContentType("text/html"); PrintWriter out =
* response.getWriter();out.println(
* "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
* out.println("<HTML>");
* out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
* out.println(" <BODY>"); out.print(" This is ");
* out.print(this.getClass()); out.println(", using the GET method");
* out.println(" </BODY>"); out.println("</HTML>"); out.flush();
* out.close();
*/
this.doPost(request, response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
JSONArray array = new JSONArray();
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from university";
try
{
con = MysqlUtil.getConn();
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next())
{
JSONObject temp = new JSONObject().element("id", rs.getInt("U_ID")).element("point", rs.getString("U_Point")).element("title", rs.getString("U_Title")).element("address", rs.getString("U_Addr")).element("tel", rs.getString("U_Tel"));
array.add(temp);
}
out.print(array.toString()); //將array物件傳到前端
System.out.println(array.toString());
out.flush();
out.close();
} catch (SQLException e)
{
e.printStackTrace();
} finally
{
try
{
//依次關閉連線
if (rs != null)
{
rs.close();
rs = null;
}
if (ps != null)
{
ps.close();
ps = null;
}
if (con != null)
{
con.close();
con = null;
}
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
前端js接收array物件並解析:
$.getJSON("./servlet/GetPoiInfoServlet",function(json)
{
for(var i=0;i<json.length;i++)
{
//var json = eval(json);
//console.log(JSON.stringify(json));
//獲取經緯度
ulng = parseFloat(json[i].point.split(",")[0]); //以,分割成陣列
ulat = parseFloat(json[i].point.split(",")[1]);
var uid = parseFloat(json[i].id);
var title = json[i].title;
var address = json[i].address;
var point = json[i].point;
var tel = json[i].tel;
}
});
/********************************************************************
getJSON函式所接收的資料就是json格式,所以可以不用eval函式轉化。function中引數json就是後臺Servlet傳來的array物件。getJSON函式還有一個問題就是,用它從前端傳資料到後臺時,如果有中文的話,傳到後臺的資料就會亂碼。(網上有解決辦法,但我沒試過,我就用post方法將就了,post方法不會亂碼,但是在接收是需要用eval函式轉化。)
********************************************************************/
前端js中封裝表單成json資料:
function GetJsonData()
{
var json =
{
"point": GID("point").value,
"title": GID("title").value,
"address": $("#address").val(),
"tel": $("#tel").val()
};
return json;
}
前端js中封裝document.getElementById方法:
function GID(id)
{
return document.getElementById(id);
}
前端js中用Jquery post方法提交表單json資料:
function post()
{
/*$("#status").html("正在提交資料,請勿關閉當前視窗...");
var url = GID("form1").action;
//alert(JSON.stringify(GetJsonData()));
$.ajax(
{
type: "POST",
//url: "./servlet/AddPoiDataServlet",
url: url,
//contentType: "application/json; charset=utf-8",
data: {data: JSON.stringify(GetJsonData())},
//dataType: "json",
success: function (json)
{
if (json.length > 0)
{
alert("提交成功!");
}
},
error: function (json)
{
$("#status").html("提交資料失敗!");
}
});*/
var url = GID("form1").action;
//alert(url);
$("#status").html("正在提交資料,請勿關閉當前視窗...");
$.post(url,{data:JSON.stringify(GetJsonData())},function (msg)
{
//alert("提交成功!");
$("#status").html("提交成功!");
});
}
/*******************************************************************************
JSON.stringify()函式是為了將json資料字串化。Jquery ajax和post方法都能將表單傳到後端,post方法封裝了ajax,用起來更簡單。
******************************************************************************/
後臺Servlet接收前端傳來的json資料並儲存到MySQL資料庫中:
//System.out.println("地名:" + request.getParameter("title") + "<br>");
JSONObject json = JSONObject.fromObject(request.getParameter("data")); //獲取前端傳來的data
System.out.println(json.toString());
Connection con = null;
PreparedStatement ps = null;
int result = 0;
String sql = "insert into university(U_Point,U_Title,U_Addr,U_Tel) values(?,?,?,?)";
try
{
con = MysqlUtil.getConn();
ps = con.prepareStatement(sql);
ps.setString(1, json.getString("point"));
ps.setString(2, json.getString("title"));
ps.setString(3, json.getString("address"));
ps.setString(4, json.getString("tel"));
result = ps.executeUpdate();
out.print(json.toString());
System.out.println(json.toString());
out.flush();
out.close();
} catch (SQLException e)
{
e.printStackTrace();
} finally
{
try
{
if (ps != null)
{
ps.close();
ps = null;
}
if (con != null)
con.close();
con = null;
} catch (SQLException e)
{
e.printStackTrace();
}
}
其它的修改,刪除Servlet:
刪除servlet:
String sql = "delete from university where U_ID=?";
try
{
con = MysqlUtil.getConn();
ps = con.prepareStatement(sql);
ps.setInt(1, json.getInt("id"));
result = ps.executeUpdate();
json.put("result", true);
out.print(json.toString());
System.out.println(json.toString());
out.flush();
out.close();
}
修改servlet:
String sql = "update university set U_Title=?,U_Addr=?,U_Tel=? where U_Point=?";
try
{
con = MysqlUtil.getConn();
ps = con.prepareStatement(sql);
ps.setString(1, json.getString("title"));
ps.setString(2, json.getString("address"));
ps.setString(3, json.getString("tel"));
ps.setString(4, json.getString("point"));
result = ps.executeUpdate();
//json.put("result", true);
out.print(json.toString());
System.out.println(json.toString());
out.flush();
out.close();
}
模糊查詢:
前端js傳輸查詢條件並接受後臺查詢資料庫之後傳過來的json資料:
function selectInfo() //模糊查詢
{
var json =
{
"title": GID("info").value
};
//alert(JSON.stringify(json));
$.post("./servlet/SelectPoiInfoServlet",{data:JSON.stringify(json)},function(json)
{
for(var i=0;i<json.length;i++)
{
var json = eval(json);
//獲取經緯度
ulng = parseFloat(json[i].point.split(",")[0]);
ulat = parseFloat(json[i].point.split(",")[1]);
var uid = parseFloat(json[i].id);
var title = json[i].title;
var address = json[i].address;
var point = json[i].point;
var tel = json[i].tel;
}
});
}
/*****************************************************************************************
這裡不能用getJSON方法,因為如果前端傳過來json資料有中文,到後臺就會亂碼,所以就用post方法。如果這裡傳的不是json陣列,而僅僅是一個json物件,就需要將eval函式改為var json = eval("(" + json + ")");
,不然前端會報錯:SyntaxError: missing ; before statement。
******************************************************************************************/
後臺模糊查詢的servlet:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
JSONObject json = JSONObject.fromObject(request.getParameter("data"));
System.out.println(json.toString());
JSONArray array = new JSONArray();
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select * from university where U_Title like ?";
try
{
con = MysqlUtil.getConn();
ps = con.prepareStatement(sql);
ps.setString(1, "%" + json.getString("title") + "%");
rs = ps.executeQuery();
while (rs.next())
{
JSONObject temp = new JSONObject().element("id", rs.getInt("U_ID")).element("point", rs.getString("U_Point")).element("title", rs.getString("U_Title")).element("address", rs.getString("U_Addr")).element("tel", rs.getString("U_Tel"));
array.add(temp);
}
out.print(array.toString()); //將array物件傳到前端
System.out.println(array.toString());
out.flush();
out.close();
}
關於模糊查詢:
參考JDBC 模糊查詢 傳參問題,附文如下:
錯誤寫法:String sql = “select * from tableName where column like ‘%?%’”;
這樣寫,?是不能傳參進來的,因為編譯的時候?沒被編譯成傳參標識,所以執行時會丟擲SQLException。
正確寫法有兩種:
1、String sql = “select * from tableName where column like ‘%” + columnValue + “%’”; //可以直接將變數值寫進sql語句
2、String sql = “select * from tableName where column like ?”; //可以利用jdbc的傳參函式傳進
PreparedStatement ps = conn.PreparedStatement(sql);
ps.setString(1, “%” + columnValue + “%”);
其中遇到的問題:
1. 使用自己安裝的jdk時會報錯(如下圖),只有用Myeclipse自帶的版本才可以。
我所使用的JDK版本及MyEclipse的JDK版本如下:
只有選中下面那個Sun JDK 1.6.0_13才不會報錯,不知道why?
2. 在Servlet中修改doPost()或doGet()方法,釋出到瀏覽器時,仍出現This is class XXXXXXXX, using the POST method的字樣,如圖:
解決辦法是:重啟Tomcat,重新發布。