全部章节   >>>>


本章目录

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. Gradle—Android配置详解

    参考[1]彻底弄明白Gradle相关配置       [2]Android Studio gradle配置详解

  2. URL+http协议

  3. 增大Oracle Virtualbox的磁盘空间

    https://blog.csdn.net/hiyachen/article/details/102131823 背景 在virtualbox中装好Linux以及Application之后,发现硬盘空 ...

  4. RAC常见的宏

    1. RAC           作用:用来给某个对象的某个属性绑定信号,只要产生信号内容就会把内容给属性赋值            RAC(_label, text) = _textField.ra ...

  5. MFC入门示例之列表框(CListControl)

    初始化: 1 //初始化列表 2 m_list.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); //报表样式 3 m_list.InsertColumn(0, TEXT( ...

  6. RocketMQ应用及原理剖析

    主流消息队列选型对比分析 基础项对比 可用性.可靠性对比 功能性对比 对比分析 Kafka:系统间的流数据通道 RocketMQ:高性能的可靠消息传输 RabbitMQ:可靠消息传输 RocketMQ ...

  7. MyBatis一对多映射简单查询案例(嵌套Mapper映射文件中的sql语句)

    一.案例描述 书本类别表和书本信息表,查询书本类别表中的某一记录,连带查询出所有该类别书本的信息. 二.数据库表格 书本类别表(booktypeid,booktypename) 书本信息表(booki ...

  8. Android CameraX 打开摄像头预览

    目标很简单,用CameraX打开摄像头预览,实时显示在界面上.看看CameraX有没有Google说的那么好用.先按最简单的来,把预览显示出来. 引入依赖 模块gradle的一些配置,使用的Andro ...

  9. ANTLR 相关术语

    下面介绍很多重要的与语言识别相关的术语. 语言(Language) A language is a set of valid sentences 一门语言是一个有效语句的集合. Sentences a ...

  10. Java中Date类型与String 类型之间的互相转换

    Java中String类型和Date类型之间的转换 我们在注册网站的时候,往往需要填写个人信息,如姓名,年龄,出生日期等,在页面上的出生日期的值传递到后台的时候是一个字符串,而我们存入数据库的时候确需 ...