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. PHP脱mysql脚本

    <?php $SQL_Server="xxxxxx:3306"; $SQL_User="xxxx"; $SQL_Name="xxxx" ...

  2. python 字符串与数字之间的转换

    1.数字转字符串 i = 123 str = ‘%d’ %i str即为转换成的字符串 2.字符串转换成数字: import string tt='555' ts=string.atoi(tt) ts ...

  3. JDBC使用MySQL存储过程错误

    JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to determine stored procedur ...

  4. Openfire 的安装和配置

    1. 下载最新的openfire安装文件 官方下载站点:http://www.igniterealtime.org/downloads/index.jsp#openfire 下载地址: Exe:htt ...

  5. php课程---JavaScript改变HTML中的元素

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 数位dp/记忆化搜索

    一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an  ...

  7. Java初始化生命周期

    package com.init; abstract class Glyph { void draw() { System.out.println("Glyph.draw()"); ...

  8. 集合中list、ArrayList、LinkedList、Vector的区别、Collection接口的共性方法以及数据结构的总结

    List (链表|线性表) 特点: 接口,可存放重复元素,元素存取是有序的,允许在指定位置插入元素,并通过索引来访问元素 1.创建一个用指定可视行数初始化的新滚动列表.默认情况下,不允许进行多项选择. ...

  9. C/C++面试

    1. RTTL 运行时类别识别,在只有一个指向基类的指针或引用时确定一个对象的准确类型. 2.什么是拷贝构造函数 是单个形参的构造函数,实参是与该类同属一类的对象:在类定义中,如果未提供自己的拷贝构造 ...

  10. Django model '__week_day'与python datetime的weekday()

    上周出了个bug,按星期几查询数据的时候,发现查到的数据与显示的星期几并不相符,后来发现代码中按星期几查询,有的地方用的是Django QuerySet提供的'__week_day',有的地方用的是p ...