自己做的仿照我的智囊团的小项目,适合初级的Java学习者

前段时间无聊写了个小练习,现在工作真难找呀!

本练习没什么新技术,就是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,可能需要按照项目结构拷贝相应的文件夹。

自己做的仿照我的智囊团的小项目,适合初级的Java学习者_第1张图片

 

 

你可能感兴趣的:(java,DAO,sql,项目管理,Netbeans)