不使用框架的JavaWeb

開發工具:MyEclipse、MySql
jar架包:mysql-connector-java-5.1.26-bin.jar
介紹:javaweb的學習,在JavaWeb開發中,開發層次分爲三層:表示層、業務邏輯層、數據訪問層。每一層可分別對應不一樣層次的包。在不使用框架技術時的,包分爲DB層(鏈接數據庫)、Dao層(對數據庫的操做)、Service層(業務邏輯層)、以及model層(實體類),而表示層表示展現給用戶的界面,也就是前端頁面
功能實現:
1.第一步, 使用傳統的jdbc來訪問數據庫(DB層)
爲了使用數據庫方便,在jdbc層這單獨寫一個靜態方法,返回值是Connection類。
代碼以下:
public static Connection getConnection() throws ClassNotFoundException, SQLException{
//指定加載類
Class.forName("com.mysql.jdbc.Driver");
//獲取數據庫的鏈接,定義鏈接默認數據庫。
//三個參數內容分別爲鏈接的數據庫地址,用戶名、密碼
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/laoxiang", "root","root");
=====================================================================================
2.第二步,Dao層( 數據訪問層 )的實現
這裏說一下關於數據庫的操做,對數據庫的操做分別爲增刪改查。 在本來未作簡化前的dao層的寫法是無論是增刪改查都要去執行或更新數據庫。但假如在dao層類中,你有多個方法分別去操做數據庫獲得不一樣的結果,那麼你會發現關於執行或更新數據庫的語句都是重複同樣的,因此咱們會在dao層作一個公共類(baseDao類),來存放它的執行或更新數據庫的語句,這樣在作Dao層時,能夠省去不少代碼量,只要繼承BaseDao或用調用類中方法的方式去獲取它的執行或者更新方法。
未簡化代碼以下(方法其中之一):
//要查詢的語句
String sql=" sql語句";
//獲取數據庫的鏈接
Connection conn=DB.getConnection();
//獲取編譯好的sql語句
PreparedStatement ptmt = conn.prepareStatement(sql);
//假如sql語句中帶有不明確的傳參值如where name=?,可經過如下語句去指定它的值
//其中i表明它是第幾個?,s表明它的值
ptmt.setObject( i, s);
//獲取它的執行結果
ResultSet rs=ptmt.executeQuery();
//存放查詢結果的實例類
ArrayList<Categorys> list=new ArrayList<Categorys>();
//經過循環獲取執行以後的rs裏的值,利用字段獲取(也能夠利用下標獲取,但不建議這麼作,緣由是更改數據庫結構後,代碼可能獲取不到相對應的值,代碼可用性低)
while(rs.next()){
list.add(new Categorys(
rs.getInt("categoryID"),
rs.getString("category_name"),
rs.getString("category_desc")));
}
//每次操做完成後,都要關閉數據庫的鏈接,不然屢次執行後,鏈接數會出錯。
conn.close();
return list;
--------------------------------------------------------------------------------------------------------------------------
簡化後代碼以下:
//Dao層提取的代碼作的工具類
public class BaseDao {
//方法內傳參,傳入數據庫的鏈接、要執行的sql語句、可能帶有的傳參
//查詢
//第一參數表明數據庫的鏈接,第二參數表明sql語句,第三參數表明可能帶有的傳參
public ResultSet exeQuery(Connection conn, String sql, Object[] s)
throws SQLException {
PreparedStatement ptmt = conn.prepareStatement(sql);
//在這裏的判斷是爲了判斷方法裏是否有傳過來的參數,若是不存在參數,不執行
if (s != null) {
for (int i = 0; i < s.length; i++) {
ptmt.setObject(i + 1, s[i]);
}
}
//最後是執行sql返回在上面方法中ResultSet類數據
return ptmt.executeQuery();
}
//更新
public void exeUpdaye(Connection conn, String sql, Object[] s)
throws SQLException {
PreparedStatement ptmt = conn.prepareStatement(sql);
if (s != null) {
for (int i = 0; i < s.length; i++) {
ptmt.setObject(i + 1, s[i]);
}
}
ptmt.executeUpdate();
}
}
//Dao層的簡化
public class CategorysDao extends BaseDao{
public ArrayList<Categorys> selectCategorys() throws SQLException, ClassNotFoundException {
String sql=" sql語句";
Connection conn=DB.getConnection();
ResultSet rs=this.exeQuery(conn, sql, null);
ArrayList<Categorys> list=new ArrayList<Categorys>();
while(rs.next()){
list.add(new Categorys(
rs.getInt("categoryID"),
rs.getString("category_name"),
rs.getString("category_desc")));
}
conn.close();
return list;
}
=====================================================================================
3.service層(業務邏輯層)的實現
經過調用不一樣的Dao層方法能夠實現各類不一樣的功能,如實現查詢。但在項目中,咱們能夠在進行一次優化,如Dao方法中,每個方法都有一個Connection類鏈接數據庫的語句,咱們能夠把它放在service層中,這樣的好處能夠在你只須要鏈接一次數據庫就能夠操做多個對數據庫的操做,在操做完成後再到service層關閉鏈接。
未簡化代碼以下:
//實例化Dao層
CategorysDao dao = new CategorysDao();
//查詢類別的方法
public ArrayList<Categorys> showCategorys() {
ArrayList<Categorys> list = null;
try {
//獲取Dao層操做結果
list = dao.selectCategorys();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
=====================================================================================
4.關於分頁查詢(這一塊還有點問題)
假如咱們數據中有幾百條數據要顯示在頁面中,但總不能一口氣所有顯示在一頁中,因此在開發過程當中,須要作一個關於分頁的功能。但要分頁查看數據的話,你得知道總頁數、當前頁、一頁顯示幾條數據,還有上下頁顯示的數據,這些總不能交給本身來作,得交給程序。因此咱們創建一個分頁數據類來進行分頁。
因此咱們在類中定義四個屬性,分別表明總頁數、當前頁、一頁顯示幾條數據,還有上下頁顯示的數據。還得有它的上下頁、首頁等功能。
代碼以下:
//分頁類
public class PageModel<T> {
// 當前頁
private int currentPage;
// 總頁數
private int totalPage;
// 一頁顯示量
private int pageSize;
// 一頁顯示數據存放
private ArrayList<T> list;
//上一頁
public int UpPage() {
if (currentPage <= 1) {
return 1;
}
return currentPage - 1;
}
// 下一頁
public int downPage() {
if (currentPage >= this.getTotalPage()) {
return this.getTotalPage();
}
return currentPage + 1;
}
// 總頁數
public int getTotalPage() {
return (totalPage + pageSize - 1) / pageSize;
}
//第一頁
public int getFirstPage() {

return 1;
}
// 首頁
public int getLastPage() {
return this.getTotalPage();
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public ArrayList<T> getList() {
return list;
}
public void setList(ArrayList<T> list) {
this.list = list;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
}
//在Dao層類中,可作一個分頁的數據操做方法,傳入它的當前頁和一頁大小
public PageModel<Categorys> count(Connection conn, int currentPage,
int pageSize) throws SQLException {
//利用Mysql的自帶語法去分頁
String sql = "select * from Categorys limit ?,? ";
//這裏是爲了獲取上面數據庫中從第幾條到第幾條的數據。如1到10條數據
Object[] prmde = { (currentPage - 1) * pageSize, pageSize };
ResultSet rs = this.exeQuery(conn, sql, prmde);
ArrayList<Categorys> list = new ArrayList<Categorys>();
while (rs.next()) {
list.add(new Categorys(rs.getInt("categoryID"),rs.getString("category_name"),rs.getString("category_desc")));
}
//獲取各個在上個分頁類中的屬性,存放到分頁類中
String sql2 = "select count(*) from Categorys ";
ResultSet rs2 = this.exeQuery(conn, sql2, null);
int as = 0;
if (rs2.next()) {
as = rs2.getInt(1);
}
PageModel<Categorys> Model = new PageModel<Categorys>();
Model.setList(list);
Model.setTotalPage(as);
Model.setCurrentPage(currentPage);
Model.setPageSize(pageSize);
return Model;
}