JavaJDBC编程
Posted Java小菜鸟~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaJDBC编程相关的知识,希望对你有一定的参考价值。
JAVA的JDBC编程
JDBC
,即Java Database Connectivity
,java数据库连接。是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个API由java.sql.,javax.sql. 包中的一些类和接口组成,为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
数据库编程的必备条件
- 编程语言,如Java,C、C++、Python等;
- 数据库驱动包:不同的数据库,对应不同的编程语言;
- 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:mysql提供了Java的驱动包
mysql-connector-java
,需要基于Java操作MySQL就需要该驱动包。同样的,要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。
数据库驱动包
下载驱动包地址:点进去之后,输入MySQL;
本文下载的是 5.1.49
下载如下:
接下来就是**配置IDEA
:
点ok**就配置成功了~
JDBC使用步骤
- 创建数据库连接对象:
Connection
//建立数据库连接:Connection
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/java43?user=root&password=wx710500&useUnicode" +
"=true&characterEncoding=UTF-8&useSSL=false");
注意URL格式:
MySQL
数据连接的URL
参数格式如下:
jdbc:mysql://服务器地址:端口号/要连接的数据库名?参数名=参数值
- 创建操作命令对象:
Statement
//通过连接对象conn创建操作命令对象Statement,该对象用来操作sql的一个抽象对象
Statement s=conn.createStatement();
- 使用操作命令对象来执行SQL
//查询操作:
// (1) 调用Statement操作命令对象的executeQuery(sql)
// (2) 返回一个ResultSet结果集对象(查询SQL执行的结果集)
ResultSet r=s.executeQuery("select id,name,role,salary from emp where id=3");
注意:
更新操作
(插入,修改,删除):调用executeUpdate
方法;返回结果集采用int
接收,表示成功执行了几条数据。
- 处理结果集对象:
ResultSet
//处理结果集:结果集可能是多行数据,遍历来实现
//调用next()
while(r.next())
int id=r.getInt("id");
String name=r.getString("name");
String role=r.getString("role");
Double salary=r.getDouble("salary");
//此处是打印处理
System.out.printf("id=%s,name=%s,role=%s,salary=%s\\n",id,name,role,salary);
- 释放资源
(1)无论什么情况都要释放资源;
(2)释放顺序:与创建顺序相反,此处释放顺序为(a.结果集对象;b.命令对象;c.连接对象)
完整代码:
package com.xntu.jdbc;
import java.sql.*;
public class Test
public static void main(String[] args) throws SQLException, ClassNotFoundException
Connection conn =null;
Statement s =null;
ResultSet r =null;
try
Class.forName("com.mysql.jdbc.Driver");
//建立数据库连接:Connection
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java43?user=root&password=wx710500&useUnicode" +
"=true&characterEncoding=UTF-8&useSSL=false");
//通过连接对象conn创建操作命令对象Statement,该对象用来操作sql的一个抽象对象
s = conn.createStatement();
//查询操作:
// (1) 调用Statement操作命令对象的executeQuery(sql)
// (2) 返回一个ResultSet结果集对象(查询SQL执行的结果集)
r = s.executeQuery("select id,name,role,salary from emp where id=3");
//处理结果集:结果集可能是多行数据,遍历来实现
//调用next()
while (r.next())
int id = r.getInt("id");
String name = r.getString("name");
String role = r.getString("role");
Double salary = r.getDouble("salary");
System.out.printf("id=%s,name=%s,role=%s,salary=%s\\n", id, name, role, salary);
finally
//释放资源
//出现异常时,对象可能没有被赋值,调用close就会出现空指针异常
if (r != null)
r.close();
if (s != null)
s.close();
if (conn != null)
conn.close();
运行结果:
与数据库查询结果相一致
JDBC优化部分代码
优化1: 获取
Connection
对象通常有两种方式:
- DriverManager 静态方法获取;
缺点:
无法重复利用,每次使用完以后释放资源时,通过
connection.close()
都是关闭物理连接。
- DataSource 数据源获取,也称作数据库连接池获取;
代码如下:
//先创建数据库连接池,再通过连接池获取数据库连接对象
DataSource ds = new MysqlDataSource();
//创建数据库连接池:初始化时,就会创建一定数量的数据库连接,这些连接对象是可以重复使用,效率更高
//整个url带参数可以只使用setURL方法,也可以将参数调用方法的方式来设置
((MysqlDataSource) ds).setURL("jdbc:mysql://localhost:3306/java43");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("wx710500");
((MysqlDataSource) ds).setUseUnicode(true);
((MysqlDataSource) ds).setCharacterEncoding("UTF-8");
((MysqlDataSource) ds).setUseSSL(false);
conn = ds.getConnection();
该种方式性能高,可以重复使用,往往实际应用中多使用
;
优化2:Statement对象
Statement
对象主要是将SQL
语句发送到数据库中。JDBC API
中主要提供了三种Statement
对象:
- Statement 对象:用于执行不带参数的简单
SQL
语句; - PreparedStatement 对象:用于执行带或不带参数的
SQL
语句;SQL
语句会预编译在数据库里面;执行速度快于Statement
对象。 - CallableStatement 对象:用于执行数据库存储过程的调用;
优化部分整体代码:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.*;
public class test
public static void main(String[] args) throws ClassNotFoundException, SQLException
Connection conn = null;
PreparedStatement ps = null;
ResultSet r = null;
try
//创建数据库连接池,通过连接池获取数据库连接对象
DataSource ds = new MysqlDataSource();
//设置URL
((MysqlDataSource) ds).setURL("jdbc:mysql://localhost:3306/java43");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("wx710500");
((MysqlDataSource) ds).setUseUnicode(true);
((MysqlDataSource) ds).setCharacterEncoding("UTF-8");
((MysqlDataSource) ds).setUseSSL(false);
//通过连接池对象获取连接对象
conn = ds.getConnection();
//使用操作命令对象PreparedStatement
String queryName = "skdjsj' or '1'='1";
int queryId = 3;
//准备一个带?占位符的sql
String sql = "select id,name,role,salary from emp where name=? or id=?";
//创建预编译的操作命令对象
ps = conn.prepareStatement(sql);
//替换占位符:调用setXXX方法,第一个参数,表示第几个占位符(从1开始),第二个参数,表示要替换的值
//替换的值是什么类型,就调用setXXX方法
ps.setString(1, queryName);
ps.setInt(2, queryId);
//执行sql,需要使用无参的方法
r = ps.executeQuery(); //查询操作
//处理结果集:结果集可能是多行数据,需要遍历来获取
// 调用next就移动到下一行,返回true代表该行有数据,返回false代表该行没有数据
while (r.next())
int id = r.getInt("id");
String name = r.getString("name");
String role = r.getString("role");
Double salary = r.getDouble("salary");
System.out.printf("id=%s, name=%s, role=%s, salary=%s\\n",
id, name, role, salary);
finally //无论如何,都要释放资源
//释放资源:
//出现异常的时候,对象可能还没有赋值(初始化),调用close就会出现空指针异常
if(r != null)
r.close();
if(ps != null)
ps.close();
if(conn != null)
conn.close();
结果如下:
以上是关于JavaJDBC编程的主要内容,如果未能解决你的问题,请参考以下文章