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服务器,能够为真 ...
随机推荐
- Oracle中的DBMS_LOCK包的使用
一.DBMS_LOCK相关知识介绍 锁模式: 名字 描述 数据类型 值 nl_mode Null INTEGER 1 ss_mode Sub Shared: used on an aggregate ...
- Linux基础命令---ntpq查询时间服务器
ntpq ntpq指令使用NTP模式6数据包与NTP服务器通信,能够在允许的网络上查询的兼容的服务器.它以交互模式运行,或者通过命令行参数运行. 此命令的适用范围:RedHat.RHEL.Ubuntu ...
- spring注解-web
以往进行web项目开发都需要在web.xml配置servlet.filter.listener,在Servlet3.0可以通过注解的方式配置它们(注意:必须用tomcat7以上版本) @WebServ ...
- vue-cli2嵌入html
1.使用iframe <!-- 相对路径/绝对路径 --> <iframe src="../../../static/zsw.html"></ifra ...
- C#获取Windows10屏幕的缩放比例
现在1920x1080以上分辨率的高分屏电脑渐渐普及了.我们会在Windows的显示设置里看到缩放比例的设置.在Windows桌面客户端的开发中,有时会想要精确计算窗口的面积或位置.然而在默认情况下, ...
- [源码解析] PyTorch 分布式(15) --- 使用分布式 RPC 框架实现参数服务器
[源码解析] PyTorch 分布式(15) --- 使用分布式 RPC 框架实现参数服务器 目录 [源码解析] PyTorch 分布式(15) --- 使用分布式 RPC 框架实现参数服务器 0x0 ...
- vue3官网介绍,安装,创建一个vue实例
前言:这一章主要是vue的介绍.安装.以及如何创建一个vue实例. 一.vue介绍 vue3中文官网:建议先自己看官网. https://v3.cn.vuejs.org/ vue是渐进式框架,渐进式指 ...
- LET函数(Excel函数集团)
LET函数,是个Office365新增函数,所以,还在用上古版本的童鞋请无视此篇哈~ 话说Excel中,有个自定义名称的功能,如下图,左右两个表分别自定义了"data1"和&quo ...
- CF1177A Digits Sequence (Easy Edition) 题解
Content 一个序列由从 \(1\) 开始的数字不断在末端拼接,就像这样:\(12345678910111213141516...\).现在,给定一个数字 \(k\),请输出这个序列的第 \(k\ ...
- 【LeetCode】1418. 点菜展示表 Display Table of Food Orders in a Restaurant
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计边的次数 日期 题目地址:https://le ...