基于JDBC连接数据库的JavaBean的实现

Posted by Surflyan on 2017-09-16

1. JDBC 介绍

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行 SQL 语句的 Java API,可以为多种关系数据库提供统一访问,它由一组由 Java 语言编写的类和接口组成。


2. JavaBean 介绍

从面向对对象和代码可维护性的角度来考虑,JSP 页面应该尽可能少得使用脚本代码。JSP 可以通过组件实现功能扩充。
JavaBean 是 Java 的可重用组件技术,能提供一定的通用功能。 JavaBean 是一种符合某些命名和设计规范的 Java 类,通过封装属性和方法而具有某种功能或者处理某个业务。使用 JavaBean 能使 JSP 页面变的清晰,降低维护的难度。


3. JavaBean 编码规范

  1. 该类是一个公有类,并用 package 语句声明属于某个包
  2. 该类实现了java.io.Serializable 接口
  3. 该类如果有构造方法,那么这个构造方法是公有且无参的
  4. 该类的属性一般是私有的
  5. 私有属性有公有的访问器方法

4. 基于 JDBC 连接数据库的 JavaBean 的实现

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DBUtil {

    private String driver;
    private String username;
    private String url;
    private String password;
    private Connection con;
    private PreparedStatement pstmt;
    private ResultSet rs;

    public void setDriver(String driver) {
        this.driver = driver;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    public DBUtil() {
        driver = "com.mysql.jdbc.Driver";
        url = "jdbc:mysql://localhost:3306/book?autoReconnect=true&useSSL=false";
        username = "root";
        password = "password";
    }

    //获取连接对象
    private Connection getConnection() {
        try {
            Class.forName(driver);
            con = DriverManager.getConnection(url,username,password);
        }catch(ClassNotFoundException e) {
            e.printStackTrace();
        }catch(SQLException e) {
            e.printStackTrace();
        }
        return con;
    }

    //给pstmt 的SQL语句设置参数(参数以数组形式给出)
    private void setParams(String sql, String[] params) {
        this.getConnection();
        try {
            //创建一个PreparedStatement对象,用于执行预编译的SQL语句
            pstmt = con.prepareStatement(sql);
            for (int i = 0; i<params.length; i++)
                 pstmt.setString(i+1, params[i]);
        }catch(SQLException e) {
            e.printStackTrace();
        }
    }

    //执行数据库查询操作时,将返回的结果封装到List对象中
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public List getResultList(String sql, String[] params) {
        List list = new ArrayList();
        try {
            this.setParams(sql, params);
            ResultSet rs = pstmt.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            while(rs.next()) {
                Map m = new HashMap();
                for (int i = 1; i<=rsmd.getColumnCount(); i++) {
                    String colName = rsmd.getColumnName(i);
                    m.put(colName, rs.getString(colName));
                }
                list.add(m);
            }
        }catch(SQLException e) {
            e.printStackTrace();
        }finally {
            close();
        }
        return list;
    }


    @SuppressWarnings("rawtypes")
    public Map getMap(String sql, String[] params) {
        List list = getResultList(sql, params);
        if(list.isEmpty()) return null;
        else  return (Map)list.get(0);
    }
    //更新数据库时调用的update 方法
    public int update (String sql, String[] params) {
        int recNo = 0;          //表示受影响的记录行数
        try {
            this.setParams(sql, params);         //根据sql 和 params ,设置 pstmt 对象
            recNo = pstmt.executeUpdate();       // 执行更新操作
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            close();
        }
        return recNo;
    }

    //关闭对象
    private void close() {
        try {
            if(rs!= null)
                rs.close();
            if(pstmt != null)
                pstmt.close();
            if(con != null)
                con.close();
        }catch(SQLException e){
        e.printStackTrace();
        }
    }
}

Reference

  1. Java Web 开发技术教程

请多多指教!