iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >由浅到深学习JDBC二
  • 958
分享到

由浅到深学习JDBC二

2024-04-02 19:04:59 958人浏览 八月长安
摘要

封装数据访问对象1:通过分析总结,所有对数据库表的操作都可以总结为通过JDBC对表的增删改查,为了减少冗余代码,     使得每次操作表时,不必都写JDBC

封装数据访问对象

1:通过分析总结,所有对数据库表的操作都可以总结为通过JDBC对表的增删改查,为了减少冗余代码,

     使得每次操作表时,不必都写JDBC程序,所以将对一张表的所有数据访功能,封装在数据访问对象

     (Data Access Object)中,方便调用。

2:为了方便数据传输,往往会将java程序中所有相关操作的零散字段值,封装成一个实体对象--entity。

     实体封装原则:

     表----实体类

     字段---属性

     实现序列化

     提供set,get方法。


以下代码就是利用Dao数据访问对象写出的JDBC程序,利用封装简化了JDBC开发步骤。

试想一下,如果,有10个添加,20个删除的请求,还像JDBC1.0,2.0版本那样写的话,要写10遍,20遍大量相似代码,

基本一致的代码。这不仅耗时耗力,也不符合JAVA三大特性。所以,利用Dao数据访问层,将对表的常用操作,

封装成方法,这样再有10个添加或20个删除,我们只需要调用10次,20次这个封装好的添加或删除方法,

而不用再写那么多遍方法,大大简化了开发工作量。

以下是利用Dao思想实现的JDBC3.0是3.0版本后面还有更好的版本娓娓道来!>_<

JDBC_Dao.java

public class JDBC_Dao {

       

       public void add(Account account){

             Connection conn = null;

             PreparedStatement pstm = null;

             try {

                    //1加载驱动

                    Class.forName("com.Mysql.jdbc.Driver");

                    //2创建连接

                    conn = DriverManager.getConnection(

                                  "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC",

                                 "root",

                                 "root");

                    //3准备sql

                    String sql = "insert into account values(?,?,?,?)";

                    //4创建Statement,发送sql

                    pstm = conn.prepareStatement(sql);

                    pstm.setString(1,account.getCardId());

                    pstm.setString(2, account.getPassword());

                    pstm.setDouble(3, account.getBalance());

                    pstm.setString(4, account.getPhone());

                    int i = pstm.executeUpdate();

                    //5如果是查询的话,处理结果集

             } catch (Exception e) {

                    e.printStackTrace();

             }

             finally{

                    //6释放资源

                    try {

                           pstm.close();

                           conn.close();

                    } catch (SQLException e) {

                           e.printStackTrace();

                    }

             }

       }

       

       public Account query(Account account){

             Connection conn = null;

             PreparedStatement pstm =null;

             ResultSet rs = null;

             try {

                    //1加载驱动

                    Class.forName("com.mysql.jdbc.Driver");

                    //2创建连接

                    conn = DriverManager.getConnection(

                                  "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC",

                                 "root",

                                 "root");

                    //3准备sql

                    String sql = "select * from account where "

                    + "card_id = ? and passWord = ?";

                    //4创建Statement发送语句

                    pstm = conn.prepareStatement(sql);

                    pstm.setString(1, account.getCardId());

                    pstm.setString(2, account.getPassword());

                    rs = pstm.executeQuery();

                    //5处理结果集

                    while (rs.next()) {

                           account.setCardId(rs.getString("card_id"));

                           account.setPassword(rs.getString("password"));

                           account.setBalance(rs.getDouble("balance"));

                           account.setPhone(rs.getString("phone"));

                    }

             } catch (Exception e) {

                    e.getStackTrace();

             }

             finally{

                    //6释放资源

                    try {

                           rs.close();

                           pstm.close();

                           conn.close();

                    } catch (SQLException e) {

                           e.printStackTrace();

                    }

             }

             return account;

       }

}




以上代码依旧使用account表,需要再写一个实体对象用来承载数据,一个test类用来调用方法,

,这些最基础的,这里就不赘述了,不清楚的同学就要自行参阅java语言了。

如果我查询A卡,B卡,C卡,三张银行卡信息,按照JDBC2.0要写三个查询方法,现在,只需要把参数传递过去,

调用三次query()方法就好了!

总结:可见利用Dao数据访问层封装JDBC常用方法,可以大大简化方法步骤,不用重复写方法,只需重复调用。

这就是JDBC3.0版本

=============================华丽丽的分割线================

但是仔细的读者一定发现了,这里还存在不少缺陷,没错,我们还可以改进它。

在JDBC3.0版本里,可以发现,查询,添加方法,存在大量冗余代码,比如:

①同的加载驱动, ②相同的创建连接,③相同的释放资源。

在上个版本的代码里我只写了添加查询方法,如果还有删除,修改,查询所有等方法呢,

没错这些方法,也存在相同的创建连接,释放链接。找见了问题,就好解决了。

那么解决的办法还是----封装。

我们可以尝试把1注册驱动,2创建连接,6释放资源,这三个步骤做成工具类-----JDBCutil

这样,我们在Dao层里面的JDBC方法,在遇到1,2,6等步骤时,不用再去写代码,只需调用封装好的工具即可。

没错程序员都是很懒得!

以下是JDBC4.0是4.0版本,后面还有更完善的版本娓娓道来!


public class JDBC_Util {

       

       public static Connection getConnection() throws Exception {

             Connection conn = null;

             Class.forName("com.mysql.jdbc.Driver");

             conn = DriverManager.getConnection(

                           "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC",

                           "root",

                           "root");

             

             return conn;

       }

       

       public static void release(ResultSet rs,

                    Statement stm,

                    Connection conn){

             try {

                    if(rs!=null){rs.close();}

                    if(stm!=null){stm.close();}

                    if(conn!=null){conn.close();}

             } catch (SQLException e) {

                    e.printStackTrace();

             }

       }

}

public class JDBC_Dao2 {

       

       public void add(Account account){

             Connection conn = null;

             PreparedStatement pstm = null;

             try {

                    conn = JDBC_Util.getConnection();

                    //3准备sql

                    String sql = "insert into account values(?,?,?,?)";

                    //4创建Statement,发送sql

                    pstm = conn.prepareStatement(sql);

                    pstm.setString(1,account.getCardId());

                    pstm.setString(2, account.getPassword());

                    pstm.setDouble(3, account.getBalance());

                    pstm.setString(4, account.getPhone());

                    int i = pstm.executeUpdate();

                    //5如果是查询的话,处理结果集

             } catch (Exception e) {

                    e.printStackTrace();

             }

             finally{

                    //6释放资源

                    JDBC_Util.release(null, pstm, conn);

             }

       }

       

       public Account query(Account account){

             Connection conn = null;

             PreparedStatement pstm =null;

             ResultSet rs = null;

             try {

                    conn = JDBC_Util.getConnection();

                    //3准备sql

                    String sql = "select * from account where " + "card_id = ? and password = ?";

                    //4创建Statement发送语句

                    pstm = conn.prepareStatement(sql);

                    pstm.setString(1, account.getCardId());

                    pstm.setString(2, account.getPassword());

                    rs = pstm.executeQuery();

                    //5处理结果集

                    while (rs.next()) {

                           account.setCardId(rs.getString("card_id"));

                           account.setPassword(rs.getString("password"));

                           account.setBalance(rs.getDouble("balance"));

                           account.setPhone(rs.getString("phone"));

                    }

             } catch (Exception e) {

                    e.getStackTrace();

             }

             finally{

                    //6释放资源

                    JDBC_Util.release(rs, pstm, conn);

             }

             return account;

       }

}


细心地读者会发现在代码里原本创建连接和释放资源的位置都变成了方法调用。

 conn = JDBC_Util.getConnection();

 JDBC_Util.release(rs, pstm, conn);

4.0版本通过工具类调用的方式进一步精简了代码,那么4.0版本还有没有缺陷了呢。

=======================华丽丽的分割线============================

对于JDBC_Util.java来说,还有许多不足。

1:

             conn = DriverManager.getConnection(

                           "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC",

                           "root",

                           "root");

比如创建连接的方式,是在代码里写死的用户名和密码,以及连接url,而java文件运行的时候,会编译成class文件

也就是说,JDBC_Util最终会是JDBC_Util.class文件,那么一旦数据库改变密码,用户名,或改换数据库,

整个文件还需要重新编译执行。对此,我们可以把经常变动的代码放到properties配置文件里去。


2:每次调用获得连接的方法都需要加载驱动,

Class.forName("com.mysql.jdbc.Driver");

调用10次则加载10次,大大浪费了JVM内存,其实对于加载驱动只需要加载一次,我们可以尝试把加载驱动放到

静态代码块里。静态代码块在类加载时执行,只执行一次。


properties配置文件简介及使用:

1: InputStream is = new FileInputStream("配置文件路径");

     BufferedReader br = bew BufferedReader(new InputStramReader(is));

     String as = br.readLine();

2:properties 是Map的实现类:

     1:获得配置文件的输出流。

     2:调用load(is);加载配置文件里的信息至Properties对象中。


下面的JDBC5.0版本是对JDBC_Util的改进。采用了静态代码块加读取配置文件的优化方案。

包括test.java,JDBC_Util2.java,JDBC_Dao2.java,properties文件,共四个。

JDBC_Uril2.java

public class JDBC_Util2 {

       private static final Properties prop = new Properties();

       static{

             InputStream is = null;

             try {

                    is = JDBC_Util2.class.getResourceAsStream("jdbc.properties");

                    prop.load(is);

                    String driverName = prop.getProperty("driverName");

                    Class.forName(driverName);

             } catch (Exception e) {

                    e.printStackTrace();

             }

       }

       

       public static Connection getConnection() throws Exception {

             Connection conn = null;

             String user = prop.getProperty("user");

             String password = prop.getProperty("password");

             String url = prop.getProperty("url");

             conn = DriverManager.getConnection(url,user,password);

             return conn;

       }

       

       public static void release(ResultSet rs,

                    Statement stm,

                    Connection conn){

             try {

                    if(rs!=null){rs.close();}

                    if(stm!=null){stm.close();}

                    if(conn!=null){conn.close();}

             } catch (SQLException e) {

                    e.printStackTrace();

             }

       }

}


JDBC_Dao2.java


public class JDBC_Dao2 {

       

       public void add(Account account){

             Connection conn = null;

             PreparedStatement pstm = null;

             try {

                    conn = JDBC_Util2.getConnection();

                    //3准备sql

                    String sql = "insert into account values(?,?,?,?)";

                    //4创建Statement,发送sql

                    pstm = conn.prepareStatement(sql);

                    pstm.setString(1,account.getCardId());

                    pstm.setString(2, account.getPassword());

                    pstm.setDouble(3, account.getBalance());

                    pstm.setString(4, account.getPhone());

                    int i = pstm.executeUpdate();

                    //5如果是查询的话,处理结果集

             } catch (Exception e) {

                    e.printStackTrace();

             }

             finally{

                    //6释放资源

                    JDBC_Util2.release(null, pstm, conn);

             }

       }

       

       public Account query(Account account){

             Connection conn = null;

             PreparedStatement pstm =null;

             ResultSet rs = null;

             try {

                    conn = JDBC_Util2.getConnection();

                    //3准备sql

                    String sql = "select * from account where "

                    + "card_id = ? and password = ?";

                    //4创建Statement发送语句

                    pstm = conn.prepareStatement(sql);

                    pstm.setString(1, account.getCardId());

                    pstm.setString(2, account.getPassword());

                    rs = pstm.executeQuery();

                    //5处理结果集

                    while (rs.next()) {

                           account.setCardId(rs.getString("card_id"));

                           account.setPassword(rs.getString("password"));

                           account.setBalance(rs.getDouble("balance"));

                           account.setPhone(rs.getString("phone"));

                    }

             } catch (Exception e) {

                    e.getStackTrace();

             }

             finally{

                    //6释放资源

                    JDBC_Util2.release(rs, pstm, conn);

             }

             return account;

       }

}


jdbc.properties文件


driverName=com.mysql.jdbc.Driver

user=root

password=root

url=jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC


Test_Dao.java

public class Test_Dao {

       public static void main(String[] args) {

             JDBC_Dao2 jd = new JDBC_Dao2();

             Account account = new Account("10004","44444",99,"12345678900");

             jd.add(account);

       }

}


解决了依赖注入,冗余代码,资源浪费等问题之后,JDBC5.0完毕。这个版本可以算得上是较为完善的版本了,但是还有瑕疵。

后面关于JDBC的问题涉及到事务,以及mvc模式,这里由于篇幅问题,无法细细详谈,但我会竟可能详细的写。

请小伙伴自行阅读有关oracle事务一章节,还有有关mvc编程思想书籍。


============================华丽丽的分割线======================

 由于篇幅原因,后续部分请大家阅读由浅到深学习JDBC三

不妥之处恳请读者批评指正,共同进步。>_<

您可能感兴趣的文档:

--结束END--

本文标题: 由浅到深学习JDBC二

本文链接: https://www.lsjlt.com/news/42641.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL注入宽字节注入由浅到深学习
    目录前言基础知识宽字节宽字节注入例子例题一例题二SQLMAP应用结语前言 突然想起来之前讲SQL注入时忘记讲一下这个宽字节注入了,因为这个知识点还是挺重要的,所以本文就带大家了解一...
    99+
    2023-02-24
    SQL宽字节注入 SQL 注入
  • 由浅入深学习TensorFlow MNIST 数据集
    目录MNIST 数据集介绍LeNet 模型介绍卷积池化 (下采样)激活函数 (ReLU)LeNet 逐层分析1. 第一个卷积层2. 第一个池化层3. 第二个卷积层4. 第二个池化层5...
    99+
    2024-04-02
  • Java由浅入深学习数组的使用
    目录一、前言二、数组的定义1.概述2.静态初始化数组3.动态初始化数组4.总结三、数组的属性1.访问2.长度3.遍历四、内存图1.单数组内存图2.多数组内存图3.数组指向相同内存五、...
    99+
    2024-04-02
  • JDBC获取数据库连接由浅入深
    添加MySQL驱动: 不同的数据库厂商都会有自己的实现java.sql.Driver接口的驱动程序,例如mysql的实现就是com.mysql.jdbc.Driver,将mysql-...
    99+
    2024-04-02
  • Python学习 :深浅拷贝
    深浅拷贝   一、浅拷贝 只拷贝第一层数据(不可变的数据类型),并创建新的内存空间进行储蓄,例如:字符串、整型、布尔 除了字符串以及整型,复杂的数据类型都使用一个共享的内存空间,例如:列表 列表使用的是同一个内存地址,指向原拷贝的值,即使...
    99+
    2023-01-30
    深浅 Python
  • opencv深入浅出了解机器学习和深度学习
    目录机器学习kNN算法图解kNN算法用kNN算法实现手写数字识别SVM算法图解SVM算法使用SVM算法识别手写数据k均值聚类算法图解k均值聚类算法使用k均值聚类算法量化图像颜色深度学...
    99+
    2024-04-02
  • 《深入浅出深度学习:原理剖析与pytho
    8.1 生物神经元(BN)结构 1、人脑中有100亿-1000亿个神经元,每个神经元大约会和其他1万个神经元相连 2、细胞体:神经元的主体,细胞体=细胞核+细胞质+细胞膜,存在膜电位 3、树突:从细胞体向外延伸出许多突起的神经纤维。输入...
    99+
    2023-01-31
    深入浅出 深度 原理
  • python学习笔记:第7天 深浅拷贝
    目录 1. 基础数据类型补充 2. set集合 3. 深浅拷贝 1. 基础数据类型补充 (1)join方法 join方法是...
    99+
    2023-01-30
    深浅 学习笔记 python
  • Java线程池由浅入深掌握到精通
    目录1.为什么使用线程池?2.线程池的好处:3.线程池使用的场合4.创建和停止线程5.停止线程池的方法6.暂停和恢复线程池1.为什么使用线程池? 反复创建线程开销大,可以复用线程池 ...
    99+
    2024-04-02
  • C#异步编程由浅入深(二)之Async/Await的使用
      考虑到直接讲实现一个类Task库思维有点跳跃,所以本节主要讲解Async/Await的本质作用(解决了什么问题),以及Async/Await的工作原理。实现一...
    99+
    2024-04-02
  • Go语言在人工智能:从机器学习到深度学习
    go语言在人工智能中广泛应用,包括在机器学习和深度学习中。文章介绍了go语言在机器学习中的库,如gonum和scikit-go,并展示了一个使用go语言训练逻辑回归模型的实用案例。此外,...
    99+
    2024-04-08
    人工智能 机器学习 python go语言
  • Python基础学习之深浅拷贝问题及递归函数练习
    目录一、深浅拷贝问题二、递归函数练习1. 求阶乘2. 猴子吃桃问题3. 打印斐波那契数列一、深浅拷贝问题 在实际工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修...
    99+
    2024-04-02
  • 深入浅出带你学习IIS中间件常见漏洞
    前言 在渗透过程中我们经常会思考如何去进行渗透,假如给了我们一个有很多中间件的网站我们要如何进行渗透呢?于是本人准备写一些包含常见中间件漏洞攻击的总结,希望可以帮到大家在面临不同渗透环境时会有渗透思路...
    99+
    2023-09-13
    学习 中间件 php
  • 解密ASP:深入浅出,循序渐进的学习之旅
    ASP.NET 是微软开发的一种用于构建动态网站和应用程序的服务器端技术。它提供了加密和解密功能,以保护敏感数据免遭未经授权的访问。本指南将逐步指导您了解 ASP 中加密和解密的原理和实践。 加密 加密是一种将明文(可读文本)转换为密文(...
    99+
    2024-03-14
    ASP基础
  • 机器深度学习二分类电影的情感问题
    二分类问题可能是应用最广泛的机器学习问题。今天我们将学习根据电影评论的文字内容将其划分为正面或负面。 一、数据集来源 我们使用的是IMDB数据集,它包含来自互联网电影数据库(IMDB...
    99+
    2024-04-02
  • PyTorch深度学习LSTM从input输入到Linear输出
    目录LSTM介绍LSTM参数InputsOutputsbatch_first案例LSTM介绍 关于LSTM的具体原理,可以参考: https://www.jb51.net/artic...
    99+
    2024-04-02
  • 剖析 Python 变量与数据类型:深入浅出的学习之旅
    变量是计算机程序中存储数据的容器,其类型决定了存储数据的格式和操作。在 Python 中,变量和数据类型密不可分,深入理解两者对于有效利用语言至关重要。 Python 变量 标识符:变量名称,由字母、数字或下划线组成,不能以数字开头。 ...
    99+
    2024-04-02
  • PHP 类与对象:深入浅出,从零开始学习面向对象编程
    面向对象编程是一种基于对象的概念进行设计的编程思想,它将程序中的数据和操作数据的方法封装成一个独立的整体,称为对象。每个对象都有自己的数据和方法,这些数据和方法被封装起来,隐藏在对象的内部,对外界不可见。对象之间通过消息传递来进行通信,一...
    99+
    2024-02-25
    PHP 类与对象:PHP 对象 面向对象编程
  • pytest自动化测试框架,真正做到从0到1由浅入深详细讲解【万字级】
    目录 嗨咯铁汁们,很久不见,我还是你们的老朋友凡叔,这里也感谢各位小伙伴的点赞和关注,你们的三连是我最大的动力哈,我也不会辜负各位的期盼,这里呢给大家出了一个pytest自动化测试框架由浅入深详细讲解。 一:框架简介 1:Pytest框架...
    99+
    2023-08-31
    python 单元测试 pytest
  • 由浅到深带你详谈Java实现数组扩容的三种方式【建议收藏】
    目录 1.新建一个数组,把原来数组的内容搬到新数组中。2.使用system.arraycopy()3.使用java.util.Arrays.copyOf() 1.新建一个数组,把原来...
    99+
    2023-08-31
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作