JSP程序设计【六】

一、数据库设计进阶


1、数据库管理类设计

核心思想:可以设计一个工具类,专门用于管理数据库连接和实现基础访问

  • 定义数据库连接参数和连接对象

    • 1
      2
      3
      4
      private static String url = "jdbc:mysql://localhost:3306/myjsp";
      private static String user = "root";
      private static String pwd = "mysql";
      private static Connection connection;
  • 加载驱动程序(采用静态初始化块,只执行一次,在构造函数前执行)

    • 1
      2
      3
      4
      5
      6
      7
      static {
      try {
      Class.forName("com.mysql.jdbc.Driver");
      } catch (ClassNotFoundException ex) {
      Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
      }
      }
  • 获取连接

    • 获取新连接

      1
      2
      3
      public static Connection getNewConnection() throws SQLException {
      return DriverManager.getConnection(url, user, pwd);
      }
    • 打开默认连接(采用单例模式,只保持一个连接对象,使用此函数会检查是否已经存在链接)

      1
      2
      3
      4
      5
      public static void openDefaultConnection() throws SQLException {
      if (connection == null || connection.isClosed()) {
      connection = getNewConnection();
      }
      }
  • 关闭连接

    • 直接关闭

      1
      2
      3
      4
      5
      public static void closeConnection(Connection conn) throws SQLException {
      if (conn != null) {
      conn.close();
      }
      }
    • 关闭默认连接,额外关闭了connection,这样可以创建新的默认连接

      1
      2
      3
      4
      public static void closeDefaultConnection() throws SQLException {
      closeConnection(connection);
      connection = null;
      }
  • 获取执行SQL语句的对象

    • 直接获取写好的sql

      1
      2
      3
      4
      public static PreparedStatement getPreparedStatement(String sql) throws SQLException {
      openDefaultConnection();
      return connection.prepareStatement(sql);
      }
    • 设置获取待定参数的sql(采用可变参数形式,提高灵活性)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      public static void setParams(PreparedStatement pstmt, Object... params) throws SQLException {
      for (int i = 1; i <= params.length; i++) {
      Object param = params[i - 1];
      if (param == null) {
      pstmt.setNull(i, Types.NULL);
      } else if (param instanceof Integer) { //其他类型类似增加判断设置即可
      pstmt.setInt(i, (int) param);
      } else {
      pstmt.setObject(i, Types.OTHER);
      }
      }
      }
  • 执行更新

    • 1
      2
      3
      4
      5
      6
      7
      public static int executeUpdate(String sql, Object... params) throws SQLException {
      PreparedStatement pstmt = getPreparedStatement(sql);
      setParams(pstmt, params);
      int n = pstmt.executeUpdate();
      pstmt.close();
      return n;
      }
  • 执行查询

    • 1
      2
      3
      4
      5
      6
      public static ResultSet executeQuery(String sql, Object... params) throws SQLException {
      PreparedStatement pstmt = getPreparedStatement(sql);
      setParams(pstmt, params);
      ResultSet rset = pstmt.executeQuery();
      return rset;
      }
  • 其他操作生成SQL语句字符串获取列名获取行数类似设计即可

2、DAO模式的设计

(Data Access Object,数据访问对象)是为某种类型的数据库或其他持久性机制提供一个抽象接口的对象。隐藏细节;职责分离;降低耦合;易于扩展

基础数据库连接和操作—>生成DBmanager;创建使用数据库的一套规范接口—->使用DBmanager,实现针对每一个表的操作的继承接口规范的类;在MVC中使用数据库时,只需要使用每个表的操作实现类即可。(通过封装,屏蔽掉了需要获取各种连接的部分,想查询,就使用查询方法,数据库连接,创建查询会话等都自动执行了。)

DBmanager是最基本,是连接、增删改查操作的封装,DAO是一个规范,声明的是针对每个现实表实现的统一规范。实现每个表的操作类,需要调用DBmanager的基础操作,我们需要添加的只是sql语句或者一个Bean信息

(1)设计接口规范(样例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface DAO<T> { //使用泛型,进一步提高数据类型的灵活性
public abstract int insert(T t) throws SQLException;
public abstract int delete(Object... params) throws SQLException;
public abstract int update(T t) throws SQLException;
public abstract T queryOne(Object... params) throws SQLException;
public abstract List<T> queryAll() throws SQLException;
public abstract List<T> queryMany(int offset, int rows, String[] columnNames, Object... params) throws SQLException;
public abstract List<T> toEntities(ResultSet rset) throws SQLException;
public default List<T> query(String sql, Object... params) throws SQLException {
ResultSet rset = DBManager.executeQuery(sql, params);
List<T> entities = toEntities(rset);
return entities;
}
}

(2)设计接口实现(样例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public int insert(User t) throws SQLException {
String sql = "insert into user values(?, ?, ?, ?, ?, ?)";
return DBManager.executeUpdate(sql, t.getId(), t.getPwd(), t.getGender(), t.getAge(), t.getEmail(), t.getType());
}

public int delete(Object... params) throws SQLException {
String sql = "delete from user where 标识=?";
return DBManager.executeUpdate(sql, params);
}

public int update(User t) throws SQLException {
String sql = "update user set 标识=?, 密码=?, 性别=?, 年龄=?, 邮箱=?, 类型=? where 标识=?";
return DBManager.executeUpdate(sql, t.getId(), t.getPwd(), t.getGender(), t.getAge(), t.getEmail(), t.getType(), t.getId());
}

public User queryOne(Object... params) throws SQLException {
String sql = "select * from user where 标识=?";
List<User> users = query(sql, params);
return users.isEmpty() ? null : users.get(0);
}

public List<User> queryAll() throws SQLException {
String sql = "select * from user";
return query(sql);
}

public List<User> queryMany(int offset, int rows, String[] columnNames, Object... params) throws SQLException {
String sql = DBManager.generateSql("user", offset, rows, columnNames, params);
return query(sql, params);
}

public List<User> toEntities(ResultSet rset) throws SQLException {
List<User> users = new ArrayList<>();
while (rset.next()) {
User user = new User(rset.getString(1), rset.getString(2), rset.getString(3), rset.getInt(4), rset.getString(5), rset.getString(6));
users.add(user);
}
rset.close();
return users;
}

JSP页面出现空白,使用out.print检测到问题出在SQL方法使用语句上,则(1)检查SQL语句(语句格式、参数个数、参数顺序等)(2)检查数据库完整性(长度限制、类型限制、主键限制、非空限制等等)

二、过滤器


三、系统发布


1、以war文件形式发布

1
2
3
4
5
6
清理并构建:在项目结点右键单击选择“清理并构建”
成功后生成文件:MyJsp\dist\MyJsp.war
复制文件:复制文件MyJsp.war到webapps中
启动Tomcat服务器:运行bin文件夹中的startup.bat
启动浏览器
进入系统:http://localhost:8080/MyJsp/index.jsp

.war的名决定了网站根目录名。war本质上就是写的jsp、java等的压缩文件。使用压缩软件打开还是这些东西

2、以web文件夹形式发布

1
2
3
4
清理并构建:在项目结点右键单击选择“清理并构建”
成功后生成文件夹:MyJsp\build\web
复制文件夹:复制整个web文件夹到webapps中,然后改名为MyJsp
…… //后续步骤与上面相同(其实war就是对web文件夹的压缩形式)

本质是这个文件压缩后就是war

至于tomcat部署相关请看【一】其它容器软件再自行查阅学习

-----------------------本文结束 感谢阅读-----------------------
坚持原创技术分享,您的支持将鼓励我继续创作!恰饭^.^~