Java编程练习题(八)
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;
???? }
?
?
???? (待续)