创建一个JDBC程序包含7个步骤:

1:加载JDBC驱动程序—->2:提供JDBC连接的URL—->3:创建数据库的连接—->4:创建一个Statement—->5:执行SQL语句—->6:处理结果—->7:关闭JDBC对象


1.加载JDBC驱动程序

在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String className)实现。

例如:

try{
//加载MySql的驱动类
Class.forName("com.mysql.jdbc.Driver") ;
}catch(ClassNotFoundException e){
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace() ;
}

成功加载后,会将Driver类的实例注册到DriverManager类中。

不同数据库厂商的驱动类名不同

Oracle10g:oracle.jdbc.driver.OracleDriver

MySQL5:com.mysql.jdbc.Driver

SQLServer2005:com.microsoft.sqlserver.jdbc.SQLServerDriver


2.提供JDBC连接的URL

  • •连接URL定义了连接数据库时的协议、子协议、数据源标识。
  • •书写形式:协议:子协议:数据源标识

    协议:在JDBC中总是以jdbc开始

    子协议:是桥连接的驱动程序或是数据库管理系统名称。

    数据源标识:标记找到数据库来源的地址与连接端口。

    例如:(MySql的连接URL)

jdbc:mysql://localhost:3306/test? ;     

不同数据库产品的连接URL不同

Oracle10g:jdbc:oracle:thin:@主机名:端口:数据库SID

jdbc:oracle:thin:@localhost:1521:ORCL

MySQL5:jdbc:mysql://主机名:端口/数据库名

jdbc:mysql://localhost:3306/test

SQLServer2005:jdbc:sqlserver://主机名:端口:DatabaseName=库名

jdbc:sqlserver://localhost:1433:DatabaseName=BookDB

数据库的用户名和密码


3.创建数据库的连接

  • •要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。

  • •使用DriverManager的getConnectin(String url , String username , String

    password )方法传入指定的欲连接的数据库的路径、数据库的用户名和 密码来获得。

    例如:

//连接MySql数据库,用户名和密码都是root
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
try{
Connection con =
DriverManager.getConnection(url , username , password ) ;
}catch(SQLException se){
System.out.println("数据库连接失败!");
se.printStackTrace() ;
}

4.创建一个Statement

•要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型:

  1. 执行静态SQL语句。通常通过Statement实例实现。

  2. 执行动态SQL语句。通常通过PreparedStatement实例实现。

  3. 执行数据库存储过程。通常通过CallableStatement实例实现。

    具体的实现方式:

Statement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
CallableStatement cstmt =
con.prepareCall("{CALL demoSp(? , ?)}") ;

5.执行SQL语句

Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate 和execute

  1. ResultSet executeQuery(String

    sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。

  2. int executeUpdate(String sqlString):用于执行INSERT、UPDATE或

    DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等

  3. execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。

    具体实现的代码:

ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
int rows = stmt.executeUpdate("INSERT INTO ...") ;
boolean flag = stmt.execute(String sql) ;

6.处理结果

两种情况:

1、执行更新返回的是本次操作影响到的记录数。

2、执行查询返回的结果是一个ResultSet对象。

• ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些

行中数据的访问。

• 使用结果集(ResultSet)对象的访问方法获取数据:

while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1) ; // 此方法比较高效
}

(列是从左到右编号的,并且从列1开始)


7.关闭JDBC对象

操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:

1、关闭记录集

2、关闭声明

3、关闭连接对象

if(rs != null){   // 关闭记录集
try{
rs.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){ // 关闭声明
try{
stmt.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){ // 关闭连接对象
try{
conn.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}

实例:JdbcUtils

我将他们封装到一个类中,并进行了测试。代码中解释很详细,我就不再进行解释了。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class JdbcUtils {
/**
* 数据库的用户名
*/
private final String USER = "root";
/**
* 数据库的密码
*/
private final String PASSWORD = "123456";
/**
* 数据库的驱动信息
*/
private final String DRIVER = "com.mysql.jdbc.Driver";
/**
* 访问数据库的地址
*/
private final String URL = "jdbc:mysql://localhost:3306/test";
/**
* 数据库的连接
*/
Connection connection;
/**
* sql语句的执行对象
*/
PreparedStatement preparedStatement;
/**
* 查询返回的结果集合
*/
ResultSet resultSet; public JdbcUtils() {
try {
Class.forName(DRIVER);
System.out.println("注册驱动成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} /**
* 连接数据库
*
* @return 数据库的连接对象
*/
public Connection getConnection() {
try {
connection = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
} /**
* 完成对数据库的表的添加删除和修改的操作
*
* @param sql
* @param params
* @return
* @throws SQLException
*/
public boolean updateByPrepareStatement(String sql, List<Object> params)
throws SQLException {
boolean flag = false;
int result = -1;// 表示当用户执行添加删除和修改的时候所影响数据库的行数
// 创建一个 PreparedStatement 对象来将参数化的 sql 语句发送到数据库。
preparedStatement = connection.prepareStatement(sql);
int index = 1;
if (params != null && !params.isEmpty()) {
for (Object object : params) {
// 使用给定对象设置指定参数的值。index从1开始
preparedStatement.setObject(index++, object);
}
}
// 在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言语句,比如
// INSERT、UPDATE 或 DELETE 语句
result = preparedStatement.executeUpdate();
flag = result > 0 ? true : false;
return flag; } /**
* 查询返回单条记录
*
* @param sql
* @param params
* @return
* @throws SQLException
*/
public Map<String, Object> findSimpleResult(String sql, List<Object> params)
throws SQLException {
Map<String, Object> map = new HashMap<String, Object>();
int index = 1;
// 创建一个 PreparedStatement 对象来将参数化的 sql 语句发送到数据库。
preparedStatement = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (Object object : params) {
// 使用给定对象设置指定参数的值。index从1开始
preparedStatement.setObject(index++, object);
}
}
// 在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。
resultSet = preparedStatement.executeQuery();
// 获取此 ResultSet 对象的列的编号、类型和属性。
ResultSetMetaData metaData = resultSet.getMetaData();
int col_len = metaData.getColumnCount();
while (resultSet.next()) {
for (int i = 0; i < col_len; i++) {
// sql数据库列的下标是从1开始的
String col_name = metaData.getColumnName(i + 1);
Object col_value = resultSet.getObject(col_name);
if (col_value == null) {
col_value = "";
}
map.put(col_name, col_value);
}
} return map;
} public List<Map<String, Object>> findMoreResult(String sql,
List<Object> params) throws SQLException {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
int index = 1;
// 创建一个 PreparedStatement 对象来将参数化的 sql 语句发送到数据库。
preparedStatement = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (Object object : params) {
// 使用给定对象设置指定参数的值。index从1开始
preparedStatement.setObject(index++, object);
}
}
// 在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。
resultSet = preparedStatement.executeQuery();
// 获取此 ResultSet 对象的列的编号、类型和属性。
ResultSetMetaData metaData = resultSet.getMetaData();
int col_len = metaData.getColumnCount();
while (resultSet.next()) {
Map<String, Object> map = new HashMap<String, Object>();
for (int i = 0; i < col_len; i++) {
// sql数据库列的下标是从1开始的
String col_name = metaData.getColumnName(i + 1);
Object col_value = resultSet.getObject(col_name);
if (col_value == null) {
col_value = "";
}
map.put(col_name, col_value);
}
list.add(map);
}
return list;
} /**
* 关闭数据库
*
* @throws SQLException
*/
public void releaseConn() throws SQLException {
if (resultSet != null) {
resultSet.close();
} if (preparedStatement != null) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
} static JdbcUtils jdbcUtils; public static void main(String[] args) throws SQLException {
jdbcUtils = new JdbcUtils();
jdbcUtils.getConnection();
// insert();
// update();
// query();
Morequery();
} private static void query() throws SQLException {
String sql = "select * from userinfo where pwd = ? ";
List<Object> params = new ArrayList<Object>();
params.add("123");
Map<String, Object> map = jdbcUtils.findSimpleResult(sql, params);
System.out.println(map);
} private static void Morequery() throws SQLException {
String sql = "select * from userinfo ";
List<Map<String, Object>> map = jdbcUtils.findMoreResult(sql, null);
System.out.println(map);
} /**
* 更新数据库内容
*
* @throws SQLException
*/
private static void update() throws SQLException {
String sql = "update userinfo set username =? where id=2";
List<Object> params = new ArrayList<Object>();
params.add("liumr");
jdbcUtils.updateByPrepareStatement(sql, params);
} /**
* 增加数据
*
* @throws SQLException
*/
private static void insert() throws SQLException {
String sql = "insert userinfo (username,pwd) values (?,?)";
List<Object> params = new ArrayList<Object>();
params.add("liugx");
params.add("456");
jdbcUtils.updateByPrepareStatement(sql, params); }

转载:

原文地址:

http://blog.csdn.net/harryweasley/article/details/45689023

感谢作者的整理!

JDBC的操作步骤和实例()的更多相关文章

  1. JDBC的操作步骤

    JDBC的操作步骤 一.什么是JDBC JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问 ...

  2. JDBC:数据库操作:事务

    事务特征:原子性,一致性,独立性,持久性. 要想操作事务,必须按照以下步骤完成. 1,取消掉自动提交(SET AUTOCOMMIT=0):每次执行数据库更新的时候实际上发出SQL命令之后就已经提交上去 ...

  3. java中JDBC连接数据库操作的基本步骤

    JDBC基本步骤 创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lan ...

  4. 学习笔记-JDBC连接数据库操作的步骤

    前言 这里我就以JDBC连接数据库操作查询的步骤作以演示,有不到之处敬请批评指正! 一.jdbc连接简要步骤 1.加载驱动器. 2.创建connection对象. 3.创建Statement对象. 4 ...

  5. JDBC连接数据库操作

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...

  6. JAVA采用JDBC连接操作数据库详解

    JDBC连接数据库概述 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供 ...

  7. jdbc 链接数据库步骤 7步

    JDBC连接数据库   •创建一个以JDBC连接数据库的程序,包含7个步骤:   1.加载JDBC驱动程序:       在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), ...

  8. jdbc连接数据库的步骤 (转)

    1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String  classN ...

  9. yii2 rbac权限控制详细操作步骤

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...

随机推荐

  1. 51 张图助你彻底掌握 HTTP!

    前言 如果说 TCP/IP 协议是互联网通信的根基,那么 HTTP 就是其中当之无愧的王者,小到日常生活中的游戏,新闻,大到双十一秒杀等都能看到它的身影,据 NetCraft 统计,目前全球至少有 1 ...

  2. ThreadLocal解决什么问题

    原创文章,转载请务必将下面这段话置于文章开头处(保留超链接).本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ ThreadLocal解决 ...

  3. HTTP ERROR400的问题解决

    今天写添加功能,在点添加提交时报了一个"HTTP ERROR 400"的错误,如图, 请求提交的代码死活跳转不到后台,郁闷中,开启debug功能,开始一步步排查, 1.先单独把跳转 ...

  4. 第二章 进程同步(二)——> 重点

    2.4  进程同步 2.4.1  进程同步的基本概念 1.  两种形式的制约关系 (1)间接相互制约关系:互斥问题(往往是互斥设备)---是同步的特例 (2)直接相互制约关系:同步问题 注: 互斥问题 ...

  5. 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)

    风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...

  6. 深入浅出Dotnet Core的项目结构变化

    有时候,越是基础的东西,越是有人不明白.   前几天Review一个项目的代码,发现非常基础的内容,也会有人理解出错. 今天,就着这个点,写一下Dotnet Core的主要类型的项目结构,以及之间的转 ...

  7. 记一次flask上传文件返回200前端却504的问题

    前言 好久没写了, 主要是太忙了, 本篇记一下今天解决的一个问题吧, 耗了我大半天的时间才解决 问题 今天在调试代码时, 发现了一个诡异的问题, 我之前写了一个接口, 作用是接收上传的文件, 因为这个 ...

  8. 安装SVN和汉化包及基本使用

    官网下载程序 和 下载汉化包. https://tortoisesvn.net/   注意SVN汉化包版本需要和SVN版本一致,否则是无效的. 一.下载 1.进入官网,点击downloads 2.点击 ...

  9. zabbix 监控tomcat

    zabbix 监控tomcat server端rpm -ivh jdk-8u20-linux-x64.rpmvi /etc/profileJAVA_HOME=/usr/java/jdk1.8.0_20 ...

  10. zabbix_server上的问题

    不要写成127.0.0.1,要不然一直包zabbix agent没有启动.