JDBC封装与设计模式

什么是 DAO ?

  • Data Access Object(数据存取对象)
  • 位于业务逻辑和持久化数据之间
  • 实现对持久化数据的访问

JDBC封装与设计模式_第1张图片         DAO起着转换器的作用,将数据在实体类和数据库记录之间进行转换。

-----------------------------------------------------

DAO模式的组成部分

  • DAO接口
  • DAO实现类
  • 实体类
  • 数据库连接和关闭工具类

优势:

  • 隔离了数据访问代码和业务逻辑代码
  • 隔离了不同数据库实现

JDBC封装与设计模式_第2张图片

 


 封装JDBC

/**
 * 数据库工具类
 */
public class BaseDao {
    Connection conn = null;
    PreparedStatement ps = null;
    //获取Conn对象 打开数据库链接
    public boolean getConn() {
        boolean bool = false;//默认 false 未打开数据库
        try {
            //加载驱动  方言
            Class.forName("com.mysql.jdbc.Driver");
            //准备数据库连接路径
            String url = "jdbc:mysql://127.0.0.1:3306/xxshop?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull";
            //用户名与密码
            String username = "root";
            String userpwd = "root";
            //根据路径,用户名,密码 使用DriverManager获取数据库connection连接
            conn = DriverManager.getConnection(
                    url,username,userpwd);
            bool = true;//已经打开
        } catch (Exception e) {
            e.printStackTrace();
            bool = false ;//已经打开
        }
            return  bool;
    }
    /**
     * 添加,修改,删除数据
     * @param sql
     * @param objs
     * @return
     */
    public int executeUpdate(String sql,Object objs[])
    {
        int res = 0;//初始化执行结果  失败0
        try {
            if(getConn())//打开数据库链接
            {
                ps = conn.prepareStatement(sql);
                if(objs!=null){
                    for (int i = 0; i < objs.length; i++) {
                        ps.setObject((i+1),objs[i]);
                    }
                }
                res = ps.executeUpdate();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeResource();//关闭数据源
        }
        return res;
    }
    /**
     * 查询
     * @param sql
     * @param objs
     * @return
     */
    public ResultSet executeSQL(String sql,Object objs[]){
        ResultSet rs = null;
        try {
            if(getConn())//打开数据库链接
            {
                ps = conn.prepareStatement(sql);
                //判断是否有参数
                if (objs != null) {
                    //循环封装参数
                    for (int i = 0; i < objs.length; i++) {
                        ps.setObject((i + 1), objs[i]);
                    }
                }
                rs = ps.executeQuery();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeResource();//释放资源
        }
        return rs;
    }
    //关闭资源
    public void closeResource(){
        try {
            if(ps!=null)
            {
                ps.close();
            }
            if(conn!=null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

调用工具类

实现类 继承 工具类(BaseDao)

查询:ResultSet rs = this.executeSQL(SQL语句,Object数组<参数数组>)

增,删,改: int i = this.executeUpdate(SQL语句,Object数组<参数数组>)


 使用配置文件存储连接信息(properties文件)

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/xxshop?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.pwd=root

  1. Properties properties = new Properties();
  2. //读取properties文件 BaseDao为当前所在类
  3. InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("jdbc.properties");
  4. //将文件信息转换成properties对象
  5. properties.load(is);
  6. //通过getProperty(KEY)方法获取属性值
  7. String driver = properties.getProperty("jdbc.driver");

在整个程序运行期间,有且仅有一个实例若违背这一点,所设计的类就不是单例类。

 JDBC封装与设计模式_第3张图片

 

你可能感兴趣的:(JDBC,java,jdbc,数据库,web)