Java後臺開發必備技能JDBC+Servlet+JSP

boker_han發表於2017-10-24

前言:

學習Java後端開發的過程中,很多情況下都要和資料庫打交道,如何通過Java程式去訪問資料庫,成為每一個後端開發人員必備的技能點。本文以一個簡單的
專案將資料庫(這裡使用Mysql)、JDBC、Servlet、JSP串聯起來,將其中的邏輯流暢地走一遍,由於需要用到JSP和Servlet,所以這裡建立的專案
型別是Dynamic Web Project,在此宣告:僅是自己的學習總結,如有不對的地方,還請指教,互相交流學習哈^^。

第一步 資料庫及模型層的準備(模型層)

    首先,自己的電腦上需要安裝Mysql資料庫,然後再資料庫中建立自己專案中需要要到的資料庫,資料庫名為shopping;接著在shopping資料
庫中建立資料表,表名為goods;然後向其中新增幾條記錄;這樣,資料庫方面的準備就完成啦!接著,需要針對專案中建立的資料表,設計對應的
JavaBean,用來儲存儲存從資料庫讀取的記錄。

    這裡用到的sql檔案:
        /*
        Navicat MySQL Data Transfer
        Source Server         : JDBC
        Source Server Version : 50719
        Source Host           : localhost:3306
        Source Database       : shopping

        Target Server Type    : MYSQL
        Target Server Version : 50719
        File Encoding         : 65001
        Date: 2017-10-24 20:02:59
        */
        SET FOREIGN_KEY_CHECKS=0;
        -- ----------------------------
        -- Table structure for goods
        -- ----------------------------
        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()) 
                {
                    //建立一個Goods物件,將結果集中的資訊存放到其中,再新增到集合中,最後由方法返回
                    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;
        }

        //返回資料庫中指定id的商品資訊的方法
        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>

總結

    以上就是整個專案的思路和處理流程,採用從模型層開始,接著控制層,最後檢視層的順序完成整個專案的開發!整個專案框架已經搭建好,
但是細節有待完善,本文的目的是將整體的框架搭建出來,使整個處理流程在邏輯上能夠暢通。

相關文章