JDBC封装与设计模式

news2025/1/23 13:05:29

什么是 DAO ?

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

         DAO起着转换器的作用,将数据在实体类和数据库记录之间进行转换。

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

DAO模式的组成部分

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

优势:

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

 


 封装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");

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

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/883272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动画】p60动画蓝图、播放蒙太奇、打包

p60动画蓝图、播放蒙太奇、打包 p60动画蓝图、播放蒙太奇、打包添加动画动画蓝图使模型使用动画蓝图奔跑跳舞蒙太奇 移动打断蒙太奇打包退出游戏 p60动画蓝图、播放蒙太奇、打包 添加动画 右键内容浏览器-》动画-》混合空间1D-》选择新的角色的骨骼 如下图在资产详情修改参数…

【TypeScript】基础类型

安装 Node.js 环境 https://nodejs.org/en 终端中可以查到版本号即安装成功。 然后&#xff0c;终端执行npm i typescript -g安装 TypeScript 。 查到版本号即安装成功。 字符串类型 let str:string "Hello"; console.log(str);终端中先执行tsc --init&#xf…

机器学习:特征工程之特征预处理

目录 特征预处理 1、简述 2、内容 3、归一化 3.1、鲁棒性 3.2、存在的问题 4、标准化 ⭐所属专栏&#xff1a;人工智能 文中提到的代码如有需要可以私信我发给你&#x1f60a; 特征预处理 1、简述 什么是特征预处理&#xff1a;scikit-learn的解释&#xff1a; provide…

预训练GNN:GPT-GNN Generative Pre-Training of Graph Neural Networks

一.文章概述 本文提出了一种自监督属性图生成任务来预训练GNN&#xff0c;使得其能捕图的结构和语义属性。作者将图的生成分为两个部分&#xff1a;属性生成和边生成&#xff0c;即给定观测到的边&#xff0c;生成节点属性&#xff1b;给定观测到的边和生成的节点属性&#xf…

【第三阶段】kotlin中使用带let的安全调用

let常常和&#xff1f;.配合使用&#xff0c;如果前面的对象为null,let不执行&#xff0c;能够执行到let里面 对象一定不为null 1.不为null fun main() {var name:String?"kotlin" //name是一个可空类型&#xff0c;发出广播&#xff0c;调用的地方必须补救措施var…

WSL2 Ubuntu子系统安装cuda+cudnn+torch

文章目录 前言一、安装cudncudnn安装pytorch 前言 确保Windows系统版本高于windows10 21H2或Windows11&#xff0c;然后在Windows中将显卡驱动升级到最新即可&#xff0c;WSL2已支持对显卡的直接调用。 一、安装cudncudnn 配置cuda环境&#xff0c;WSL下的Ubuntu子系统的cu…

炬芯科技低延迟高音质无线麦克风解决方案

随着互联网技术的高速发展&#xff0c;诸多新兴产业被带动起来。就近十年来看&#xff0c;内容平台以及其载体在不断演变&#xff0c;从自媒体到短视频以及直播&#xff0c;一点一滴地渗透进大众生活。而这些平台的兴起&#xff0c;亦为普罗大众提供了广阔的分享空间&#xff0…

六十四卦-整体

前言&#xff1a;整理一下学习的卦&#xff0c;从整体上更好地了解六十四卦。 目录 八纯卦 难卦 消息卦 最吉的卦 六爻皆正位的卦 六爻皆不正位的卦 爻辞中含有“利涉大川”的卦 八纯卦 乾三连&#xff0c;坤六断&#xff0c;震仰盂&#xff0c;艮覆碗&#xff0c;离…

【免费分享 图书】《阿里云天池大赛赛题解析——机器学习篇》-PDF电子书-百度云...

找这本书的资源简直要把我找吐了&#xff0c;各种网站压缩包一下下来就开始各种套路(比如要你充钱) 为了防止还有我这样的受害者&#xff0c;这就把找到的PDF给大家分享一下。 链接在文章最后 如果这篇文章能够帮到您&#xff0c;麻烦帮我点个赞&#xff0c;并关注一下我&…

【uniapp】中 微信小程序实现echarts图表组件的封装

插件地址&#xff1a;echarts-for-uniapp - DCloud 插件市场 图例&#xff1a; 一、uniapp 安装 npm i uniapp-echarts --save 二、文件夹操作 将 node_modules 下的 uniapp-echarts 文件夹复制到 components 文件夹下 当前不操作此步骤的话&#xff0c;运行 -> 运行到小…

动手学深度学习—卷积神经网络LeNet(代码详解)

1. LeNet LeNet由两个部分组成&#xff1a; 卷积编码器&#xff1a;由两个卷积层组成&#xff1b;全连接层密集块&#xff1a;由三个全连接层组成。 每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均汇聚层&#xff1b;每个卷积层使用55卷积核和一个sigmoid激…

基于libevent的tcp服务器

libevent使用教程_evutil_make_socket_nonblocking_易方达蓝筹的博客-CSDN博客 一、准备 centos7下安装libevent库 yum install libevent yum install -y libevent-devel 二、代码 server.cpp /** You need libevent2 to compile this piece of code Please see: http://li…

分类预测 | MATLAB实现MTBO-CNN多输入分类预测

分类预测 | MATLAB实现MTBO-CNN多输入分类预测 目录 分类预测 | MATLAB实现MTBO-CNN多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现MTBO-CNN多输入分类预测 2.代码说明&#xff1a;基于登山队优化算法&#xff08;MTBO&#xff09;、卷积神经…

android 12系统加上TTS引擎

系统层修改&#xff1a; 1.frameworks/base/packages/SettingsProvider/res/values/defaults.xml <string name"def_tts"></string> 2.frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java loadString…

​五金件机器视觉定位​并获取外观轮廓软硬件视觉方案

【检测目的】 五金件机器视觉定位&#xff0c;视觉检测五金件轮廓并矫正五金件位置进行涂油 【客户要求】 FOV:540*400mm 【拍摄与处理效图一】 【拍摄与处理效图二】 【实验原理及说明】 【方案评估】 根据目前的图像和处理结果来看&#xff0c;可以检测出产品轮廓并进行位置…

Unity小项目__小球吃零食

// Player脚本文件源代码 public class Player : MonoBehaviour {public Rigidbody rd; // 定义了一个刚体组件public int score 0; // 定义了一个计分器public Text scoreText; // 定义了一个文本组件public GameObject winText; // 定义了一个游戏物体用于检验游戏结束// S…

征战2023跨境旺季,独立站如何实现新增长?

2023年出海赛道万象更新&#xff0c;行业重回正轨&#xff0c;跨境行业在经历过多轮洗牌过后&#xff0c;中国企业在全球化产业链中表现出了更强大的增长韧性。而随着跨境模式与消费需求的多样化与精细化。单一渠道的出海布局已经不能满足企业实现品牌出海的转型需求。 DTC独立…

前端工具的选择

目录 前端常见开发者工具 浏览器 开发者工具 VScode开发者工具快捷键 前端常见开发者工具 浏览器 浏览器是我们最重要的合作伙伴 关于浏览器的选择&#xff0c;我目前主要用主要是谷歌浏览器&#xff0c;我个人觉得谷歌浏览器使用起来比较方便、简洁&#xff0c;没有太多…

【TypeScript】tsc -v 报错 —— 在此系统上禁止运行脚本

在 VS Code 终端中执行 tsc -v &#xff0c;报错 —— 在此系统上禁止运行脚本 然后 windows x &#xff0c;打开终端管理员&#xff0c;出现同样的问题 解决方法&#xff1a; 终端&#xff08;管理员&#xff09;执行以下命令&#xff1a; 出现 RemoteSigned 则代表更改成功…

Flask-SQLAlchemy

认识Flask-SQLAlchemy Flask-SQLAlchemy 是一个为 Flask 应用增加 SQLAlchemy 支持的扩展。它致力于简化在 Flask 中 SQLAlchemy 的使用。SQLAlchemy 是目前python中最强大的 ORM框架, 功能全面, 使用简单。 ORM优缺点 优点 有语法提示, 省去自己拼写SQL&#xff0c;保证SQL…