Java+MyEclipse+Tomcat (五)DAO和Java Bean實現資料庫和介面分開操作
此篇文章主要講述通過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
一. 專案結構
該專案的結構如下圖所示:
二. 建立資料庫
開啟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/)
相關文章
- Java+MyEclipse+Tomcat (六)詳解Servlet和DAO資料庫增刪改查操作JavaEclipseTomcatServlet資料庫
- Java+MyEclipse+Tomcat (四)Servlet提交表單和資料庫操作JavaEclipseTomcatServlet資料庫
- 記錄:如何使用ASP.NET Core和EnityFramework Core實現 資料庫操作 和 資料庫實體 的專案分離ASP.NETFramework資料庫
- 最佳化EJB實體Bean CMP和資料庫Bean資料庫
- MyBatis進階--介面代理方式實現Dao 和動態SQLMyBatisSQL
- 怎麼用工廠模式和DAO完成所有的對資料庫的基本操作模式資料庫
- 【Java】Spring和Tomcat自帶的連線池實現資料庫操作JavaSpringTomcat資料庫
- Java實現資料庫和資料表的二級聯動Java資料庫
- java mysql 資料庫備份和還原操作JavaMySql資料庫
- 請教DAO和DAOFactory的實現
- Java實現Web操作介面以及返回資料的翻譯JavaWeb
- 資料庫連線池設計和實現(Java版本)資料庫Java
- Spring bean 通過實現 InitializingBean ,DisposableBean 介面實現初始化方法和銷燬前操作SpringBean
- (Windows Maven專案)Redis資料庫的安裝和操作實現WindowsMavenRedis資料庫
- 資料庫之DAO資料庫
- 利用ODBC實現Domino和關聯式資料庫的互操作 (轉)資料庫
- 在Java中地域分佈資料庫是如何連線和進行CRUD 操作的?Java資料庫
- mysql資料庫基本操作(五)MySql資料庫
- 在Eclipse中用Java和MySql資料庫實現登入功能EclipseJavaMySql資料庫
- c#資料操作:資料庫訪問 和 檔案操作C#資料庫
- PHP常用操作類實現——資料庫操作類PHP資料庫
- session bean + dao +vo ???SessionBean
- MVC下的DAO介面類和SERVICE介面類區別?MVC
- Java實戰:教你如何進行資料庫分庫分表Java資料庫
- 【Java】操作Sqlite資料庫JavaSQLite資料庫
- 【Java】操作mysql資料庫JavaMySql資料庫
- Redis 五種資料型別和相關操作命令Redis資料型別
- 簡單的list介面和edit介面使用java swing實現Java
- EA UML 介面和實現
- JAVA中Action層, Service層 ,model層 和 Dao層的功能區分Java
- java實現zabbix介面開發Java
- Java實現解壓縮檔案和資料夾Java
- 實現報表資料分庫儲存
- 資料庫的連線、索引和Redis的五種資料型別及其操作命令、使用場景資料庫索引Redis資料型別
- java web實現分頁顯示資料JavaWeb
- 泛型DAO介面spring_hibernate_實現泛型Spring
- Redis 設計與實現 (五)--多機資料庫的實現Redis資料庫
- 附加和分離SQL Server資料庫方法SQLServer資料庫