JDBC编程步骤

下面以mysql数据库为例,

1.加载驱动

首先需要下载数据库的驱动jar文件,并且在eclipse包中加入到class path中去, 例如mysql的驱动文件 mysql-connector-java-5.1.23-bin.jar

然后就可以在java程序中用反射加载驱动

 Class.forName("com.mysql.jdbc.Driver");

2.获取数据库连接,即Connectiond对象

使用java.sql.DriverManager的getConnection(String url, String user, String pass)方法获取数据库连接Connectiond对象

 Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dedecms","root","");

3.通过Connectiond创建statement对象,用来执行SQL

通常有三种statement对象,

  • createStatement() , 创建普通的statement对象,可以直接执行sql语句
  • prepareStatement(String sql) , 创建预编译的statement对象,支持sql语句带参数
  • prepareCall(String sql) , 创建能执行存储过程的statement对象

4.执行SQL语句,所有statement对象都有三个执行sql的方法

  • execute()可执行任何SQL语句返回boolean,表示是否返回了数据,需要通过statement对象的getResultSet()方法才能获取结果集,通过statement的getUpdateCount()方法获取影响条数
  • executeQuery()返回ResultSet
  • executeUpdate()执行SQL语句返回受影响记录数

5.操作结果集ResultSet

next(), previous(), first(), last(), beforeFirst(), afterLast(), absolute() 可以进行行移动

getXxx(...)可以在具体行上面,获取指定列的值,参数可以是数字索引或者是列名

6.回收数据库资源

关闭ResultSet, Statement, Connection

下面演示一下JDBC的常用编程步骤,

 package db;

 import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager; public class ConnMySQL {
public static void connMySQL() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
try (
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dedecms","root","");
Statement stmt = conn.createStatement();
/*
* Statement有三种执行SQL的方法
* 1.execute()可执行任何SQL语句返回boolean
* 2.executeQuery()返回ResultSet
* 3.executeUpdate()执行DML语句返回受影响记录数
*/
ResultSet rs = stmt.executeQuery("select * from dede_addoninfos")) {
//ResultSet通过next()能向前迭代,通过各种getXxx()方法获取对应字段值
while(rs.next()) {
System.out.println(rs.getInt(1)+"\t | "+rs.getInt(2) + "\t | "+rs.getInt(3) + "\t |"+rs.getString("title"));
}
}
} public static void main(String[] args) throws SQLException, ClassNotFoundException {
connMySQL();
}
}

上面程序的第14行,可以使用createStatement() 或者prepareStatement()两种方式创建statement对象,其中第二种支持带参数sql的预编译

在第21行,则可以使用execute(), executeQuery(), executeUpdate()三种方式执行SQL,只不过第一种返回boolean,第二种返回结果集,第三种返回记录数

在第24行,既可以用rs.getString(7)这种方式取值,也可以用rs.getString("title")这种方式取值

上面执行结果如下,

 99     | 9     | -8     |武汉地区招聘dedecms网页美工
100 | 9 | -8 |吉林地区 礼聘 PHP程序员 网页设计师 系统运维工程师 薪酬面议
101 | 9 | -8 |4000每月 招聘dede二次开发程序一名
102 | 9 | -8 |尊米网诚聘全职PHP程序员(广州)
103 | 9 | -8 |《每日商报》招聘PHP程序员、网页设计师
104 | 9 | -8 |招聘PHP程序员3名底薪3000起 +奖金 (包吃住)
105 | 9 | -8 |佰邦达科技(北京)有限公司招聘PHP开发工程师

下面演示两种Statement对比以及两种执行SQL的用法,

mysql的jdbc配置如下,

 driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/dedecms?useUnicode=true&characterEncoding=utf8
user=root
pass=
 package db;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
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.sql.Statement;
import java.util.Properties; public class ExecuteSQL {
private String driver;
private String url;
private String user;
private String pass;
public void initParam(String paramFile) throws FileNotFoundException, IOException, ClassNotFoundException {
//用Properties类加载属性文件
Properties prop = new Properties();
prop.load(new FileInputStream(paramFile));
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
pass = prop.getProperty("pass");
Class.forName(driver);
}
public void createTable(String sql) throws SQLException, ClassNotFoundException {
try (
Connection conn = DriverManager.getConnection(url, user, pass);
Statement stmt = conn.createStatement()) {
//执行DDL语句,创建数据表
stmt.executeUpdate(sql);
} }
public int insertData(String sql) throws SQLException, ClassNotFoundException {
try (
Connection conn = DriverManager.getConnection(url, user, pass);
Statement stmt = conn.createStatement()) {
//执行DML语句,插入数据
return stmt.executeUpdate(sql);
}
} public void executeSQL(String sql) throws ClassNotFoundException, SQLException {
try (
Connection conn = DriverManager.getConnection(url, user, pass);
Statement stmt = conn.createStatement()) {
//execute()返回boolean,true表示有ResultSet, falseb表示没有
boolean hasResultSet = stmt.execute(sql);
if (hasResultSet) {
try (
// 获取结果集
ResultSet rs = stmt.getResultSet()) {
//ResultSetMetaData是用于分析结果集的接口
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while(rs.next()) {
for(int i = 0; i < columnCount; i++) {
System.out.print(rs.getString(i + 1) + "\t");
}
System.out.print("\n");
}
}
} else {
System.out.println("该SQL执行结果影响的记录条数有 "+ stmt.getUpdateCount() + " 条");
}
}
} public void insertUseStatement() throws SQLException, ClassNotFoundException {
long start = System.currentTimeMillis();
try (
Connection conn = DriverManager.getConnection(url, user, pass);
Statement stmt = conn.createStatement()) {
for (int i = 0 ; i < 10 ; i++) {
stmt.executeUpdate("insert into jdbc_test values("
+ " null ,'title"+i+"','content"+i+"')");
}
System.out.println("使用Statement费时:"+(System.currentTimeMillis()-start));
}
} public void insertUsePrepare() throws ClassNotFoundException, SQLException {
long start = System.currentTimeMillis();
try (
Connection conn = DriverManager.getConnection(url, user, pass);
PreparedStatement pstmt = conn.prepareStatement("insert into jdbc_test values(null,?,?)")) { for (int i = 0 ; i < 10 ; i++) {
//序号1,2表示sql中第几个参数
pstmt.setString(1, "title"+i);
pstmt.setString(2, "content"+i);
pstmt.executeUpdate();
} System.out.println("使用PreparedStatement费时:"+(System.currentTimeMillis()-start));
}
} public static void main(String[] args) throws ClassNotFoundException, SQLException, FileNotFoundException, IOException {
ExecuteSQL es = new ExecuteSQL();
es.initParam("mysql.ini");
/*
es.createTable("create table jdbc_test "
+ "(jdbc_id int auto_increment primary key, "
+ "jdbc_name varchar(255), "
+ "jdbc_desc text) CHARSET=utf8;");
System.out.println("=================建表成功=================");
*/ /*
int result = es.insertData("insert into jdbc_test (jdbc_name, jdbc_desc) "
+ " select title, body from dede_addoninfos;");
System.out.println("====共有 "+result+" 条记录受影响===");
*/ //es.executeSQL("select * from jdbc_test");
es.insertUseStatement();
es.insertUsePrepare();
}
}

上面程序的insertUseStatement()和insertUsePrepare()分别用了普通的statement和preparestatement,

preparestatement可以支持参数形式,因此不需要拼接参数,省去了麻烦而且更安全(SQL注入)

多次执行程序会发现preparestatement的性能要高很多。

JAVA基础知识之JDBC——编程步骤及执行SQL的更多相关文章

  1. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  2. Java基础教程:JDBC编程

    Java基础教程:JDBC编程 1.什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC A ...

  3. JAVA基础知识之面向对象编程知识汇总

    JAVA基础课程部分面向对象已经学习完成,知识结构如下: 总体知识框架: 类的结构: 面向对象编程三大特征: 关键字和抽象类接口等: 常见知识汇总: 成员变量和局部变量比较 有无返回值方法比较: 权限 ...

  4. JAVA基础知识之JDBC——ResultSet的滚动和更新(statement的额外参数)

    ResultSet不仅可以内存中的一张二维表一样保存statement执行SQL的结果集,还能通过结果集修改DB的数据.ResultSetMetaData则可以用来获得ResultSet对象的相关信息 ...

  5. JAVA基础知识之网络编程——-网络通信模型(IO模型)

    <Unix网络编程:卷1>中介绍了5中I/O模型,JAVA作为运行在宿主机上的程序,底层也遵循这5中I/O模型规则.这5中I/O模型分别是: 阻塞式IO 非阻塞式IO I/O复用 信号驱动 ...

  6. JAVA基础知识之JDBC——JDBC事务处理及批量更新

    JDBC事务 JDBC的事务由Connection提供,默认是打开的. 要开启事务,则要关闭自动提交, conn.setAutoCommit(false); 提交事务使用 conn.commit(); ...

  7. JAVA基础知识之网络编程——-基于TCP通信的简单聊天室

    下面将基于TCP协议用JAVA写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ...

  8. JAVA基础知识之JDBC——JDBC数据库连接池

    JDBC数据库连接池 数据库的连接和关闭是很耗费资源的操作,前面介绍的DriverManager方式获取的数据库连接,一个Connection对象就对应了一个物理数据库连接,每次操作都要打开一个连接, ...

  9. JAVA基础知识之JDBC——离线RowSet

    离线RowSet 如果直接使用ResultSet, 程序在得到ResultSet记录之后需要立即使用,否则一旦关闭Connection就不再可用,要解决这种情况要么将ResultSet的结果转换成Ja ...

随机推荐

  1. 获取到body的offsetTop和offsetLeft值

    function offsetTL(obj){//获取到body的offsetTop和offsetLeft var t=0,l=0; while(obj){ t=t+obj.offsetTop; l= ...

  2. C# MD5加密的方法+一般处理程序使用Session+后台Json序列化

    1.MD5加密 string md5Str = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s ...

  3. Oracle加密表空间进行数据加密的示例

    接上篇:http://www.cnblogs.com/myrunning/p/4292049.html 1查看数据库版本 2查看当前数据库表空间 从这里看到我们此时数据库里没有加密表空间. 3创建加密 ...

  4. ss命令

    看到好的博文,所以记录一下.本文出自转载. ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它 ...

  5. 将gridFS中的图片文件写入硬盘

    开启用户验证下的gridfs 连接使用,在执行脚本前可以在python shell中 from pymongo import Connectionfrom gridfs import *con = C ...

  6. 【转】Gvim开发环境配置笔记--Windows篇

    配置文件(vimrc) set nocompatible set nu! set cursorline colorscheme murphy " vim 自身命令行模式智能补全 set wi ...

  7. IOS第18天(7,CAKeyframeAnimation-图标抖动)

    *** #import "HMViewController.h" #define angle2radian(x) ((x) / 180.0 * M_PI) @interface H ...

  8. dom4j解析xml文档(增删改查)

    package itcast.dom4j; import java.io.File; import java.io.FileOutputStream; import java.io.FileWrite ...

  9. 【iCore3 双核心板】例程二十一:LAN_TCPS实验——以太网数据传输

    实验指导书及代码包下载: http://pan.baidu.com/s/1ntTjWpV iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  10. ExtJS笔记 Store

    The Store class encapsulates a client side cache of Model objects. Stores load data via a Proxy, and ...