全部章节   >>>>


本章目录

9.1 JDBC基础

9.1.1 JDBC简介

9.1.2 JDBC常用API简介

JDBC 常用API功能说明

9.1.3 JDBC编程步骤

9.1.4 实践练习

9.2 PreparedStatement执行DML语句

9.2.1 PreparedStatement接口

9.2.2 使用PreparedStatement执行insert操作

9.2.3 实践练习

9.3 数据库操作封装类DBConnection

9.3.1 定义数据库操作封装类

9.3.2 实践练习

9.4 PreparedStatement执行查询语句

9.4.1 ResultSet对象

ResultSet类常用方法

9.4.2 操作ResultSet对象

9.4.3 实践练习

总结:


9.1 JDBC基础

9.1.1 JDBC简介

JDBC(Java Database Connectivity),即Java数据库连接。它是一种可以执行SQL语句的Java API。

  • 通过JDBC API可连接到数据库,并使用结构化查询语句实现对数据库的查询、更新等操作。
  • 使用JDBC开发数据库应用可以跨平台运行,并且可以跨数据库。
  • 通过JDBC API,不必为访问Sybase、DB2等数据库学习新的API,从而极大的简化了开发人员使用Java语言对数据库的操作。
  • 为使JDBC程序可以跨平台,需要不同的数据库厂商提供相应的驱动程序。

9.1.2 JDBC常用API简介

JDBC提供了独立于数据库的统一API,用于帮助用户建立与数据库的连接、执行SQL语句和检索结果集等。JDBC API位于java.sql包。

JDBC 常用API功能说明

类和接口

功能

java.sql.DriverManager

管理JDBC驱动程序,使用它可以获取Connection对象

java.sql.Connection

建立与特定数据库的连接(会话),建立后可以执行SQL语句

java.sql.Statement

用于执行SQL语句

java.sql.PreparedStatement

预编译的Statement,它是Statement的子接口

java.sql.CallableStatement

用于执行存储过程的Statement,它是Statement的子接口

java.sql.ResultSet

结果集对象。该对象包含访问查询结果的方法,Result可以通过索引或列名获得列数据

9.1.3 JDBC编程步骤

1、加载数据库驱动

将数据库驱动文件(jar文件)拷贝到classpath路径下。

加载驱动代码:Class.forName("com.mysql.jdbc.Driver");

2、获得数据库连接

Connection conn=DriverManager.getConnection(URL, USER, PASSWORD)

示例:

Connection conn = DriverManager.getConnection("jdbc:mysql:///localhost:3306/data","root", "root");

3、通过Connection实例获取Statement对象

Statement  stmt = conn.createStatement();

4、使用Statement实例执行SQL语句

int executeUpdate(String sql) throws SQLException

用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL语句(例如 CREATE TABLE 和 DROP TABLE)。

INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数。

对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

5、使用Statement实例执行SQL语句

ResultSet executeQuery(String sql) throws SQLException

用于产生单个结果集的语句,例如 SELECT 语句。

boolean execute(String sql) throws SQLException

运行可返回多个结果的SQL语句。如果结果是 ResultSet 对象,则方法 execute 返回 true;如果结果是 Java int,则返回 false。

6、处理ResultRest结果集

如果执行的SQL语句是查询语句,则执行结果将返回一个ResultSet对象,该对象保存了与SQL语句查询的结果。

7、回收数据库资源

回收数据库资源,包括关闭ResultSet、Statement和Connection资源。

示例:演示JDBC编程步骤

public class DbConnection {
private static final String DRIVERNAME="com.mysql.jdbc.Driver"; //驱动类的类名
private static final String URL="jdbc:mysql://localhost:3306/data"; //连接数据的URL路径
private static final String USER="root"; //数据库登录账号
private static final String PASSWORD="root"; //数据库登录密码
static{ //1.加载驱动,驱动仅需加载一次即可
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//2.获取数据库连接
public static Connection getConnection() {
Connection conn=null;
try {
return conn= DriverManager.getConnection(URL, USER,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void main(String[] args) {
Connection conn=DbConnection.getConnection();
System.out.println("数据库连接="+conn);
}
}

9.1.4 实践练习

9.2 PreparedStatement执行DML语句

9.2.1 PreparedStatement接口

  • PreparedStatement接口继承自Statement接口,其比Statement使用更为灵活高效。
  • PreparedStatement接口提供了更为安全的预处理功能,此功能可以有效防止SQL注入。
  • PreparedStatement接口会对sql语句进行预编译处理(如果JDBC驱动支持的话)。预编译的sql查询语句能在将来的查询中重用,因此查询速度更快。
  • Connection实例生成PreparedStatement 实例时,对于SQL语句中输入参数的值,创建时并未被指定,而是保留问号“?”作为占位符。
PreparedStatement pst = conn.prepareStatement("update Emp set name=?,address=? ,phone=?,Where no=?");
/* 输入参数赋值时使用setXxx(index,value)方法,其中Xxx为参数数据类型,index为参数编号,
value为参数值 */
pst.setString(1,"李彦宏");
pst.setString(2,"中国北京");
pst.setInt(3,17710398436);
pst.setString(4,"EMP-001" );

9.2.2 使用PreparedStatement执行insert操作

示例: 新增一条员工数据

public class Emp { //员工实体类
private String no;//员工编号
private String name;//姓名
private String birthday;//生日
private String address;//住址
private String post;//职务 //省略属性的getter和setter方法
}
public class ExecuteStatement {
public boolean insertData(Emp emp){//向数据库中插入员工数据
...
try {
String sql=" insert into t_emp(no,name,birthday,address,post) values(?,?,?,?,?)";
conn=getConnection();//获取数据库连接
//获取PraparedStatement对象
pStmt=conn.prepareStatement(sql);
//将占位符“?”使用预处理的方式替换成员工的账号,1表示第一个“?”占位符
pStmt.setString(1, emp.getNo());
pStmt.setString(2, emp.getName());
...
//执行SQL语句
return pStat.executeUpdate()>0?true:false;
} catch (Exception e) {
e.printStackTrace();
}finally{ //关闭相关资源 }
return false;
}
public static void main(String[] args) { //测试新增一条员工数据 }
}
public class ExecuteStatement {
public boolean updateData(Emp emp){//更新员工数据
...
try {
String sql=" update t_emp set name=?,birthday=?,address=?,post=?"
+" where no=?";
conn=getConnection();//获取数据库连接
//获取PraparedStatement对象
pStmt=conn.prepareStatement(sql);
pStmt.setString(1, emp.getName());
...
pStmt.setString(5, emp.getNo());
//执行SQL语句
return pStat.executeUpdate()>0?true:false;
} catch (Exception e) {
e.printStackTrace();
}finally{ //关闭相关资源 }
return false;
}
public static void main(String[] args) { //测试更新一条员工数据 }
}

9.2.3 实践练习

9.3 数据库操作封装类DBConnection

9.3.1 定义数据库操作封装类

将数据连接与关闭操作封装成工具类DbConnection

public class DbConnection {
//驱动类的类名
private static final String DRIVERNAME="com.mysql.jdbc.Driver";
//连接数据的URL路径
private static final String URL="jdbc:mysql://localhost:3306/data";
//数据库登录账号
private static final String USER="root";
//数据库登录密码
private static final String PASSWORD="root";
//1.加载驱动,驱动仅需加载一次即可
static{
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取数据库连接
public static Connection getConnection() throws Exception {
try {
return DriverManager.getConnection(URL, USER,PASSWORD);
} catch (SQLException e) {
e.printStackTrace(); throw new Exception();
}
}
//关闭连接
public static void colse(ResultSet rs,Statement stmt,Connection conn) throws Exception{
try { if (rs != null){ rs.close(); }
if (stmt != null) { stmt.cancel(); }
if (conn != null) { conn.close(); }
} catch (Exception e) {
e.printStackTrace(); throw new Exception();
}
}
}

9.3.2 实践练习

9.4 PreparedStatement执行查询语句

9.4.1 ResultSet对象

  • Statement对象的executeQuery()方法的返回值为ResultSet对象,该对象保存了与SQL语句查询的结果。
  • JDBC使用ResultSet封装查询到的结果,然后通过ResultSet记录的指针来获取结果集合的内容。

ResultSet类常用方法

方法名

作用

boolean  next()

判断Result结果集中是否还有数据,如果有返回true,没有返回false

String getString(Stirng columnName)

按照查询表的列名,获取该列所对应的列值

String getString(int columnIndex)

按照查询表的列的序号,获取该列所对应的列值

9.4.2 操作ResultSet对象

示例:操作员工的ResultSet结果集获取员工信息

public List<Emp> queryEmp(){
Connection conn=null;
PreparedStatement pStmt=null;
ResultSet rs=null;
try {
String sql="select * from t_emp";
conn=DbConnection.getConnection();
pStmt=conn.prepareStatement(sql);
rs=pStat.executeQuery(); //返回ResultSet实例
List<Emp> empList=new ArrayList<Emp>();
//判断结果集中是否还有数据
while(rs.next()){
String no=rs.getString("no"); //通过列名为no获取对应的列值
String name=rs.getString("name"); //通过列名为name获取对应的列值
...
Emp emp=new Emp();
//将从ResultSet结果集获取到信息封装至emp对象中
emp.setNo(no);
emp.setName(name);
...
}
return empList;
} catch (Exception e) {e.printStackTrace();}
finally{
try { DbConnection.colse(rs, pStat, conn); //释放资源 }
catch (Exception e) {e.printStackTrace();}
}
return null;
}

9.4.3 实践练习

总结:

  • 通过JDBC API可连接到数据库,并使用结构化查询语句实现对数据库的查询、更新等操作。使用JDBC开发数据库应用可以跨平台运行,并且可以跨数据库。
  • JDBC编程步骤:1.加载数据库驱动  2.获得数据库连接  3.通过Connection实例获取Statement对象 4.使用Statement实例执行SQL语句  5.处理ResultRest结果集 6.回收数据库资源
  • PreparedStatement接口继承自Statement接口,该接口会对sql语句进行预编译处理,因此查询速度更快。Connection实例生成PreparedStatement 实例时,对于SQL语句中输入参数的值,创建时并未被指定,而是保留问号“?”作为占位符。
  • Statement对象的executeUpdate(String sql) 返回受影响的行数,Statement对象的executeQuery(String sql) 返回查询结果集,即ResultSet对象。
  • 可以通过ResultSet记录的指针来获取结果集合的内容。

Java面向对象笔记 • 【第9章 JDBC编程】的更多相关文章

  1. 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试

    20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...

  2. Java面向对象程序设计第14章3-8和第15章6

    Java面向对象程序设计第14章3-8和第15章6 3.完成下面方法中的代码,要求建立一个缓冲区,将字节输入流中的内容转为字符串. import java.io.*; public class tes ...

  3. Java面向对象程序设计第9章1-9

    Java面向对象程序设计第9章1-9 1. 线程和进程的联系和区别是什么? 联系: 一个进程可以包括多个线程. 区别: 进程: 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,它是系统 ...

  4. Java面向对象程序设计第8章3-5

    Java面向对象程序设计第8章3-5 3.String类型有什么特点? 一旦赋值,便不能更改其指向的字符对象 如果更改,则会指向一个新的字符对象 不能为null 4.String什么时候进行值比较,什 ...

  5. Java面向对象程序设计第7章1-8

    Java面向对象程序设计第7章1-8 1."程序中凡是可能出现异常的地方必须进行捕获或拋出",这句话对吗? 不对. 异常分两类,runtime异常和非runtime异常. runt ...

  6. Java面向对象笔记 • 【第3章 继承与多态】

    全部章节   >>>> 本章目录 3.1 包 3.1.1 自定义包 3.1.2 包的导入 3.1.3 包的访问权限 3.1.4 实践练习 3.2 继承 3.2.1 继承概述 3 ...

  7. Java 学习笔记 ------第六章 继承与多态

    本章学习目标: 了解继承的目的 了解继承与多态的关系 知道如何重新定义方法 认识java.lang.object 简介垃圾回收机制 一.继承 继承是java面向对象编程技术的一块基石,因为它允许创建分 ...

  8. 《Clojure编程》笔记 第2章 函数式编程

    目录 背景简述 第2章 函数式编程 背景简述 本人是一个自学一年Java的小菜鸡,理论上跟大多数新手的水平差不多,但我入职的新公司是要求转Clojure语言的.坊间传闻:通常情况下,最好是有一定Jav ...

  9. [CSAPP笔记][第十一章网络编程]

    第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...

随机推荐

  1. 面试 Java 后端开发的感受

    上周,密集面试了若干位Java后端候选人,工作经验在3到5年间.我的标准其实不复杂(适用90%小小小公司,BAT等自动忽略): 第一能干活,第二Java基础要好,第三最好熟悉些分布式框架.我相信其它公 ...

  2. Vue API 3模板语法 ,指令

    条件# v-if# v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回 truthy 值的时候被渲染. v-show# v-show 指令也是用于根据条件展示一块内容.v-show ...

  3. GCD的补充

    1-1 关于GCD中的创建和释放     在iOS6.0之前,在GCD中每当使用带creat单词的函数创建对象之后,都应该对其进行一次release操作.           在iOS6.0之后,GC ...

  4. Apifox(2)快速上手apifox

    快速上手 使用场景 Apifox 是接口管理.开发.测试全流程集成工具,使用受众为整个研发技术团队,主要使用者为前端开发.后端开发和测试人员. 前端开发 接口文档管理 接口数据 Mock 接口调试 前 ...

  5. linux系统目录初识

    目录 今日内容概要 内容详细 系统目录结构介绍 目录结构知识描述 今日内容概要 系统目录结构介绍 目录结构详细描述 内容详细 系统目录结构介绍 # 1.linux系统中的目录 一切从根开始 结构拥有层 ...

  6. 《手把手教你》系列技巧篇(五十)-java+ selenium自动化测试-字符串操作-上篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

  7. Win7远程连接问题:凭据不工作 & 没有授权此用户账户

    一 您的凭据不工作 1.问题描述 win7系统远程桌面到某个电脑的一个账户名为admin 的用户,但提示"您的凭据不工作,之前连到 *.*.*.*的凭据无法使用,请输入新凭据",即 ...

  8. [BUUCTF]PWN17——[HarekazeCTF2019]baby_rop

    [BUUCTF]PWN17--[HarekazeCTF2019]baby_rop 附件 步骤: 例行检查,64位,开启了NX保护 试运行一下程序,看这个情况,当我们输入太长字符串的时候会报错 64位i ...

  9. SP8374 PARKET1 - PARKET 题解

    Content 有一个 \(l\times w\) 大小的网格,其四周均被染成了红色,其余部分是棕色,已知红色网格与棕色网格的数量,求 \(l\) 与 \(w\) 的值. Solution 接下来给各 ...

  10. 关于Spring MVC的问题

    一.SpringMVC的流程是什么? 1. 用户发送请求至前端控制器DispatcherServlet: 2. DispatcherServlet收到请求后,调用HandlerMapping处理器映射 ...