手把手搭建一個完整的javaweb項目(適合新手)


本篇文章僅供參考。如果您遇到了問題,建議自己使用英文進行google搜索。而不是當一個不經過自己努力和思考的伸手黨

本文章以前在CSDN發布點此查看

2021/02/24更新:僅做參考,建議學習SpringBoot。

說明1:只是實現了簡單的操作,但是邏輯並不嚴謹(比如並沒有進行密碼的加密,也沒有進行對不規范字符串的判斷),僅適合新手,望注意。
說明2:這個項目是在我的macbookpro上運行的。windows用戶的環境配置可能不一樣。望注意
前提:正確建立了一個javaweb項目(web項目建立教程

開發環境與工具

  1. IntelliJ IDEA 2018.3.3(Ultimate Edition)(Mac版本)
  2. Mysql Workbench8.0
  3. jdk11
  4. Tomcat for mac ( 安裝教程 )

工具包
添加下包三個jar包,放到lib文件夾中。 jar包鏈接
密碼:rglh
在這里插入圖片描述
功能說明

  1. 用戶登錄
  2. 新用戶注冊
  3. 用戶列表展示
  4. 用戶信息刪除
  5. 用戶信息更新

操作步驟

  1. 在mysql建立一個新表Student,里面有name,password,id(為了簡化操作,所以只有三列並且都是String類型)
create table if not exists Student (name varchar(10) primary key,
password varchar(10) not  null,
id varchar(10) not null);
  1. 插入數據
insert into Student(name,password,id) values("005",123,5);
insert into Student(name,password,id) values("004",123,4);
insert into Student(name,password,id) values("003",123,3);
insert into Student(name,password,id) values("002",123,2);
insert into Student(name,password,id) values("001",123,1);
  1. 打開intellij新建一個javaweb項目,具體操作參考我的博客
  2. 導入連接數據庫的jar包,具體操作參考我的博客 intellij導數據庫jar包
  3. 建立對應的包結構
    filter //過濾器,解決中文字符集亂碼
    util //數據庫連接工具類
    entity //實體類
    dao //數據操作類
    servlet //servlet類
    ![在這里插入圖片描述](https://img-blog.csdnimg.cn/2019031619130537.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1cm9uZzMzMzMz,size_16,color_FFFFFF,t_70
  4. 在filter下新建一個EncodingFilter用來解決中文字符集亂碼,它需要實現Filter接口,並重寫doFilter函數
package filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//在filter下新建一個EncodingFilter用來解決中文字符集亂碼,它需要實現Filter接口,並重寫doFilter函數
public class EncodingFilter implements Filter {
    public EncodingFilter() {
        System.out.println("過濾器構造");
    }
    
    public void destroy() {
        System.out.println("過濾器銷毀");
    }
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8"); //將編碼改為utf-8
        response.setContentType("text/html;charset=utf-8");
        chain.doFilter(request, response);
    }
    
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("過濾器初始化");
    }
}

  1. web.xml的全部配置信息
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
         
    <display-name></display-name>
    
    <filter><!-- 過濾器配置-->
        <filter-name>EncodingFilter</filter-name>
        <filter-class>filter.EncodingFilter</filter-class><!--全路徑 從根包開始一直到類名-->
    </filter>

    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern> <!--*即為過濾所有-->
    </filter-mapping>
    
    <servlet><!--servlet類路徑配置-->
        <servlet-name>loginServlet</servlet-name>
        <servlet-class>servlet.loginServlet</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>registerServlet</servlet-name>
        <servlet-class>com.servlet.registerServlet</servlet-class>
    </servlet>
    
    <servlet>
        <servlet-name>showAllServlet</servlet-name>
        <servlet-class>servlet.showAllServlet</servlet-class>
    </servlet>
    
    <servlet>
        <servlet-name>deleteServlet</servlet-name>
        <servlet-class>com.servlet.deleteServlet</servlet-class>
    </servlet>
    
    <servlet>
        <servlet-name>updateServlet</servlet-name>
        <servlet-class>servlet.updateServlet</servlet-class>
    </servlet>
    
    <servlet-mapping><!--servlet類映射配置-->
        <servlet-name>loginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>registerServlet</servlet-name>
        <url-pattern>/registerServlet</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>showAllServlet</servlet-name>
        <url-pattern>/showAllServlet</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>deleteServlet</servlet-name>
        <url-pattern>/deleteServlet</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>updateServlet</servlet-name>
        <url-pattern>/updateServlet</url-pattern>
    </servlet-mapping>
    
    <welcome-file-list><!--默認首頁地址-->
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
    
</web-app>


  1. 在util下新建一個DBconnect類用來處理對數據庫的連接操作(用戶名或密碼按照自己的數據庫更改)
package com.util;
import java.sql.*;
public class DBconnect
{
    static String url="jdbc:mysql://localhost:3306/DataTest?useSSL=false";
    static String user="root";
    static String pw = "12345678";
    static Connection conn=null;
    static PreparedStatement ps=null;
    static ResultSet rs=null;
    static Statement st=null;

    public static void init() throws SQLException, ClassNotFoundException {//SQl程序初始化
        try{
            Class.forName("com.mysql.jdbc.Driver");//注冊驅動
            conn= DriverManager.getConnection(url, user, pw);  //建立連接
        }catch (Exception e){
            System.out.println("SQL程序初始化失敗");
            e.printStackTrace();
        }
    }

    public static int addUpdateDelete(String sql){
        int i=0;
        try{
            ps=conn.prepareStatement(sql);
            boolean flag= ps.execute();
            if(flag==false){//如果第一個結果是結果集對象,則返回true;如果第一個結果是更新計數或者沒有結果,則返回false
                i++;
            }
        }catch(Exception e){
            System.out.println("數據庫增刪改異常 ");
            e.printStackTrace();
        }
        return i;
    }

    public static ResultSet selectSql(String sql){
        try{
            ps=conn.prepareStatement(sql);
            rs=ps.executeQuery();

        }catch(Exception e){
            System.out.println("數據庫查詢異常");
            e.printStackTrace();
        }
        return rs;
    }

    public static  void closeConn(){
        try{
            conn.close();
        }catch(Exception e){
            System.out.println("數據庫關閉異常");
            e.printStackTrace();
        }
    }
}
  1. 在entity下新建一個MyUser實體類(實體即抽象出來的用戶對象,對應數據庫中的Student表,表中每個字段在實體中為一個屬性,也可以理解為一個User對象對應數據庫中的Student表一條記錄)
package entity;

public class MyUser {
    private String name;
    private String password;
    private String id;
    
    public MyUser(){}

    public MyUser(String name,String password,String id){
        this.name=name;
        this.password=password;
        this.id=id;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
    

    public MyUser(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String username) {
        this.name = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


}

  1. 在dao下新建一個UserDao接口 以及對應的方法實現類(使用接口類是為了規范開發)

UserDao類

package dao;
import java.util.List;
import entity.MyUser;

public interface UserDao {
    public boolean login(String name,String password);
    public boolean register(MyUser user);
    public List<MyUser> getUserAll();//返回用戶信息集合
    public boolean delete(String id);//根據id刪除
    public boolean update(String name, String id);
}

UserDaoImplement類

package dao;

import entity.MyUser;
import util.DBconnect;

import java.lang.invoke.MutableCallSite;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDaoImplement implements UserDao {
    public boolean login(String name, String password) {
        boolean flag = false;
        try {
            try{
                DBconnect.init();
            }catch (Exception e){
                e.printStackTrace();
            }
            //注意查詢語句中的單引號雙引號
            ResultSet rs = DBconnect.selectSql("select * from student where name='" + name + " 'and password='" + password + "';");
            while (rs.next()) {
                if (rs.getString("name").equals(name) && rs.getString("password").equals(password)) {
                    flag = true;
                }
            }
            DBconnect.closeConn();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return flag;
    }

    public boolean register(MyUser user) {
        boolean flag = false;
        try{
            DBconnect.init();
        }catch (Exception e){
            e.printStackTrace();
        }
        int i = DBconnect.addUpdateDelete("insert into student(name,password,id) " +
                "values('" + user.getName() + "','" + user.getPassword() + "','"+user.getId()+" ' )");
        if (i > 0) {
            flag = true;
        }
        DBconnect.closeConn();
        return flag;
    }

    public List<MyUser> getUserAll() {//返回用戶信息集合
        List<MyUser> list = new ArrayList<>();
        try {
            try{
                DBconnect.init();
            }catch (Exception e){
                e.printStackTrace();
            }
            ResultSet rs = DBconnect.selectSql("select * from student");
            while (rs.next()) {
                String nameone=rs.getString("name");
                String passwordone=rs.getString("password");
                String idone=rs.getString("id");
                MyUser user=new MyUser(nameone,passwordone,idone);
                list.add(user);
            }
            DBconnect.closeConn();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

    public boolean delete(String id) {//根據id刪除{
        boolean flag = false;
        try{
            DBconnect.init();
        }catch (Exception e){
            e.printStackTrace();
        }
        String sql = "delete from student where id='" + id+"'";
        int i = DBconnect.addUpdateDelete(sql);//i的意義:
        if (i > 0) {
            flag = true;
        }
        DBconnect.closeConn();
        return flag;
    }

    public boolean update(String name, String id) {
        boolean flag = false;
        try{
            DBconnect.init();
        }catch (Exception e){
            e.printStackTrace();
        }
        String sql = "update student set name ='" + name

                +"'"+"where id = '" + id+"'";

        int i = DBconnect.addUpdateDelete(sql);
        System.out.println("1"+" "+i);
        if (i > 0) {
            flag = true;
        }
        DBconnect.closeConn();
        return flag;
    }

}

  1. 在servlet下創建loginServlet用來實現對用戶登錄的操作
package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.UserDao;
import dao.UserDaoImplement;

public class loginServlet extends HttpServlet {  //需要繼承HttpServlet  並重寫doGet  doPost方法

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);  //將信息使用doPost方法執行   對應jsp頁面中的form表單中的method
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name"); //得到jsp頁面傳過來的參數
        String password = request.getParameter("password");

        UserDao ud = new UserDaoImplement();

        if (ud.login(name, password)) {
            //request.setAttribute("hello", "歡迎用戶" + name); //向request域中放置信息
          request.getRequestDispatcher("/success.jsp").forward(request, response);//轉發到成功頁面
        } else {
            response.sendRedirect("login.jsp"); //重定向到首頁
        }
    }
}
  1. 在servlet下創建一個registerServlet用來實現用戶注冊的操作
package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.text.*;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.UserDao;
import dao.UserDaoImplement;
import entity.MyUser;

public class registerServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String name = request.getParameter("name"); //獲取jsp頁面傳過來的參數
        String pwd = request.getParameter("password");
        String id = request.getParameter("id");

        MyUser user = new MyUser(); //實例化一個對象,組裝屬性
        user.setName(name);
        user.setPassword(pwd);
        user.setId(id);

        UserDao ud = new UserDaoImplement();

        if(ud.register(user)){
            request.setAttribute("name", name);  //向request域中放置參數
            request.getRequestDispatcher("/login.jsp").forward(request, response);  //轉發到登錄頁面
        }else{
            response.sendRedirect("register.jsp");//注冊失敗則返回注冊頁面,但是缺少提示"注冊失敗"
        }
    }
}
  1. 在servlet下創建shouAllServlet用來返回數據庫中所有用戶信息
package servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.UserDao;
import dao.UserDaoImplement;
import entity.MyUser;

public class showAllServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        UserDao ud = new UserDaoImplement();
        List<MyUser> userAll = ud.getUserAll();
        request.setAttribute("all", userAll);
        request.getRequestDispatcher("showAll.jsp").forward(request, response);
    }
}
  1. 在servlet下創建updateServlet用來更新用戶信息(在此僅僅根據id來更新用戶姓名,邏輯性很弱
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.UserDao;
import dao.UserDaoImplement;
import entity.MyUser;

public class updateServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String id = request.getParameter("id");

        String name = request.getParameter("name"); //獲取jsp頁面傳過來的參數

        UserDao ud = new UserDaoImplement();

        if(ud.update(name, id)){
            request.getRequestDispatcher("/addUpdateDeleteSuccess.jsp").forward(request, response);
        }else{
            response.sendRedirect("addUpdateDeleteFail.jsp");
        }
    }
}

補充:在servlet下創建deleteServlet用來刪除用戶信息

package 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 dao.UserDao;
import dao.UserDaoImplement;

public class deleteServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String id = request.getParameter("id");

        UserDao ud = new UserDaoImplement();

        if (ud.delete(id)) {
            request.getRequestDispatcher("addUpdateDeleteSuccess.jsp").forward(request, response);
        } else {
            response.sendRedirect("addUpdateDeleteFail.jsp");
        }
    }
}

  1. 新建各種jsp頁面

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
    <title>登錄注冊頁面</title>
</head>
<body >

<form action="loginServlet"  method="post"  style="padding-top:-700px;">
    用戶名:<input type="text" name="name"value=""><br><br>
    密碼:  <input type="password" name="password"value=""><br><br>
    <input type="submit"value="登錄"name="login"><input type="reset"value="重置"><br>
</form>

<form action="register.jsp">
    <input type="submit"value="新用戶注冊">
</form>

</body>
</html>

success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>My JSP 'success.jsp' starting page</title>
</head>
<body>
<br>
<a href="showAllServlet">查看所有用戶</a>
</body>
</html>

register.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>My JSP  starting page</title>
</head>
<body >
<form action="registerServlet"method="post" style="padding-top:-700px;">
    輸入姓名:<input name="name" type="text"><br><br>
    輸入密碼:<input name="password" type="password"><br><br>
    輸入id:<input name="id" type="text" ><br><br>

    <input type="reset"value="重置"><input type="submit"value="注冊">
</form>
</body>
</html>

showAll.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.entity.MyUser" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.dao.UserDao" %>
<%@ page import="com.dao.UserDaoImplement" %>
<%@ page import="java.lang.ref.ReferenceQueue" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>所有用戶頁面</title>
  </head>

<body>

<!--以下兩段代碼放在body中不要放在<html>之外-->
<%
String path=request.getContextPath();
String basepath=request.getScheme()+"://"+ request.getServerName()+":"+request.getServerPort()+"/";
%>
<!-- 使用from提交數據,不能在不刷新頁面的情況下直接在當前頁面顯示處理過的后台數據-->
 <c:forEach var="U" items="${requestScope.all}"  >
      <form action="updateServlet" method="post">
       <tr>
	       <td><input type="text" value="${U.name}" name="name" ></td>
	       <td><input type="text" value="${U.password}" name="password"></td>
            <td><input type="text" value="${U.id}" name="id"></td>
           <td><a href="deleteServlet?id=${U.id}">刪除</a> <input type="submit" value="更新"/></td>
	   </tr>
    </form>
    </c:forEach>
</body>
</html>

addUpdateDeleteFail.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>addUpdatedDeleteFail</title>
</head>
<body>
<p>addUpdateDeleteFail</p>
</body>
</html>

addUpdateDeleteSuccess.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>addUpdateDeleteSuccess</title>
</head>
<body>
<a href="showAllServlet">查看所有用戶</a>
</body>
</html>

操作截圖

  1. 開啟Tomcat,運行login.jsp,展示首頁
    在這里插入圖片描述

  2. 輸入名字001與密碼123,登錄成功進入loginServlet,點擊查看所有用戶,顯示用戶信息
    在這里插入圖片描述
    在這里插入圖片描述

  3. 點擊刪除,若是刪除成功則返回所有用戶列表,否則返回addUpdateDelete.jsp(這里不展示刪除具體的例子)

  4. 在首頁點擊注冊,進入注冊頁面,注冊007,注冊完成會返回登錄頁面
    在這里插入圖片描述

遇到的問題以及解決方式

問題1
在showAll.jsp頁面中顯示了所有數據庫的數據,但是刪除或者更改其中的一個數據,再想返回修改數據之后的當前頁面,就會出現錯誤。

問題症結所在:jsp頁面回顯數據

分析:前端提交數據,主要有兩種方式。from表單與ajax異步提交。兩種方式都可以提交數據到后台。但是想讓后台數據返回當前頁面顯示的話,在不刷新整個頁面的前提下,就需要使用ajax,因為ajax可以實現異步刷新

解決方式:在此轉換了一個思路。刪除或者更新之后,先跳轉到addUpdateDeleteSuccess.jsp,這個jsp界面有個按鈕鏈接可以跳轉到showAll.jsp界面,然后再顯示所有用戶的信息(其實使用ajax解決也是ok的)

問題2:端口1099被占用
解決方式:
1) 在mac終端輸入lsof -i tcp:1099,查看是哪個進程占用1099
2) 知道是進程80049占用
輸入sudo kill -9 80049,即可解決問題
在這里插入圖片描述
問題3
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
解決:
將數據庫連接的jar文件導入到工程的web/WEB-INF/lib中(查詢連接https://blog.csdn.net/mayuko2012/article/details/72971997)

問題4:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column...

分析:出現這個異常的很大可能性是 數據庫是沒有問題的!關鍵原因是:你從傳過來的參數是String類型的,我們在操作數據庫時String類型的參數必須要用' '把參數引起來才能傳遞並接收! 例如rs=stmt.executeQuery("select * from userinfo where userid = '"+ID+"'");ID是String類型,在進行數據庫操作時,千萬不要漏了兩邊的單引號,切記 !!!常錯點!!!

問題5:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException異常,
解決:一般都是自己的sql語句寫錯了(仔細查找錯誤)。

問題6:org.apache.jasper.JasperException: javax.el.ELException: Failed to parse the expression [${}]
分析:沒有jstl標簽庫
操作:在lib文件夾添加相關的jar。文章開頭已給出。

感想

  • 報錯的信息,可以直接粘貼,google一下,很多問題都可以找得到答案。
  • google問題時候,比較考驗自己的篩選能力。很多博文寫的真的是只有自己能看懂,所以我在找錯的時候花了很多的時間
  • 有條件一定要FQgoogle,百度真的是會浪費你的時間。買個一年的服務器也就是百來十塊錢,但是自己的時間一定是可以節省很多的。
  • 多上github,StackOverflow,多用google。
  • 有一個bug我改了三天,都變佛系了。改了一天沒結果,我就第三天再繼續剛。
  • 有個27寸的顯示器真的能讓你多坐在座位上打碼
  • 初級選手的話,數據庫的表盡量設計得簡單,不然很麻煩
  • 打碼更多需要的是耐心與堅持


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM