1章 JDBC

1.1 JDBC概述

JDBC(Java DataBase Connectivity,java动态数据 库连接技术)是一种用于执行SQL语句的Java API : Application Interface。

API : application Interface 程序的接口 一套几口可以有N套实现类(Mysql Oracle SqlServer) JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组 用Java语言编写的接口和类组成。 java.sql.*; java.net.*;

JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设 备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。

今天我们使用的是mysql的驱动mysql­connector­java­5.1.6 JDBC与数据库驱动的关系:接口与实现的关系。

JDBC规范(掌握四个核心对象):

DriverManager:用于注册驱动

Connection: 表示与数据库创建的连接

Statement: 操作数据库sql语句的对象

ResultSet: 结果集或一张虚拟表

1.2 JDBC原理

Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动。

1.3 JDBC入门案例

1.3.1 准备数据

既然是数据操作 数据保存在哪里呢?

1) mysql 数据是保存在数据库里的 相同类型的数据 用表的形式进行存储 表存入小的数据库 里

1. 创建数据库 : jdbcdb

2. 创建person表

CREATE 

添加测试数据

insert 

1.3.2 项目准备

1.创建java项目

编写项目名称并且查看是否已指定JDK

创建完的效果

项目新建lib文件夹

文件夹叫lib

创建好之后把jar包拷贝进去

2.添加JAR包准备jdbc开发

项目上右键选择jar包管理

添加数据库jar包

1.3.3 开发步骤

1.3.4 Hello,World!小案例

1.3.4.1 第一步获取数据库连接

package 

拓展1 :

ServiceLoader与ClassLoader是Java中2个即相互区别又相互联系的加载器.JVM利用ClassLoader将类载入内 存,这是一个类声明周期的第一步(一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载 五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况)。

那ServiceLoader又是什么呢?ServiceLoader:一个简单的服务提供者加载设施。服务 是一个熟知的接口和类(通常为抽象类)集合。服务提供者 是服务的特定实现。提供者中的类通常实现接口,并子类化在服务本身 中定义的子类。服务提供者可以以扩展的形式安装在 Java 平台的实现中,也就是将 jar 文件放入任意常用的 扩展目录中。也可通过将提供者加入应用程序类路径,或者通过其他某些特定于平台的方式使其可用。……唯 一强制要求的是,提供者类必须具有不带参数的构造方法,以便它们可以在加载中被实例化。

拓展2 : Junit 单元测试

JUnit是一个Java语言的单元测试框架。 它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。 JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。 Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成 什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。 说白了 junit 就是一种非常简单的程序测试手段灰常好用

那么junit该怎么使用呢?非常简单
项目上点击 右键 选择 "Build Path" ­­> "Configure Build Path..."

弹出的对话框选择 "Libraries" ­­> 选择 "Add Library"

在弹出的对话框中选择 "JUnit" 点击 "Next>"

在弹出的对话框中确定junit的版本是不是junit4

如果是点击"Finish" ­­> "OK" 完成即可,这样你项目中 就有单元测试功能了 添加完的效果

添加完了之后我们想要用单元测试怎么用呢? 回想下我们之前的玩法,如果想测试一个东西的话我们需要些个main方法

package 

但是大家注意一个问题 一个类只能有一个main方法,向我们以后测试很多功能一个main方法 哪够?

所以junit就可以帮助我们做到一个类中有多个main方法

举个例子比如我想测试一个功能你可以这么办

第一步 : 先写一个没有参数和返回值的方法(记住 一定是无参 无返回值的!)

package 

第二步 : 在这个方法的上面标记一个 @Test注解

package 

什么是注解呢?

Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行 基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标 记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在, 我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时 选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现 (SOURCE/CLASS/RUNTIME)。

说白了 注解就是可以把普通的类和方法编程特殊功能的标记,此处我们就是将这个普通方法标记为了一个 单元测试方法,那么它将获得和main方法一样的能力

第三步 : 编写要测试的功能

package 

第四步 : 执行单元测试

选中方法名 点击鼠标右键 "Run As" 选择 "Junit Test" 即可

此处一定要注意选中方法名!要不然我们后来单元测试多了,你不选中要测试的方法,所有方法 会一起执行,到时候就热闹了!

效果:

总结 : 单元测试可以把普通的方法变成main方法,所以这样大大的优化了我们测试功能的方 式,非常好并且使用的一项技术;

1.3.4.1 第二步编写查询案例

package 

上述写法中获取数据部分很明显有一个问题,就是如果有很多很多行的话,作为一个程序员我 就很尴尬了.......

有没有什么办法解决呢? 没有,*!

其实非常简单

package 

效果 :

1.4 API详解

1.4.1 API详解:注册驱动

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

创建 com.mysql.jdbc.Driver 这个类的对象供连接数据库使用

1.4.2 API详解:获得链接

static Connection getConnection(String url, String user, String password)

试图建立到给定数据库 URL 的连接。

参数说明:url 需要连接数据库的位置(网址) user用户名 password 密码

例如:

URL

统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准 资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该 怎么处理它。

基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查 询”。完整的、带有授权部分的普通统一资源标志符语法看上去如下:协议://用户名:密码@子域名.域名. 顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

比如我们的URL : jdbc:mysql://127.0.0.1:3306/jdbcdb

协议子协议 IP :端口号数据库

后面用?连接一个参数

characterEncoding=UTF­8

因为Java程序与数据库之间采用TCP协议连接,所以传输字符的时候好设置下编码,要不然 会乱码

小常识 : 127.0.0.1 是自己电脑的IP地址,也可以写成localhost

所以上面的URL还可以写成

mysql: jdbc:mysql://localhost:3306/要连接数据库名称 或者直接简写成 jdbc:mysql:///要连接 的数据库名称(默认本机连接)

1.4.3 java.sql.Connection接口:一个连接

接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。 Statement createStatement(); //创建操作sql语句的对象

1.4.4 API详解:java.sql.Statement接口: 操作sql语句,并返回相应结果

String sql = "某SQL语句";

获取Statement语句执行平台:Statement stmt = con.createStatement();

常用方法:

1.4.5 API详解:处理结果集(注:执行insert、update、delete无需处 理)

ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录, 当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用ResultSet提供的 getXXX(int col)方法(与索引从0开始不同个,列从1开始)来获取指定列的数据:

rs.next();//指向第一行

rs.getInt(1);//获取第一行第一列的数据

常用方法:

1.4.6 API详解:释放资源

与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。 set.close(); // RestuleSet是Statement执行后才有的对象所以需要先关set再关stat stmt.close(); // Statement 是Connection 创建出来的 所以必须先关闭stat 再关闭 conn con.close(); // 万恶之源 后关闭

注意 : java.sql.ResultSet java.sql.Statement java.sql.Connection 以上这三个接口都是来自于java.sql包的,千万记住别导错包,千万记住别导错包,千万记住别 导错包!

1.5 CURD小案例

1.5.1 添加小案例

代码

package 

效果 :

数据库 :

1.5.2 更新小案例

代码:

package 

效果 :

数据库 :

1.5.3 删除小案例

代码:

package 

效果:

数据库:

切记 : 删除,更新一定是删除或者更新数据库里有的数据,而添加一定是添加数据库里没有的 数据!

1.5.4 查询全部小案例

代码:

package 

效果:

1.6 JDBC工具类

从刚才的小案例我们可以看出一个问题,代码中有两个地方的代码出现了一个高重复率问题; 1) 数据库连接的获取部分

// 

2) 数据库连接的关闭部分

// 

既然我们发现了代码重复的部分,我们就要把它抽取出来,所以我们需要封装一个数据库连接 打开与关闭的工具类 JdbcUtil

代码 :

package 

单元测试

// 

效果 :

当然如果你不想加这么多系统日志,还可以有一个纯净版的

package 

用哪个都可以,我建议大家用有日志版本的;

1.7 预处理对象

1.7.1 SQL注入问题

SQL注入:用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义。

举个例子 :

比如我有一个根据姓名查询信息的方法

/**

单元测试

@

此处需要注意 name字段是varchar类型.所以传值的时候需要添加 '字符'

效果 :

现在呢 我要干一件有趣的事情

修改单元测试

@

此处观察我传入的参数 添加了 or true

那我们现在打印下SQL语句

select 

这条SQL语句 用 or连接两个条件 or代表或者 也就是当我筛选数据的时候 这条数据只要满 足其中一个条件就会被筛选出来,所以这时候就有问题了!

分析问题 :

问题出现在这里

// 

statement对象只能机械的帮助我们执行SQL语句,其他的一律不管,所以会出现这样的问题; 那有没有什么方案可以解决这个问题呢?

1.7.2 API详解:预处理对象

preparedStatement:

预编译对象,是Statement对象的子类。

特点:

性能高

会把sql语句先编译

能过滤掉用户输入的关键字。

PreparedStatement预处理对象,处理的每条sql语句中所有的实际参数,都必须使用占位 符?替换。 看下这回的按名称查找的方法

/**

修改成这种写法,其实大家可以观察到, PreparedStatement 对象在创建的时候就预编译了 SQL语句这样比Statement执行的时候再编译这种方式省去了编译步骤从而提高性能 并且PreparedStatement 执行的SQL语句采用占位符的形式避免了拼接 这样可以在输入参 数的时候就进行类型验证还能简化SQL的编写难度;

执行同样的单元测试

@

效果 :

根本找不到数据,从而防止了SQL的注入,那么如果你想查询赵文明呢?

单元测试 :

@

效果

1.7.3 Preparedstatement CURD小案例

1.7.3.1 封装实体类

我们接下来要进行 添加人员 删除人员 更新人员 修改人员操作;

但是现在有一个问题: 对于java程序来说,什么是人员呢?

java是面向对象编程,你现在既然要添加 删除 更新 查询 人员的话...........,我们根本就没有人 员这个对象呀!!!!

没事 先冷静一下,其实人员对象已经有了

观察数据库

我们通过观察得知,其实数据库中的一条记录就应该是我们Java中的一个对象,他们应该是一 一对应的

那么根据这种对应关系来看的话

表 对应 类

字段 对应 属性

所以 我要想有一个人员对象的话 那么必须先创建一个人员类,所以现在我应该创建一个人员 类!

代码 :

package 

之前我们说过JavaBean的概念,那么这个类的特点是与数据库表一一对应,数据库表又是现实 生活中实体的体现,所以这个与数据库对应的类其实有个名字叫做实体类,也叫实体Bean;

1.7.3.2 编写添加案例

编写添加方法

/**

单元测试

@

效果

1.7.3.3 编写更新案例

根据更新与删除原则,更新和删除必须更新和删除数据库里有的数据,所以我们每次要更新或 者删除的时候必须先查询数据库找到要更新的数据后再更新或删除,那么问题来了,我们怎么能

快速并且准确的定位到我们想要的数据呢,此时可以编写一个按ID查询方法定位我们的数据 (ID唯一,并且ID主键上有索引查询快)

编写按ID查询方法

/**

编写更新方法

/**

单元测试

@

效果

1.7.3.4 编写删除案例

编写删除方法

/**

单元测试

@

效果

1.7.3.5 编写查询案例

编写查询方法

/**

单元测试

@

效果

实体类需要加上toString()方法

@

java jdbc jar包_大数据从入门到深入:JavaEE 之 数据库技术 JDBC(1)相关推荐

  1. 外部jar包_大数据系列之PySpark读写外部数据库

    本文以MySQL和HBASE为例,简要介绍Spark通过PyMySQL和HadoopAPI算子对外部数据库的读写操作 1.PySpark读写MySQL MySQL环境准备参考"数据库系列之M ...

  2. java jdbc jar包_通过 Spring 框架如何进行JDBC操作呢?

    Spring 整合 JDBC 的方式 添加依赖 编写配置文件 db.properties bean.xml 配置修改 配置数据源 模板类配置 测试整合结果 案例实操 添加依赖 数据库驱动 jar 包 ...

  3. jsp 动态添加一行数据_大数据从入门到深入:JavaEE 之 动态网页开发基础 JSP的数据交互(3)...

    1.7 JSP实战 1.7.1 需求说明 : 采用model 1模式开发数据库表的增删改查业务 假设 数据库有一张表叫person表,完成person表的页面级别的 查询全部 添加 修改 删除 功能 ...

  4. 诸葛io的技术架构图_大数据浪潮下,诸葛io平台的技术演化之路

    本文作者主要以诸葛io背后的大数据平台设计为重点展开讲解. 从本质上来讲,大数据平台的目标都是完成对数据的采集.清洗.加工.加载.建模分析,可视化的过程. 一.大数据平台的通用架构 1. 数据采集: ...

  5. java groovy jar包_如何将jar包包含在groovy脚本中?

    如果你真的需要,你也可以在运行时加载一个JAR: this.getClass().classLoader.rootLoader.addURL(new File("file.jar" ...

  6. 混合高斯模型_大数据小白入门高斯混合模型(GMM)聚类算法

    导读 高斯混合模型(Gaussian Mixture Model)通常简称GMM,是一种业界广泛使用的聚类算法,属于生成式模型,它假设所有的数据样本都是由某一个给定参数的 多元高斯分布 所生成的.从中 ...

  7. 5获取按钮返回值消息_大数据从入门到深入:JavaEE 之 项目实战 项目基础编码阶段(5)...

    2.5 学生信息删除 2.5.1 产品经理阶段 操作要求 : 点击页面的删除按钮,弹出删除提示框,确定后删除学生信息和学生的考试成绩; 2.5.2 项目经理阶段 业务分析 : 删除学生信息的时候还要删 ...

  8. java -jar 停止_推荐:Linux启动Java程序jar包Shell脚本

    每次启动Java程序jar包的时候,难道你还在手敲java -jar xxserver.jar--?边敲边想着都需要追加哪些参数? 今天就推荐给大家一个几乎通用的Shell脚本,它支持Java程序Ja ...

  9. java bat 运行 jar文件_运行bat文件启动java的jar且不弹出DOS窗口,后台运行java的jar包...

    本文主要是将java的jar包启动的cmd命令添加到bat文件来执行,且不弹出DOS窗口,也就是后台运行java的jar包. 这里以win10为例 1.新建 一个txt文件,在文件添加以下内容.其中E ...

最新文章

  1. BZOJ 1009 [HNOI2008]GT考试
  2. mit risc-v 资料
  3. Eclipse新建的Maven项目想修改DynamicWebModule,直接去项目目录下修改
  4. 戏说模式-追MM与设计模式 (转载)
  5. JavaScript基础事件(6)
  6. 华为双系统是鸿蒙系统吗,华为p50pro是鸿蒙系统吗-华为p50pro有双系统吗
  7. 力扣1232.缀点成线
  8. [转载] python中字典中追加_python 中字典中的删除,pop 方法与 popitem 方法
  9. matlab的梯形公式推导公式,复化梯形公式,辛普森公式的matlab程序
  10. python内置函数每个执行一次
  11. offsetTop和scrollTop差异
  12. eclipse jsEclipse javascript编辑器
  13. DC中保存ddc格式文件(亲测有效!)save the unmapped design in ddc format
  14. 四阶魔方用三阶魔方公式时,两个特殊情况处理方式(顶面十字、最后一步)
  15. Maxwell参数化建模和优化设计
  16. CSS实现多余文本隐藏
  17. java小型计费系统设计_JAVA课程设计模拟电信计费系统
  18. ssm+mysql+安卓app大学生社团信息管理系统-计算机毕业设计源码99953
  19. 机器人python极客pdf_机器人Python极客编程入门与实战
  20. 机器学习中分类和回归模型的评价指标

热门文章

  1. 吐槽 Twitter 后,马斯克用 30 亿美元入股 Twitter,成为最大股东
  2. 跑了 13 种编程语言的 Hello World,可视化后有了新发现!
  3. ​腾讯第一季度员工平均月薪 7.6 万元;“淘宝特价版”App 正式更名为“淘特”;Deno 1.10 正式发布|极客头条...
  4. 最“好”的编程语言 PHP 真的无药可救了吗?
  5. GitHub 年度报告正式发布,JavaScript 霸榜、TypeScript 爆发!
  6. AI 修复 100 年前晚清影像喜提热搜,有穿越内味儿了!
  7. 付费?广告?捐款?如何让开源软件活下去?
  8. 600岁故宫插上科技翅膀 技术与营销的「双刃剑」?
  9. C++控制台打飞机小游戏 | CSDN 博文精选
  10. 大势要落地!开发者应该关注的 AI 应用落地实践