博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDBC
阅读量:5038 次
发布时间:2019-06-12

本文共 3953 字,大约阅读时间需要 13 分钟。

什么是JDBC

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

JDBC使程序员能用Java语言连接各种各样不同的数据库,并且使用结构化查询语言来进而增删改查。下图是JDBC到数据库的通信路径:

JDBC有四种形式的驱动,一种是将JDBC转化为ODBC,然后通过它来和数据库交流。第二种驱动部分用Java编写,部分用本地代码编写,并依赖数据库的客户端api来进行交流。第三种驱动是一个纯java库,它使用与具体数据库无关的协议向服务器组件发起请求,然后由服务器再转变成和数据库相关的协议。第四种就是纯java库,并且直接和与数据库相关的协议打交道。

数据库的连接

  1. 首先需要的是一个驱动,即一个jar文件,然后放到classpath里面。
  2. 然后需要将JDBC的驱动文件进行注册,驱动的注册有两种方式:
  • Class.forName("com.mysql.jdbc.Driver");
  • java -Djdbc.drivers=org.postgresql.Driver或者在程序里设置系统属性:System.setProperty("jdbc.drivers","org.postgresql.Driver")
接着就是设置url:协议:子协议:数据源标识
  • 协议:在JDBC中总是以jdbc开始
  • 子协议:是桥连接的驱动程序或是数据库管理系统名称。
  • 数据源标识:标记找到数据库来源的地址与连接端口。

   如 jdbc:mysql://localhost:3306/testuseUnicode=true&characterEncoding=gbk ; 

连接时使用DriverManager.getConnection方法

  Connection conn=DriverManager.getConnection(url,username,password)

SQL语句的执行

执行SQL语句前需要一个Statement对象。

  • 如果执行静态SQL语句,使用Statement对象:Statement stmt=conn.createStatement
  • 如果执行动态SQL语句,使用PreparedStatement对象:PreparedStatement pstmt=conn.prepareStatement(sql)
  • 如果执行存储过程,使用CallableStatement对象:CallableStatement cstmt=conn.prepareCall()

如果执行的是查询,使用 ResultSet executeQuery(String sqlString)

如果执行的是INSERT,UPDATE,DELETE或DDL语句,使用 int executeUpdate(String sqlString)
如果需要返回多个结果集或更新计数,使用 execute(sqlString)

如果是查询,结果集ResultSet包含了所有符合条件的行,可以使用ResultSet的 Xxx getXxx(int columnNumber)或者Xxx getXxx(String columnLabel)来得到具体的值。迭代时使用ResultSet的next()方法。

PreparedStatement可以设置参数:

PreparedStatement stat = conn.prepareStatement("INSERT INTO Cover VALUES (?, ?)");
stat.set(1, isbn);
stat.set(2, coverBlob);

 

完整的例子(来源CoreJava):

import java.io.*;import java.util.*;import java.sql.*;/*** Executes all SQL statements in a file. Call this program as 
* java -classpath driverPath:. ExecSQL commandFile* @version 1.30 2004-08-05* @author Cay Horstmann*/class ExecSQL{public static void main(String args[]){try{Scanner in;if (args.length == 0) in = new Scanner(System.in);else in = new Scanner(new File(args[0]));Connection conn = getConnection();try{Statement stat = conn.createStatement();while (true){if (args.length == 0) System.out.println("Enter command or EXIT to exit:");if (!in.hasNextLine()) return;String line = in.nextLine();if (line.equalsIgnoreCase("EXIT")) return;if (line.trim().endsWith(";")) // remove trailing semicolon{line = line.trim();line = line.substring(0, line.length() - 1);}try{boolean hasResultSet = stat.execute(line);if (hasResultSet) showResultSet(stat);}catch (SQLException ex){ for (Throwable e : ex)e.printStackTrace();}}}finally{conn.close();}}catch (SQLException e){for (Throwable t : e)t.printStackTrace();}catch (IOException e){e.printStackTrace();}}/*** Gets a connection from the properties specified in the file database.properties* @return the database connection*/public static Connection getConnection() throws SQLException, IOException{Properties props = new Properties();FileInputStream in = new FileInputStream("database.properties");props.load(in);in.close();String drivers = props.getProperty("jdbc.drivers");if (drivers != null) System.setProperty("jdbc.drivers", drivers);String url = props.getProperty("jdbc.url");String username = props.getProperty("jdbc.username");String password = props.getProperty("jdbc.password");return DriverManager.getConnection(url, username, password);}/*** Prints a result set.* @param stat the statement whose result set should be printed*/public static void showResultSet(Statement stat) throws SQLException{ResultSet result = stat.getResultSet();ResultSetMetaData metaData = result.getMetaData();int columnCount = metaData.getColumnCount();for (int i = 1; i <= columnCount; i++){if (i > 1) System.out.print(", ");System.out.print(metaData.getColumnLabel(i));}System.out.println();while (result.next()){for (int i = 1; i <= columnCount; i++){if (i > 1) System.out.print(", ");System.out.print(result.getString(i));}System.out.println();}result.close();}}

 

转载于:https://www.cnblogs.com/cubika/archive/2012/12/08/2808533.html

你可能感兴趣的文章
机器学些技法(9)--Decision Tree
查看>>
静态页面复习--用semantic UI写一个10min首页
查看>>
在Windows下安装64位压缩包版mysql 5.7.11版本的方法
查看>>
公安项目项目感想
查看>>
IOS-组件化架构漫谈
查看>>
Android 性能测试工具- GT
查看>>
[bzoj 2005] [NOI2010]能量采集
查看>>
js闭包演示
查看>>
android实现点击背景图片不同区域实现不同事件
查看>>
玲珑OJ 1082:XJT Loves Boggle(爆搜)
查看>>
JDK、JRE、JVM三者间的联系与区别
查看>>
ssm中实现excle导入导出
查看>>
2011-07-06 11:19 Hibernate提供了3种检索策略
查看>>
CSS Hacker
查看>>
有关Botton的用法(一)
查看>>
前端jquery一些基本语法
查看>>
单表入库最快的方法
查看>>
线性的数据结构
查看>>
使用MQ消息队列的优缺点
查看>>
SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)
查看>>