序
最近因爲在上實訓課,數據結構與算法的實訓課,實訓課結業是需要提交一個作業的,我當時選擇了一個運動會計分系統的問題來寫,(雖然後來有點後悔,這個裏面完全沒有用到多少的數據結構與算法的東西),爲了完成這個項目,我選擇用JavaEE寫一個瀏覽器版本的。
建立數據庫
-
在這個過程中我最先接觸的就是來連接數據庫這一步,首先在本地開啓數據庫並連接:
-
連接好數據庫後建表以及給表賦值可以通過以下兩種方式:
- 在該命令行上使用sql語句
- 使用MySQL的可視化軟件等
在此展示以下已經建好的表:
Java連接數據庫
在寫這個項目的時候我用了一個簡單的分層結構,(第一次使用這樣的結構,有的地方改寫該放在哪裏真懵圈,這可能就是學習設計模式的重要性吧…)
在這個裏面我首先建立了一個連接數據庫的工具類,放在了Utils下面:
DBUtil:
package com.xhu.edu.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DButil {
public Connection conn;
public Statement stat;
public DButil() throws ClassNotFoundException, SQLException {
// 加 連 域 執 放
//加載驅動
Class.forName("com.mysql.jdbc.Driver");
//連接
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/sport_match?useUnicode=true&characterEncoding=utf-8&useSSL=false", "root",
"********");
//域
stat = conn.createStatement();
}
public void close() throws SQLException {
stat.close();
stat = null;
conn.close();
conn = null;
}
}
總結下來就是五個步驟: 加,連,域,值,放
- 加載驅動
Class.forName(“com.mysql.jdbc.Driver”);
- 連接
conn = DriverManager.getConnection(
“jdbc:mysql://localhost:3306/sport_match”, “root”,
“*****”);
- 獲取數庫的執行對象
stat = conn.createStatement();
-
執行操作 執行SQL語句,sql語句這個字符串得自己寫哈,(我是想通過調用這個類的時候來完成,所以這裏沒寫),常用的方式:
- 執行Sql語句,返回執行的行數,並執行Sql語句更新數據庫
int count=stat.executeUpdate(sql);
- 執行Sql語句,返回查詢的結果集
ResultSet rs=stat.executeQuery(sql);
可以得到迭代的方式遍歷查詢的結果:
while(rs.next()){ system.out.println("id"+rs.getInt(id)+"department"+rs.getString(2); }
可以看到上面調用中所有的值都是查詢並返回的。
-
關閉連接(Connection和Statement對象)
conn.close();
stat.close();
使用Sevlet類來實現把數據返回給前端
新建一個JavaWeb項目
- 在Web項目中的lib中加入MySQL驅動包(例如:mysql-connector-java-5.1.46.jar),並給其添加路徑
- 新建一個JavaBean
關於JavaBean,在我看來它就是一個簡單的屬性構造器,裏面結合我們需要返回給前臺的數據類型,構造了幾個屬性,並設置了set,get等方法,同時裏面除開包含一個無參的構造方法之外,我們還可以定義其他的構造方法。
User:
package com.weily.cn;
public class User {
int id;
String name;
//普通的構造方法
public User() {
// TODO Auto-generated constructor stub
}
//set和get方法
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;
}
//其他構造方法
//(下面的Sevlet要用的)
public User(int id,String name){
this.id=id;
this.name=name;
}
}
- 新建一個Servlet類
package com.weily.cn;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class TestConnction
*/
@WebServlet("/TestConnction")
public class TestConnction extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TestConnction() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
/**
* 在這裏連接數據庫並執行查詢方法
*/
try {
//加載驅動
Class.forName("com.mysql.jdbc.Driver");
//創建連接
Connection conn=DriverManager.getConnection("jdbc:mysql:///sport_match","root","********");
//通過連接創建一個語句對象,該對象來執行Sql語句
Statement stat=conn.createStatement();
//執行Sql查詢語句,並接收查詢的結果
ResultSet rs = stat.executeQuery("select id,department from department_projects");
//定義一個JavaBean的數組對象來接收遍歷查詢結果的值
List<User> list=new ArrayList<User>();
/**
* 通過使用上面利用JavaBean定義的數組對象來接收我們遍歷Sql語句得到的結果的返回值
*/
while(rs.next()){
//在之前的JavaBean中定義一個構造函數可以給對象賦屬性值
User user=new User(rs.getInt(1), rs.getString(2));
list.add(user);
}
//通過以下兩種方法將list返回給前端並展示
request.setAttribute("list", list);
request.getRequestDispatcher("index.jsp").forward(request, response);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
- 寫一個簡單的jsp頁面,用上面Servlet請求訪問的頁面名
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!--jsp頁面需導入下一列語句 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Hello,world!</title>
</head>
<body>
<table>
<tr>
<td><b>id</b></td>
<td><b>department</b></td>
</tr>
<!-- JSTL方式接受值 -->
<c:forEach var="user" items="${list}">
<tr>
<td><c:out value="${user.id}"></c:out></td>
<td><c:out value="${user.name}"></c:out></td>
</c:forEach>
</table>
</body>
</html>
-
打開瀏覽器訪問
-
可以查看數據庫中的查詢結果對比