JAVA基础知识之JDBC——编程步骤及执行SQL
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的更多相关文章
- JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
- Java基础教程:JDBC编程
Java基础教程:JDBC编程 1.什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC A ...
- JAVA基础知识之面向对象编程知识汇总
JAVA基础课程部分面向对象已经学习完成,知识结构如下: 总体知识框架: 类的结构: 面向对象编程三大特征: 关键字和抽象类接口等: 常见知识汇总: 成员变量和局部变量比较 有无返回值方法比较: 权限 ...
- JAVA基础知识之JDBC——ResultSet的滚动和更新(statement的额外参数)
ResultSet不仅可以内存中的一张二维表一样保存statement执行SQL的结果集,还能通过结果集修改DB的数据.ResultSetMetaData则可以用来获得ResultSet对象的相关信息 ...
- JAVA基础知识之网络编程——-网络通信模型(IO模型)
<Unix网络编程:卷1>中介绍了5中I/O模型,JAVA作为运行在宿主机上的程序,底层也遵循这5中I/O模型规则.这5中I/O模型分别是: 阻塞式IO 非阻塞式IO I/O复用 信号驱动 ...
- JAVA基础知识之JDBC——JDBC事务处理及批量更新
JDBC事务 JDBC的事务由Connection提供,默认是打开的. 要开启事务,则要关闭自动提交, conn.setAutoCommit(false); 提交事务使用 conn.commit(); ...
- JAVA基础知识之网络编程——-基于TCP通信的简单聊天室
下面将基于TCP协议用JAVA写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ...
- JAVA基础知识之JDBC——JDBC数据库连接池
JDBC数据库连接池 数据库的连接和关闭是很耗费资源的操作,前面介绍的DriverManager方式获取的数据库连接,一个Connection对象就对应了一个物理数据库连接,每次操作都要打开一个连接, ...
- JAVA基础知识之JDBC——离线RowSet
离线RowSet 如果直接使用ResultSet, 程序在得到ResultSet记录之后需要立即使用,否则一旦关闭Connection就不再可用,要解决这种情况要么将ResultSet的结果转换成Ja ...
随机推荐
- bootstrap学习笔记之三(组件的使用)
bootstrap组件需要引入bootstrap.js才行,当然要引入bootstrap.js首先得引入JQuery. 一.下拉菜单 将下拉菜单触发器和下拉菜单都包裹在 .dropdown 里,或者另 ...
- 了解C++默认编写并调用哪些函数
概念:编译器可以暗自为class创建default构造函数.copy构造函数.copy assignmengt构造函数,以及析构函数. 比如你写下:struct Node { }; 这就好像你写下这样 ...
- jquery 温故而知新 Ul 相关的操作
在UL中取得第一级的LI <div id='demo1'> <ul> <li id='1'>1<li> <li id='2'>2< ...
- PHP魔术方法使用总结
魔术方法是PHP面向对象中特有的特性.它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,利用模式方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法) ...
- 关于c++风格 code style
Header files should be self-contained. All header files should have #define guards to prevent multip ...
- html5:地理信息 LBS基于地理的服务和百度地图API的使用
地理位置请求 单次定位请求getCurrentPosition(请求成功函数,请求失败函数,数据收集方式) 多次定位请求watchPosition(请求成功函数,请求失败函数,数据收集方式) 关闭更新 ...
- A trip through the Graphics Pipeline 2011_12 Tessellation
Welcome back! This time, we’ll look into what is perhaps the “poster boy” feature introduced with th ...
- EditText中输入手机号码时,自动添加空格
输入手机号码时,自动添加空格,更容易辨别 public class PhoneWatcher implements TextWatcher { private EditText _text; publ ...
- the major advances since the birth of the computer
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION • The family concept: ...
- UIWebView如何获取内容高度
iOS UIWebView如何获取到内容的高度呢?我们经常会遇到项目中需要使用UIWebView来加载H5页面,但是页面的高度并不确定,而我们前端需要根据内容的高度呈现出来,且不允许webview滚动 ...