前言:
學習Java後端開發的過程中,很多情況下都要和資料庫打交道,如何通過Java程式去訪問資料庫,成為每一個後端開發人員必備的技能點。本文以一個簡單的
專案將資料庫(這裡使用Mysql)、JDBC、Servlet、JSP串聯起來,將其中的邏輯流暢地走一遍,由於需要用到JSP和Servlet,所以這裡建立的專案
型別是Dynamic Web Project,在此宣告:僅是自己的學習總結,如有不對的地方,還請指教,互相交流學習哈^^。
第一步 資料庫及模型層的準備(模型層)
首先,自己的電腦上需要安裝Mysql資料庫,然後再資料庫中建立自己專案中需要要到的資料庫,資料庫名為shopping;接著在shopping資料
庫中建立資料表,表名為goods;然後向其中新增幾條記錄;這樣,資料庫方面的準備就完成啦!接著,需要針對專案中建立的資料表,設計對應的
JavaBean,用來儲存儲存從資料庫讀取的記錄。
這裡用到的sql檔案:
SET FOREIGN_KEY_CHECKS=0 ;
DROP TABLE IF EXISTS `goods` ;
CREATE TABLE `goods` (
`id` int (11 ) NOT NULL AUTO_INCREMENT,
`name` varchar (50 ) DEFAULT NULL ,
`origin` varchar (50 ) DEFAULT NULL ,
`price` int (11 ) DEFAULT NULL ,
`stock` int (11 ) DEFAULT NULL ,
PRIMARY KEY (`id` )
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
package com.model;
/**
* 與資料庫shopping中的goods資料表相對應的JavaBean
*/
public class Goods {
private int id;
private String name;
private int price;
private String origin;
private int stock;
public int getId ()
{
return id;
}
public void setId (int id)
{
this .id = id;
}
public String getName ()
{
return name;
}
public void setName (String name)
{
this .name = name;
}
public int getPrice ()
{
return price;
}
public void setPrice (int price)
{
this .price = price;
}
public String getOrigin ()
{
return origin;
}
public void setOrigin (String origin)
{
this .origin = origin;
}
public int getStock ()
{
return stock;
}
public void setStock (int stock)
{
this .stock = stock;
}
}`
第二步 資料庫連線的準備(服務層)
首先,下載JDBC所用的jar包,將jar包拷貝到專案的lib資料夾下,然後右擊jar包,選擇Build Path,將jar包新增到當前專案的路徑
中;接著,進行獲取資料庫連線的程式碼編寫;程式碼如下所示。
package com.dbhelper;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 專門用於提供資料庫連線的類
*/
public class DBHelper {
private static final String driver = "com.mysql.jdbc.Driver" ;
private static final String url = "jdbc:mysql://localhost:3306/shopping" ;
private static final String user = "root" ;
private static final String password = "root" ;
private static Connection conn = null ;
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection (){
if (conn==null ) {
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
}
return conn;
}
}
第三步 訪問資料庫的業務處理(服務層)
這裡,我們將訪問資料庫的業務邏輯只侷限在從資料庫中讀取響應的資料,其他的業務(如向資料庫中寫資料(增)、刪除資料(刪)、更新資料
(改))並沒有進行程式碼的編寫,但是這些操作的實現所需的知識點,專案中給出的兩個業務邏輯處理方法都涵蓋,只需要將對應的sql語句做適當
的修改即可。
package com.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import com.model.Goods;
import com.dbhelper.DBHelper;
/**
* 專門用於提供對資料庫進行處理的方法的類
*/
public class DBService {
private static Connection conn = DBHelper.getConnection();
public ArrayList<Goods> query () {
ArrayList<Goods> list = null ;
String sql = "select id,name,price,origin,stock from goods where 1=1" ;
PreparedStatement statement = null ;
ResultSet rs = null ;
Goods good = null ;
try {
statement = conn.prepareStatement(sql);
rs = statement.executeQuery();
if (rs==null )
{
return null ;
}
list = new ArrayList<>();
while (rs.next())
{
good = new Goods();
good.setId(rs.getInt("id" ));
good.setName(rs.getString("name" ));
good.setPrice(rs.getInt("price" ));
good.setOrigin(rs.getString("origin" ));
good.setStock(rs.getInt("stock" ));
list.add(good);
}
good = null ;
} catch (SQLException e) {
e.printStackTrace();
}finally {
if (rs!=null )
{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null )
{
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return list;
}
public Goods queryById (int id) {
Goods good = null ;
PreparedStatement statement = null ;
ResultSet rs = null ;
String sql = "select id,name,price,origin,stock from goods where id = ?" ;
try {
statement = conn.prepareStatement(sql);
statement.setInt(1 , id);
rs = statement.executeQuery();
if (rs == null )
{
return null ;
}
while (rs.next()) {
good = new Goods();
good.setId(rs.getInt("id" ));
good.setName(rs.getString("name" ));
good.setPrice(rs.getInt("price" ));
good.setOrigin(rs.getString("origin" ));
good.setStock(rs.getInt("stock" ));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
if (rs!=null ) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null ) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return good;
}
}
第四步 Servlet的準備(控制層)
專案中利用Servlet讀取使用者請求、呼叫業務處理層進行處理請求以及響應客戶的請求。
package com.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dao.DBService;
import com.model.Goods;
@SuppressWarnings ("serial" )
public class ServiceServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doPost(request,response);
}
@Override
protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
System.out.println("post請求處理中..." );
String id = request.getParameter("idnum" );
System.out.println(id);
DBService dbservice = new DBService();
Goods good = dbservice.queryById(Integer.valueOf(id));
request.setAttribute("good" , good);
request.getRequestDispatcher("/result.jsp" ).forward(request, response);
}
}
第五步 JSP的準備(檢視層)
這裡採用兩個JSP檔案作為檢視層,其中,query.jsp檔案負責將客戶的請求傳送到Servlet中,由Servlet進行請求的接收、處理和響應
,這裡的響應為將處理請求的結果傳送到另一個jsp檔案,該檔案(result.jsp)將處理的結果展示到jsp頁面上。
query.jsp檔案:
<%@ page language="java" contentType="text/html; charset=utf-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html >
<head >
<meta http-equiv ="Content-Type" content ="text/html; charset=utf-8" >
<title > Insert title here</title >
</head >
<body >
<form name ="demandForm" action ="com/servlet/ServiceServlet" method ="post" >
<table >
<tr >
<td > 全部查詢</td >
<td > <input type ="submit" name ="all" id ="all" value ="全部查詢" /> </td >
</tr >
</table >
</form >
<form name ="demandForm1" action ="com/servlet/ServiceServlet" method ="post" >
<table >
<tr >
<td > id查詢</td >
<td > <input type ="text" name ="idnum" id ="idnumber" /> </td >
<td > <input type ="submit" value ="id查詢" /> </td >
</tr >
</table >
</form >
</body >
</html >
result.jsp檔案:
<%@ page language="java" contentType="text/html; charset=utf-8" %>
<%@ page import="com.model.Goods" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html >
<head >
<meta http-equiv ="Content-Type" content ="text/html; charset=utf-8" >
<title > Insert title here</title >
</head >
<body >
<%
Goods good = (Goods)request .getAttribute("good" );
%>
商品id:<%=good.getId() %> <br />
商品名稱:<%=good.getName() %> <br />
商品價格:<%=good.getPrice() %> <br />
商品產地:<%=good.getOrigin() %> <br />
商品庫存:<%=good.getStock() %> <br />
</body >
</html >
總結
以上就是整個專案的思路和處理流程,採用從模型層開始,接著控制層,最後檢視層的順序完成整個專案的開發!整個專案框架已經搭建好,
但是細節有待完善,本文的目的是將整體的框架搭建出來,使整個處理流程在邏輯上能夠暢通。