简介

  JDBC是Java规定的访问数据库的API,目前主流的数据库都支持JDBC。使用JDBC访问不同的数据库时需要安装不同的驱动。

  JDBC定义了数据库的链接,SQL语句的执行以及查询结果集的遍历等等。JDBC把这些操作定义为接口,位于包java.sql下面,如果java.sql.Connection、java.sql.Statement、java.sql.ResultSet等。

  各个数据库提供商在自己的JDBC驱动中实现了这些接口。

JDBC连接数据库的一般步骤

  1.注册驱动

  2.获取连接

  3.获取Statement

  4.执行SQL并返回结果集

  5.遍历结果集显示数据

  6.释放连接

package com.sean;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; import com.mysql.jdbc.ResultSet;
import com.mysql.jdbc.Statement; public class TestJDBC {
public static final String PC_NAME = "pc_name";
public static final String IP = "ip"; public static void main(String[] args) {
Statement stmt = null;
Connection conn = null;
ResultSet rs = null; try {
Class.forName("com.mysql.jdbc.Driver");//首先注册mysql驱动
String url = "jdbc:mysql://localhost/sean?user=root&password=root";
conn = DriverManager.getConnection(url);//连接mysql数据库 String query = "select * from pc_ip_list";
stmt = (Statement) conn.createStatement();//获取Statement
rs = (ResultSet) stmt.executeQuery(query);//执行查询语句 while (rs.next()) {//遍历结果集
System.out.print(rs.getString(PC_NAME) + " "+ rs.getString(IP) + "\n");
} }
catch (ClassNotFoundException e) {
System.out.println("驱动程序未找到,请加入mysql.jdbc的驱动包。。。");
e.printStackTrace();
}
catch (SQLException e) {
System.out.println("执行SQL语句过程中出现了错误。。。");
e.printStackTrace();
} finally {//释放连接
try {
//最后打开的最新关闭
if (rs != null) {
rs.close();
} if (stmt != null) {
stmt.close();
} if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

数据库的连接URL

  数据库                          连接URL

  MySQL             jdbc:mysql://localhost:3306/db_name

  Oracle              jdbc:oracle:thin:@localhost:1521:db_name

  DB2                 jdbc:db2://localhost:6789/db

JDBC基本操作

  增删改基本流程与上面的查询一样,只不过在执行sql语句的时候使用的是Statement的excuteUpdate方法,执行结果返回受影响的记录条数。

String insertSql = "insert into sean values ('pc1', '127.0.0.1')";
String deleteSql = "delete from sean where name = 'pc1'"; stmt.executeUpdate(insertSql);
stmt.executeUpdate(deleteSql);

使用PreparedStatement

  上面的例子中增删改查操作都是通过Statement对象实现的,使用Statement是最简单的方式。除此之外还可使用PreparedSattement,它继承了Statement,最大区别是

PreparedStatement可以使用参数,也就是(?)号。PreparedStatement可以使用不完整的SQL语句,空缺的部分使用问号(?)代替,直到执行前设置进去。从此便可以避免上面构造sql语句时所带来的种种不方便(如加各种单引号'')。

package com.sean;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; import com.mysql.jdbc.PreparedStatement; public class TestJDBC2 { public static void main(String args[]){
Connection conn = null;
PreparedStatement pstmt = null; try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/sean?user=root&password=root");
pstmt = (PreparedStatement) conn.prepareStatement("insert into sean values (?,?)");//获取PreparedStatement
pstmt.setString(1, "pstm1");//设置第一个?对应的值
pstmt.setString(2, "192.168.168.168");//设置第二个?对应的值 int count = pstmt.executeUpdate();//执行sql语句
if (count > 0){
System.out.print("excute success count = " + count);
}
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
try {
if (pstmt != null){
pstmt.close();
} if (conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} }
}

Statement与PreparedStatement的区别

  选择PreparedStatement还是Statement取决于你要怎么使用它们。对于只执行一次的SQL语句选择Statement是最好的. 相反, 
如果SQL语句被多次执行选用PreparedStatement是最好的。

  PreparedStatement: 数据库会对sql语句进行预编译,下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率(但尽量采用使用?号的方式传递参数),如果sql语句只执行一次,以后不再复用。    从安全性上来看,PreparedStatement是通过?来传递参数的,避免了拼sql而出现sql注入的问题,所以安全性较好。在开发中,推荐使用 PreparedStatement。

  PreparedStatement的第一次执行消耗是很高的。它的性能体现在后面的重复执行。

Statement批处理SQL

package com.sean;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; import com.mysql.jdbc.Statement; public class TestBatch1 {
public static void main(String[] args) {
Statement stmt = null;
Connection conn = null; try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/sean?user=root&password=root");
stmt = (Statement) conn.createStatement(); for (int i = 0; i < 5; ++i){
String insertSql = "insert into sean values ('pc', '192.168.1.1')";
System.out.println(insertSql);
stmt.addBatch(insertSql);//添加语句到batch
}
int[] result = stmt.executeBatch();//执行batch for (int i = 0; i < result.length; ++i){
System.out.println("result" + i + " = " + result[i]);//打印每一条sql语句执行的结果
}
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
finally{
try {
if (stmt != null){
stmt.close();
} if (conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

PreparedStatement批处理SQL

package com.sean;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; import com.mysql.jdbc.PreparedStatement; public class TestBatch2 { public static void main(String args[]){
Connection conn = null;
PreparedStatement pstmt = null; try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/sean?user=root&password=root");
pstmt = (PreparedStatement) conn.prepareStatement("insert into sean values (?,?)");//获取PreparedStatement for (int i = 0; i < 5; i++){
pstmt.setString(1, "batch2");//设置第一个?对应的值
pstmt.setString(2, "188.168.168.168");//设置第二个?对应的值
pstmt.addBatch();//添加到batch
} int[] result = pstmt.executeBatch();//批量执行sql语句
for (int i = 0; i < result.length; ++i){
System.out.println("result" + i + " = " + result[i]);//打印每一条sql语句执行的结果
}
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
try {
if (pstmt != null){
pstmt.close();
} if (conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} }
}

JDBC笔记的更多相关文章

  1. 【JDBC 笔记】

    JDBC 笔记 作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 对应pdf版:https://download.csdn.net/download/qq_22430159/10754554 没有积分 ...

  2. JDBC笔记总结[申明:来源于网络]

    JDBC笔记总结[申明:来源于网络] 地址:http://blog.csdn.net/Summer_YuXia/article/details/53676386?ref=myread

  3. spring jdbc 笔记3

    spring JDBC 加入对commons-dbcp  spring-jdbc  spring-tx的依赖 1.数据源的配置 获取数据源在spring中的Bean管理默认已经是单例模式 关闭数据源d ...

  4. jdbc笔记(二) 使用PreparedStatement对单表的CRUD操作

    首先声明,本文只给出代码,并不是做教程用,如有不便之处,还请各位见谅. PreparedStatement相较于Statement,概括来说,共有三个优势: 1. 代码的可读性和易维护性:Prepar ...

  5. jdbc笔记(一) 使用Statement对单表的CRUD操作

    jdbc连接mysql并执行简单的CRUD的步骤: 1.注册驱动(需要抛出/捕获异常) Class.forName("com.mysql.jdbc.Driver"); 2.建立连接 ...

  6. jdbc笔记2

    private static String driver; private static String url; private static String username; private sta ...

  7. JDBC笔记一

    连接池原理 数据库连接池:1.提前创建好多个连接对象,放到缓存中(集合),客户端用时直接从缓存中获取连接 ,用完连接后一定要还回来. 目的:提高数据库访问效率.  模拟代码: package com. ...

  8. JDBC 笔记3 通过PreparedStatement 对数据库进行增删改查 (转载)

    之前MVC时一直用它,学了框架后就没怎么用了.这里转载一位同学的博客,以后可能也会用到的. 转自:https://www.cnblogs.com/zilong882008/archive/2011/1 ...

  9. JDBC的简单笔记

    JDBC笔记: JDBC:java database connectivity SUN公司提供的一套操作数据库的标准规范. JDBC与数据库驱动的关系:接口与实现的关系. JDBC规范(掌握四个核心对 ...

随机推荐

  1. HDU 3030 - Increasing Speed Limits

    Problem Description You were driving along a highway when you got caught by the road police for spee ...

  2. 图的最短路径问题————树上奶牛(tree.cpp)

    和往常一样,继续从题目引入 树上奶牛 (tree.cpp) [题目描述] 农夫John的奶牛不是住在地上而是住在树上的QWQ. 奶牛之间需要串门,不过在串门之前他们会向John询问距离的大小.可是Jo ...

  3. LVS客户端启动脚本

    在设置LVS客户端时,如果我们使用手工设置的话会比较麻烦.现在我们直接使用脚本来启动lvs-client就OK了,下面是一个简单的脚本. VIP地址:10.0.0.230,把文件放到/etc/init ...

  4. Linux定时任务Crontab命令详解

    linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, 由于使用者自己也可以设置计划任务,所以, ...

  5. Javascript 拖拽雏形——逐行分析代码,让你轻松了解拖拽的原理

    拖拽的原理: 其实就是鼠标与左上角的距离保持不变.我们来看下图, 这红点就是鼠标. 拖拽拖拽实际上来说就是通过鼠标的位置来计算物体的位置,就是这么简单,就是这么任性. 那这个距离怎么求呢?? 鼠标的位 ...

  6. PHP开发调试环境配置

    ——基于wamp和Eclipse for PHP Developers 引言 为了搭建PHP开发调试环境,我曾经在网上查阅了无数的资料,但没有一种真正能够行的通的.因为PHP开发环境需要很多种软件相互 ...

  7. wdos相关问题解答

    wdos系统自动分区的大小说明 wdOS系统提供了可自动分区和手工分区 自动分区适用大部分新手或对分区没有特的要求的人 手工分区适用老手或熟悉分区或有特别需求的人 具体用哪个,没多大区别,关键是看应用 ...

  8. [zoj 3774]Power of Fibonacci 数论(二次剩余 拓展欧几里得 等比数列求和)

    Power of Fibonacci Time Limit: 5 Seconds      Memory Limit: 65536 KB In mathematics, Fibonacci numbe ...

  9. poj2762 Going from u to v or from v to u?

    Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13040 ...

  10. vertical-align:middle的居中细节调整

    使用vertical-align:middle可以让行级元素垂直居中,但这个居中是以文字的中线来计算的,而文字的中线在不同的字体上不同,甚至相同的字体在不同的浏览器上显示的都不同.所以直接使用vert ...