1编写应用类ConnectionManager,用来建立与指定数据库服务器的连接。
package myshop.db;
import java.sql.*;
/**
* 数据库连接控制类。通过访问静态方法获得数据库连接
*/
public abstract class ConnectionManager {
/** 获得连接池连接 */
public static final int TYPE_POOLED = 0;
/** 获得直接物理连接 */
public static final int TYPE_DIRECT = 1;
/** 私有空构造方法。保证本类不能够被实例化 */
private ConnectionManager() {
}
/**
* 获得默认连接方式的数据库连接。目前默认为物理连接。
* @return Connection 数据库连接
*/
public static Connection getConnection() {
return getConnection(TYPE_DIRECT);
}
/**
* 获得指定连接方式的数据库连接
* @param type int 连接方式 <br/>
* ConnectionManager.TYPE_POOLED 数据库连接池连接 <br/>
* ConnectionManager.TYPE_DIRECT 直接物理连接
* @return Connection 数据库连接
*/
public static Connection getConnection(int type) {
Connection conn = null;
switch (type) {
case TYPE_DIRECT:
try {
// 定义JDBC驱动程序
String driverName="org.gjt.mm.mysql.Driver";// MySQL 驱动程序名称
Class.forName(driverName);
// 数据库连接参数。指定采用中文编码方式连接数据库
String serverName = "localhost"; // 数据库主机名称
String mydatabase = "my_shop"; // 数据库名称
// 连接url。指定连接方式为GBK编码
String url = "jdbc:mysql://" + serverName + "/" +
mydatabase +
"?useUnicode=true&characterEncoding=GBK";
String username = "root"; // 连接用户名
String password = "111111"; // 连接密码
// 获得数据库连接
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
// 不能够找到所需类
e.printStackTrace();
} catch (SQLException e) {
// 获得数据库连接发生异常
e.printStackTrace();
}
break;
case TYPE_POOLED:
throw new UnsupportedOperationException("Now Unsupported.");
}
return conn;
}
/**
* 关闭数据库连接
* @param conn Connection 需要被关闭的数据库连接
*/
public static void closeConnection(Connection conn) {
if (conn != null) { //连接是否有效
try {
if (!conn.isClosed()) { //连接是否已关闭
conn.close(); //关闭连接
}
} catch (SQLException ex1) {
ex1.printStackTrace();
}
}
}
/**
* 主方法。用于检测本类工作是否正常
* @param args String[] 运行时参数
*/
public static void main(String[] args) {
Connection conn = null;
try {
conn = ConnectionManager.getConnection();
if (conn == null) {
System.out.println("获得数据库连接错误.");
} else {
System.out.println("正常获得数据库连接 == " + conn);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
closeConnection(conn);
}
}
}
2.编写类DBCategory,用来完成对商品类别的MySql数据库操作
package myshop.db;
import java.sql.*;
import java.util.*;
import myshop.Category;
/**
* 完成对商品类别的数据库操作
*/
public abstract class DBCategory {
/** 私有空构造方法。保证本类不能够被实例化 */
private DBCategory() {
}
/**
* 向数据库中添加商品类别
* @param c Category 需要添加的商品类别。要求已经检验过属性的合法性。
*/
public static void addCategory(Category c) {
Connection conn = null;
try {
conn = ConnectionManager.getConnection(); // 获得数据连接
Statement stmt = conn.createStatement(); // 建立Statement执行SQL操作
stmt.executeUpdate("INSERT INTO CATEGORY (NAME) VALUES ('" +
c.getName() + "')"); // 执行SQL命令
stmt.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
}
/**
* 获得全部商品分类
* @return Iterator 商品分类的迭代器
*/
public static Iterator getAllCategory() {
List l = new ArrayList(); //容器类。用于存放所有符合条件的对象。
Connection conn = null;
try {
conn = ConnectionManager.getConnection(); // 获得数据连接
Statement stmt = conn.createStatement(); // 建立Statement执行SQL操作
ResultSet rs = stmt.executeQuery("SELECT ID, NAME FROM CATEGORY");
while (rs.next()) {
l.add(new Category(rs.getInt(1), rs.getString(2)));
}
stmt.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
return l.iterator();
}
/**
* 修改商品类别的属性。目前只实现了修改名称。
* @param c Category 已经填充新属性的商品类别包装类。
*/
public static void updateCategory(Category c) {
Connection conn = null;
try {
conn = ConnectionManager.getConnection(); // 获得数据连接
// 使用PreparedStatement更新数据。
// 每个"?"代表一个占位符,在执行之前要一一设置各占位符的内容
PreparedStatement ps = conn.prepareStatement(
"UPDATE CATEGORY SET NAME=? WHERE ID=?");
// 设置第一个占位符的内容。设置内容类型为String
ps.setString(1, c.getName());
// 设置第二个占位符的内容。设置内容类型为int
ps.setInt(2, c.getId());
ps.executeUpdate(); //执行更新操作
ps.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
}
/**
* 获得指定ID的商品类别对象
* @param id int 商品类别ID
* @return Category 商品类别对象
*/
public static Category getCategory(int id) {
Category c = null;
Connection conn = null;
try {
conn = ConnectionManager.getConnection(); // 获得数据连接
// 建立PreparedStatement用于执行SQL操作
PreparedStatement ps = conn.prepareStatement(
"SELECT ID, NAME FROM CATEGORY WHERE ID=?");
ps.setInt(1, id); // 设置第一个占位符的内容
ResultSet rs = ps.executeQuery(); // 执行SQL命令
if (rs.next()) { //因为每个类别的ID是唯一的,所以只返回一个结果既可
c = new Category(rs.getInt(1), rs.getString(2));
}
ps.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
ConnectionManager.closeConnection(conn);
}
return c;
}
(待续)