前段时间无聊写了个小练习,现在工作真难找呀!
本练习没什么新技术,就是jsp+servlet+JSTL+MySQL的简单应用而已。
大以前的时候,看过尚学堂的一个论坛视频,感觉数据库访问封装的不好,毕竟这个视频有好几年了。主要我就发现,
方法每调用一次,都需要打开数据库连接,使用完后关闭数据库连接,而且异常处理的早,我觉得应该适当抛出,到
接近前端再捕获,不知道这样好不好?下面是一些代码示例:
看见封装EntityManager有使用ThreadLocal的,我也照着写了下封装:
1 数据库的访问封装类DBUtil.java:
package com.question.util; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /** * * @author w */ public class DBUtil { private static final ThreadLocal<Connection> threadLocal; private static final ThreadLocal<Boolean> autoCommit; private static Properties p = null; static { threadLocal = new ThreadLocal<Connection>(); autoCommit = new ThreadLocal<Boolean>(); } private static Properties getProperties() { if (p == null) { InputStream in = PropertyUtil.newInstance().getClass().getResourceAsStream("datesource.properties"); try { p = PropertyUtil.get(in); } catch (FileNotFoundException ex) { LoggerUtil.error(DBUtil.class, "未能找到数据库配置文件datesource.properties!" + ex); } catch (IOException ex) { LoggerUtil.error(DBUtil.class, "找到数据库配置文件,但读取时发生错误!" + ex); } } return p; } private static Connection createConnection() throws SQLException { Connection conn = null; try { getProperties(); Class.forName(p.getProperty("driver")); conn = DriverManager.getConnection(p.getProperty("url"), p.getProperty("username"), p.getProperty("password")); } catch (ClassNotFoundException ex) { LoggerUtil.error(DBUtil.class, "找不到数据库驱动程序!" + ex); } System.out.println(conn); return conn; } private static Connection getConnection() throws SQLException { Connection conn = threadLocal.get(); if (conn == null || conn.isClosed()) { conn = createConnection(); threadLocal.set(conn); } return conn; } public static void begin() throws SQLException { autoCommit.set(getConnection().getAutoCommit()); getConnection().setAutoCommit(false); } public static void commit() throws SQLException { getConnection().commit(); getConnection().setAutoCommit(autoCommit.get()); } public static void rollback() { try { getConnection().rollback(); getConnection().setAutoCommit(autoCommit.get()); } catch (SQLException ex) { LoggerUtil.error(DBUtil.class, "数据库事物回滚失败!" + ex); } } public static Statement getStatement() throws SQLException { return getConnection().createStatement(); } public static PreparedStatement prestmt(String sql) throws SQLException { return getConnection().prepareStatement(sql); } public static PreparedStatement prestmt(String sql, int autoGeneratedKeys) throws SQLException { return getConnection().prepareStatement(sql, autoGeneratedKeys); } public static PreparedStatement prestmt(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { return getConnection().prepareStatement(sql, resultSetType, resultSetType); } public static void close() { Connection conn = threadLocal.get(); threadLocal.set(null); if (conn != null) { try { conn.close(); } catch (SQLException ex) { LoggerUtil.error(DBUtil.class, "数据库连接关闭失败!" + ex); } } } }
2 简单地使用示例:
package com.question.impl; import com.question.dao.AdminDao; import com.question.entity.Admin; import com.question.util.DBUtil; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * * @author wangshuochen */ public class AdminDaoImpl implements AdminDao { public void save(Admin admin) throws SQLException { PreparedStatement pstmt = DBUtil.prestmt("insert into admin(null , ?, ?)"); pstmt.setInt(1, admin.getId()); pstmt.setString(2, admin.getUsername()); pstmt.setString(3, admin.getPassword()); pstmt.executeUpdate(); pstmt.close(); } public Admin findByName(String username) throws SQLException { Admin a = new Admin(); PreparedStatement pstmt = DBUtil.prestmt("select * from admin where username = ?"); pstmt.setString(1, username); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { a.setId(rs.getInt("id")); a.setUsername(rs.getString("username")); a.setPassword(rs.getString("password")); } rs.close(); pstmt.close(); return a; } }
其余的就在servlet里调用dao就可以了,然后进行捕获异常,并把适当的异常信息以错误页面的方式显示给客户。
这个项目里面还包括一个简单的生成4个字母的验证码的程序,非常简单,因为字母使用int值就可以生成,代码很少,因此执行很快的。适合小项目要求不高,占用资源少。当然了为了增加安全性,可以扩展下加入数字。
下面是首页预览:前台已经做了大部分,后台只是用户和分类管理部分,可以说,可以继续完成,自己觉得太没水准,不想继续了。想做个大项目,成熟一些的。
还有,本项目基于netbeans6.7.1开发,因为是自己写,netbeans直接能在jsp中提示js、jstl、css等代码,很方便。
如果使用eclipse,可能需要按照项目结构拷贝相应的文件夹。