?? dbmerchandise.java
字號(hào):
package myshop.db;
import myshop.Merchandise;
import java.sql.Connection;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.Timestamp;
import myshop.Category;
public abstract class DBMerchandise {
private DBMerchandise() {
}
// 定義每頁顯示數(shù)量的常量。有助于將數(shù)據(jù)和程序邏輯分離。
private static int pageSize = 3;
/**
* 獲得每頁顯示數(shù)量
* @return int
*/
public static int getPageSize() {
return pageSize;
}
/**
* 設(shè)置每頁顯示數(shù)量
* @param pageSize 每頁顯示數(shù)量
*/
public static void setPageSize(int pageSize) {
DBMerchandise.pageSize = pageSize;
}
/**
* 向數(shù)據(jù)庫中添加商品
* @param m Merchandise 需要添加的商品類別。要求已經(jīng)檢驗(yàn)過名稱屬性的合法性。
*/
public static void addMerchandise(Merchandise m) {
Connection conn = null;
try {
conn = ConnectionManager.getConnection(); // 獲得數(shù)據(jù)庫連接
PreparedStatement ps = conn.prepareStatement( // 建立PreparedStatement用于執(zhí)行SQL操作
"INSERT INTO MERCHANDISE(NAME,PRICE,ADD_TIME,CATEGORY_ID) VALUES(?,?,?,?)");
ps.setString(1, m.getName());
ps.setInt(2, m.getPrice());
// 使用Timestamp對(duì)應(yīng)數(shù)據(jù)庫日期時(shí)間字段類型
ps.setTimestamp(3, new Timestamp(m.getAddTime().getTime()));
ps.setInt(4, m.getCategoryId());
ps.execute(); // 執(zhí)行SQL命令
ps.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
}
/**
* 獲得全部商品名稱
* @return Iterator 商品名稱的迭代器
*/
public static Iterator getAllMerchandise() {
List l = new ArrayList(); //容器類。用于存放所有符合條件的對(duì)象。
Connection conn = null;
try {
conn = ConnectionManager.getConnection(); // 獲得數(shù)據(jù)連接
PreparedStatement ps = conn.prepareStatement( // 建立Statement用于執(zhí)行SQL操作
"SELECT ID, NAME,PRICE,ADD_TIME,CATEGORY_ID FROM MERCHANDISE");
ResultSet rs = ps.executeQuery(); // 執(zhí)行SQL命令
while (rs.next()) {
l.add(new Merchandise(rs.getInt(1), rs.getString(2), rs.getInt(3),
rs.getTimestamp(4), rs.getInt(5)));
}
rs.close();
ps.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
return l.iterator();
}
/**
* 獲得一頁內(nèi)容數(shù)量的商品列表
* @param page int 當(dāng)前所在頁數(shù)。第一頁從“1”開始
* @param c Category 商品類別
* @return Iterator 商品列表
*/
public static Iterator getOnePageMerchandise(Category c, int page) {
List l = new ArrayList(); //容器類。用于存放所有符合條件的對(duì)象。
Connection conn = null;
try {
conn = ConnectionManager.getConnection(); // 獲得數(shù)據(jù)連接
int total = DBMerchandise.getCounter(c); //存儲(chǔ)結(jié)果集的總數(shù)
PreparedStatement ps = conn.prepareStatement( // 建立Statement用于執(zhí)行SQL操作
"SELECT ID, NAME,PRICE,ADD_TIME,CATEGORY_ID FROM MERCHANDISE "+
"WHERE CATEGORY_ID=? ORDER BY ID");
ps.setInt(1, c.getId()); // 設(shè)定要查詢的類別ID
ResultSet rs = ps.executeQuery(); // 執(zhí)行SQL命令
int t = (page - 1) * pageSize + 1; // 將要開始的結(jié)果集行數(shù)
if (t <= total) { // 判斷最大邊界
rs.absolute(t); // 將結(jié)果集游標(biāo)移動(dòng)到指定行數(shù)
do {
//創(chuàng)建商品對(duì)象。并將對(duì)象存放到存儲(chǔ)集合中。
l.add(new Merchandise(rs.getInt(1), rs.getString(2), rs.getInt(3),
rs.getTimestamp(4), rs.getInt(5)));
} while (rs.next() && l.size() < pageSize);
}
rs.close();
ps.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
return l.iterator();
}
/**
* 修改商品名稱的屬性。
* @param m Merchandise 已經(jīng)填充新屬性的商品名稱包裝類。
*/
public static void updateMerchandise(Merchandise m) {
Connection conn = null;
try {
conn = ConnectionManager.getConnection(); // 獲得數(shù)據(jù)連接
// 使用PreparedStatement更新數(shù)據(jù)。
// 每個(gè)"?"代表一個(gè)占位符,在執(zhí)行之前要一一設(shè)置各占位符的內(nèi)容
PreparedStatement ps = conn.prepareStatement(
"UPDATE MERCHANDISE SET NAME=?,PRICE=?,ADD_TIME=?,CATEGORY_ID=? WHERE ID=?");
// 設(shè)置第一個(gè)占位符的內(nèi)容。設(shè)置內(nèi)容類型為String
ps.setString(1, m.getName());
// 設(shè)置第二個(gè)占位符的內(nèi)容。設(shè)置內(nèi)容類型為int
ps.setInt(2, m.getPrice());
// 設(shè)置第三個(gè)占位符的內(nèi)容。設(shè)置內(nèi)容類型為Timestamp
ps.setTimestamp(3, new Timestamp(m.getAddTime().getTime()));
// 設(shè)置第四個(gè)占位符的內(nèi)容。設(shè)置內(nèi)容類型為int
ps.setInt(4, m.getCategoryId());
// 設(shè)置第五個(gè)占位符的內(nèi)容。設(shè)置內(nèi)容類型為int
ps.setInt(5, m.getId());
ps.executeUpdate(); //執(zhí)行更新操作
ps.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
}
/**
* 獲得指定ID的商品名稱對(duì)象
* @param id int 商品名稱ID
* @return Merchandise 商品名稱對(duì)象
*/
public static Merchandise getMerchandise(int id) {
Merchandise m = null;
Connection conn = null;
try {
conn = ConnectionManager.getConnection(); // 獲得數(shù)據(jù)連接
// 建立PreparedStatement用于執(zhí)行SQL操作
PreparedStatement ps = conn.prepareStatement(
"SELECT ID, NAME,PRICE,ADD_TIME,CATEGORY_ID FROM MERCHANDISE WHERE ID=?");
ps.setInt(1, id); // 設(shè)置第一個(gè)占位符的內(nèi)容
ResultSet rs = ps.executeQuery(); // 執(zhí)行SQL命令
if (rs.next()) { //因?yàn)槊總€(gè)類別的ID是唯一的,所以只返回一個(gè)結(jié)果既可
m = new Merchandise(rs.getInt(1), rs.getString(2), rs.getInt(3),
rs.getTimestamp(4), rs.getInt(5));
}
rs.close();
ps.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
return m;
}
/**
* 刪除指定ID的商品類別
* @param id int 商品類別ID
*/
public static void deleteMerchandise(int id) {
Connection conn = null;
try {
conn = ConnectionManager.getConnection(); // 獲得數(shù)據(jù)連接
// 建立PreparedStatement用于執(zhí)行SQL操作
PreparedStatement ps = conn.prepareStatement(
"DELETE FROM MERCHANDISE WHERE ID=?");
ps.setInt(1, id); // 設(shè)置第一個(gè)占位符的內(nèi)容
ps.executeUpdate();
ps.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
}
/**
* 獲得指定類別下的商品集合
* @param c Category 商品類別
* @return Iterator 商品集合
*/
public static Iterator getMerchandises(Category c) {
List l = new ArrayList(); //容器類。用于存放所有符合條件的對(duì)象。
Connection conn = null;
try {
if(c != null) {
conn = ConnectionManager.getConnection(); // 獲得數(shù)據(jù)連接
PreparedStatement ps = conn.prepareStatement( // 建立Statement用于執(zhí)行SQL操作
"SELECT ID,NAME,PRICE,ADD_TIME,CATEGORY_ID FROM MERCHANDISE " +
"WHERE CATEGORY_ID=?");
ps.setInt(1, c.getId());
ResultSet rs = ps.executeQuery(); // 執(zhí)行SQL命令
while (rs.next()) {
l.add(new Merchandise(rs.getInt(1), rs.getString(2), rs.getInt(3),
rs.getTimestamp(4), rs.getInt(5)));
}
rs.close();
ps.close();
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
return l.iterator();
}
/**
* 獲得指定商品類別下的商品數(shù)量
* @param c Category 商品類別
* @return int
*/
public static int getCounter(Category c) {
int total = 0; //存儲(chǔ)結(jié)果集的總數(shù)
Connection conn = null;
try {
conn = ConnectionManager.getConnection(); // 獲得數(shù)據(jù)連接
// 建立PreparedStatement用于執(zhí)行SQL操作
PreparedStatement ps2 = conn.prepareStatement(
"SELECT COUNT(*) FROM MERCHANDISE WHERE CATEGORY_ID=? ");
ps2.setInt(1, c.getId()); // 設(shè)定要查詢的類別ID
ResultSet rs2 = ps2.executeQuery();
if (rs2.next()) {
total = rs2.getInt(1);
}
rs2.close();
ps2.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
return total;
}
/**
* 返回指定商品類別在指定的每頁數(shù)量下的最大頁號(hào)
* @param c Category 商品類別
* @return int 最大頁號(hào)
*/
public static int getMaxPageNumber(Category c) {
return DBMerchandise.getCounter(c) % DBMerchandise.pageSize == 0 ?
DBMerchandise.getCounter(c) / DBMerchandise.pageSize :
(DBMerchandise.getCounter(c) / DBMerchandise.pageSize) + 1;
}
public static void main(String[] args) {
DBMerchandise.setPageSize(3);
Category c = DBCategory.getCategory(1);
boolean b ;
for (int i=1; i<10; i++) {
b = false;
for (Iterator it = DBMerchandise.getOnePageMerchandise(c, i); it.hasNext(); ) {
System.out.println(((Merchandise) it.next()).getId());
b = true;
}
if (b)
System.out.println("p"+i+"=="+i);
}
System.out.println("maxPage=="+getMaxPageNumber(c));
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -