Java面向对象笔记 • 【第9章 JDBC编程】
全部章节 >>>>
本章目录
9.2.2 使用PreparedStatement执行insert操作
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编程】的更多相关文章
- 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试
20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...
- Java面向对象程序设计第14章3-8和第15章6
Java面向对象程序设计第14章3-8和第15章6 3.完成下面方法中的代码,要求建立一个缓冲区,将字节输入流中的内容转为字符串. import java.io.*; public class tes ...
- Java面向对象程序设计第9章1-9
Java面向对象程序设计第9章1-9 1. 线程和进程的联系和区别是什么? 联系: 一个进程可以包括多个线程. 区别: 进程: 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,它是系统 ...
- Java面向对象程序设计第8章3-5
Java面向对象程序设计第8章3-5 3.String类型有什么特点? 一旦赋值,便不能更改其指向的字符对象 如果更改,则会指向一个新的字符对象 不能为null 4.String什么时候进行值比较,什 ...
- Java面向对象程序设计第7章1-8
Java面向对象程序设计第7章1-8 1."程序中凡是可能出现异常的地方必须进行捕获或拋出",这句话对吗? 不对. 异常分两类,runtime异常和非runtime异常. runt ...
- Java面向对象笔记 • 【第3章 继承与多态】
全部章节 >>>> 本章目录 3.1 包 3.1.1 自定义包 3.1.2 包的导入 3.1.3 包的访问权限 3.1.4 实践练习 3.2 继承 3.2.1 继承概述 3 ...
- Java 学习笔记 ------第六章 继承与多态
本章学习目标: 了解继承的目的 了解继承与多态的关系 知道如何重新定义方法 认识java.lang.object 简介垃圾回收机制 一.继承 继承是java面向对象编程技术的一块基石,因为它允许创建分 ...
- 《Clojure编程》笔记 第2章 函数式编程
目录 背景简述 第2章 函数式编程 背景简述 本人是一个自学一年Java的小菜鸡,理论上跟大多数新手的水平差不多,但我入职的新公司是要求转Clojure语言的.坊间传闻:通常情况下,最好是有一定Jav ...
- [CSAPP笔记][第十一章网络编程]
第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...
随机推荐
- Function Overloading in C++
In C++, following function declarations cannot be overloaded. (1)Function declarations that differ o ...
- 【Linux】【Services】【MessageQueue】搭建高可用rabbitMQ
1. 简介 1.1. 官方网站: https://www.rabbitmq.com/ 1.2. 配置文档:https://docs.openstack.org/ha-guide/shared-mess ...
- 【Service】【Database】【Cache】Redis
1. 简介: 1.1. redis == REmote DIctionary Server 1.2. KV cache and store, in-memory, 持久化,主从(sentinel实现一 ...
- 【Java 8】函数式接口(二)—— 四大函数接口介绍
前言 Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词 在学习了解之前 ...
- BS版本的TCP程序
// 使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象 InputStream is = socket.getInputStream();// ...
- 【C#】【MySQL】【GridView】删除出现Parameter index is out of range
[编程语言]C# [数据库]MySQL [控件]GridView [问题描述]GridView控件中自带[删除],[编辑],[选择],三个按钮[编辑],[选择]正常使用,但是在使用删除时,却报错Par ...
- Linux 文件权限、系统优化
目录 Linux 文件权限.系统优化 1.文件权限的详细操作 1.简介: 2.命令及归属: 3.权限对于用户和目录的意义 权限对于用户的意义: 权限对于目录的意义: 4.创建文件/文件夹的默认权限来源 ...
- [BUUCTF]PWN——picoctf_2018_rop chain
picoctf_2018_rop chain 附件 步骤: 例行检查,32位,开启了NX保护 试运行一下程序,看到输入太长数据会崩溃 32位ida载入,习惯性的检索程序里的字符串,看见了flag.tx ...
- JetBrains又出神器啦!Fleet,体验飞一般的感觉
目录 简介 从eclipse到Fleet Fleet的特性 JetBrains Space 总结 简介 java开发的同学可能对于JetBrains这家公司并不陌生,因为JetBrains号称拥有世界 ...
- CF656C Without Text 题解
Content 输入一个字符串 \(s\),遍历每一个字符,如果这个字符是小写字母,那么答案就加上这个字母的字母表序:否则,如果这个字符是小写字母,那么答案就减去这个字母的字母表序.求最后的答案. 字 ...