Java+MyEclipse+Tomcat (五)DAO和Java Bean實現資料庫和介面分開操作

Eastmount發表於2015-05-19
        正如前面一篇文章的介紹,當使用Servlet提交表單和JSP資料庫查詢時,總是相互交叉著的處理,要麼在JSP中通過<%...%>內嵌Java程式碼運算元據庫,要麼JSP中通過Post方法提交表單Form,在Java中通過Servlet獲取請求/響應,再通過Java中out.println("<HTML>...")輸出資料庫中值。
        此篇文章主要講述通過DAO和Java Bean運算元據庫,把連結資料庫、資料庫操作、前端介面顯示分模組化實現。參考前文:
        Java+MyEclipse+Tomcat (一)配置過程及jsp網站開發入門
        Java+MyEclipse+Tomcat (二)配置Servlet及簡單實現表單提交
        Java+MyEclipse+Tomcat (三)配置MySQL及查詢資料顯示在JSP網頁中
        Java+MyEclipse+Tomcat (四)Servlet提交表單和資料庫操作
       DAO和Java Bean是對JDBC進行分層、模組化的最有效兩個方法。DAO(資料庫操作物件,Database Access Object)是JDBC下常用模式,DAO出現之前,運算元據庫的程式碼與業務程式碼都出現在Servlet或者JSP中,不利用業務程式碼的分離。DAO出現後,所有與資料庫相關的操作全被拿到了DAO層實現,Servlet或JSP只操作Java Bean或者DAP層,而DAO層值運算元據庫。
       下面直接上程式碼,希望文章對你有所幫助~文章部分參考Java Web王者歸來。
        下載地址:http://download.csdn.net/detail/eastmount/8714395


一. 專案結構

       該專案的結構如下圖所示:


        其中bean中Student.java是對應資料庫學生表,主要包括setId()、getId()等操作;DAO中StudentDAO.java是對學生表的資料庫增刪改查操作;util中JDBCConnect.java主要是連線資料庫MySQL的操作;student.jsp是顯示資料的JSP前端介面。同時需要lib資料夾中載入mysql-connector-java.jar包。

二. 建立資料庫

        開啟MySQL,輸入預設超級root使用者的密碼,然後資料庫的操作如下程式碼:

--建立資料庫
create database TestDao;
--使用資料庫
use TestDao;
--建立學生表
create table student(
	stuid int,
	username varchar(20),
	password varchar(20)
);
--插入資料
insert student(stuid,username,password)
	values ("10001","Eastmount","111111");
insert student(stuid,username,password)
	values ("10002","Yangxiuzhang","123456");
--顯示錶結構
desc student;
--查詢表中資料
select * from student;

        其中表結構和表中資料顯示如下圖:



三. Java程式碼

       1.在src下新建資料夾util,然後新增類JDBCConnect.java。程式碼如下:

package util;

import java.sql.*;
import com.mysql.jdbc.Driver;

public class JDBCConnect {
	
	//獲取預設資料庫連線
	public static Connection getConnection() throws SQLException {
		return getConnection("TestDAO", "root", "123456"); //資料庫名 預設使用者 密碼
	}
	
	//連線資料庫   引數:資料庫名 root登入名 密碼
	public static Connection getConnection(String dbName, String userName,
			String password) throws SQLException {

		String url = "jdbc:mysql://localhost:3306/" + dbName 
				+ "?characterEncoding=utf-8";
		//連線MySQL"com.mysql.jdbc.Driver"
		DriverManager.registerDriver(new Driver());
		return DriverManager.getConnection(url, userName, password);
	}

	//設定 PreparedStatement 引數 
	public static void setParams(PreparedStatement preStmt, Object... params)
			throws SQLException {

		if (params == null || params.length == 0)
			return;
		for (int i = 1; i <= params.length; i++) {
			Object param = params[i - 1];
			if (param == null) {
				preStmt.setNull(i, Types.NULL);
			} else if (param instanceof Integer) {
				preStmt.setInt(i, (Integer) param);
			} else if (param instanceof String) {
				preStmt.setString(i, (String) param);
			} else if (param instanceof Double) {
				preStmt.setDouble(i, (Double) param);
			} else if (param instanceof Long) {
				preStmt.setDouble(i, (Long) param);
			} else if (param instanceof Timestamp) {
				preStmt.setTimestamp(i, (Timestamp) param);
			} else if (param instanceof Boolean) {
				preStmt.setBoolean(i, (Boolean) param);
			} else if (param instanceof Date) {
				preStmt.setDate(i, (Date) param);
			}
		}
	}

	//執行 SQL,返回影響的行數 異常處理
	public static int executeUpdate(String sql) throws SQLException {
		return executeUpdate(sql, new Object[] {});
	}

	//帶引數執行SQL,返回影響的行數 異常處理
	public static int executeUpdate(String sql, Object... params)
			throws SQLException {

		Connection conn = null;
		PreparedStatement preStmt = null;
		try {
			conn = getConnection();
			preStmt = conn.prepareStatement(sql);
			setParams(preStmt, params);
			return preStmt.executeUpdate(); //執行SQL操作
		} finally {
			if (preStmt != null)
				preStmt.close();
			if (conn != null)
				conn.close();
		}
	}
}

       其中主要是呼叫getConnection(url, userName, password); 方法進行連線資料庫操作,我資料庫的名稱為TestDAO,預設的連線物件為root,密碼為123456。同時定義兩個函式執行無引數的SQL語句操作和有引數的SQL語句操作。

       2.在src下新建資料夾bean,然後新增類Student.java。程式碼如下:

package bean;

public class Student {
	
	private Integer id;       //學號
	private String name;      //姓名
	private String password;  //密碼
	public Integer getId() { return id; }
	public String getName() { return name; }
	public String getPassword() { return password; }
	public void setId(Integer id) { this.id =  id; }
	public void setName(String name) { this.name =  name; }
	public void setPassword(String pwd) { this.password = pwd; }	
}

        該Student中的變數及型別與資料庫中一一對應,在通過get和set方法獲取和設定其值。同樣如果你的資料庫中有老師、學校表,你只需要在bean資料夾下新增Teacher.java和School.java即可。

        3.在src下新建資料夾DAO,然後新增類StudentDAO.java。程式碼如下:

package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import bean.Student;
import util.JDBCConnect;

public class StudentDAO {
	
	//插入學生
	public static int insert(Student stu) throws Exception {

		String sql = "INSERT INTO student (stuid,username,password) VALUES (?,?,?) ";
		return JDBCConnect.executeUpdate(sql, stu.getId(),stu.getName(),stu.getPassword());
	}
	
	//更新學生姓名
	public static int update(Student stu) throws Exception {

		String sql = "UPDATE student SET stuid = ? WHERE username = ? ";
		return JDBCConnect.executeUpdate(sql,stu.getId(),stu.getName());
	}


	//刪除操作
	public static int delete(Integer id) throws Exception {

		String sql = "DELETE FROM student WHERE stuid = ? ";
		return JDBCConnect.executeUpdate(sql, id);
	}
	
	//查詢記錄 某學號
	public static Student find(Integer id) throws Exception {
		
		String sql = "SELECT * FROM student WHERE stuid = ? ";
		Connection conn = null;
		PreparedStatement preStmt = null;
		ResultSet rs = null;

		try {
			//連結資料庫執行SQL語句
			conn = JDBCConnect.getConnection(); //連線預設資料庫
			preStmt = conn.prepareStatement(sql);
			preStmt.setInt(1, id);
			rs = preStmt.executeQuery();
			//獲取查詢結果
			if (rs.next()) {
				Student student = new Student();
				student.setId(rs.getInt("stuid"));
				student.setName(rs.getString("username"));
				return student;
			} else {
				return null;
			}

		} finally { //依次關閉 記錄集 宣告 連線物件
			if (rs != null)
				rs.close();
			if (preStmt != null)
				preStmt.close();
			if (conn != null)
				conn.close();
		}
	}
	
	//查詢所有學生資訊
	public static List<Student> listStudents() throws Exception {

		List<Student> list = new ArrayList<Student>();
		String sql = "SELECT * FROM student";
		Connection conn = null;
		PreparedStatement preStmt = null;
		ResultSet rs = null;

		try {
			conn = JDBCConnect.getConnection();
			preStmt = conn.prepareStatement(sql);
			rs = preStmt.executeQuery();
			while (rs.next()) {
				//設定資料庫中表引數 否則報錯java.sql.SQLException: Column 'id' not found.
				Student student = new Student();
				student.setId(rs.getInt("stuid"));      
				student.setName(rs.getString("username"));
				student.setPassword(rs.getString("password"));
				list.add(student);
			}
			
		} finally {
			if (rs != null)
				rs.close();
			if (preStmt != null)
				preStmt.close();
			if (conn != null)
				conn.close();
		}
		return list;
	}
	
}
        通常DAO(Data Access Object)資料訪問物件是負責與資料庫連線,主要功能執行對資料表的CUDR操作。
        C(Create)操作:建立記錄,執行insert into語句;
        U(Update)操作:業務表中對應的屬性進行更新操作,執行update語句;
        D(Delete)操作:將DTO物件對應的記錄刪除,執行delete語句;
        R(Read)操作:讀取表中資料,可以返回多個記錄列表對應DTO物件多個List容器。

        最初同學建議弄這個,不敢接觸擔心很複雜,但用完後才知道它並不需要匯入如何jar包、配置web.xml或安裝什麼軟體,只需通過DAO介面實現DAO物件的CUDR操作。
        每個資料表都定義一個DAO介面或類實現,實現對此表的讀寫操作。換句話說,就是在域名.專案.模組.dao資料夾下建立個DAO類即可。
        例如“package com.neusoft.dao;”

 

四. Jsp程式碼

        然後是WebRoot資料夾下的jsp程式碼。其中index.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>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
    This is my JSP page. <br>
    <A href="student.jsp">JDBC操作</A>
  </body>
</html>

        然後點選JDBC操作跳轉到student.jsp操作,程式碼如下:涉及EL和JSTL。

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:directive.page import="DAO.StudentDAO"/>
<jsp:directive.page import="java.util.List"/>
<%
	List studentList = StudentDAO.listStudents();
	request.setAttribute("studentList", studentList);
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'student.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<style type="text/css">
		body, td, th, input {font-size:12px; text-align:center; }
	</style>
  </head>
  
  <body>
    <form action="operateStudent.jsp" method=get>
			<table bgcolor="#CCCCCC" cellspacing=1 cellpadding=5 width=100%>
				<tr bgcolor=#DDDDDD>
					<th>選擇</th>
					<th>學號</th>
					<th>姓名</th>
					<th>密碼</th>
					<th>操作</th>
				</tr>
				
				<c:forEach items="${studentList}" var="stu">
					<tr bgcolor="#FFFFFF">
						<td><input type="checkbox" name="id" value="${stu.id}" /></td>
						<td>${stu.id}</td>
						<td>${stu.name}</td>
						<td>${stu.password}</td>
						<td>
							<a href="addEmployee.jsp?action=edit&id=${stu.id}">修改</a>
							<a href="addEmployee.jsp?action=del&id=${stu.id}" 
								onclick="return confirm('確定刪除?')">刪除</a>
						</td>
					</tr>
				</c:forEach>
			</table>
		</form>
  </body>
</html>

        文章執行結果如下圖所示:


        最後總結下,文章主要講述瞭如何通過DAO和Java Bean實現Java資料庫操作、介面顯示分離的操作;同樣的道理,實現修改、刪除、插入方法類似,後面可能會講述。該方法主要是通過上一篇自己的體會,找到的解決辦法。最後希望文章對你有所幫助,如果有錯誤或不足之處,還請海涵~
        最重要的一個問題,在這過程中你可能會遇到以下兩個錯誤:(困擾我4小時)
        Servlet.service() for servlet [jsp] in context with path 
        javax.el.PropertyNotFoundException: Property 'id' not found on type bean.Student

        其解決方案參考:http://blog.csdn.net/eastmount/article/details/45835481
       (By:Eastmount 2015-5-19 凌晨2點   http://blog.csdn.net/eastmount/
        

相關文章