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 ...
随机推荐
- c#语句 习题
1.输入月份,日期,打印出是今年的第几天.(今年是平年) 2. 一个游戏,前20关是每一关自身的分数,21-30关每一关是10分,31-40关每一关是20分,41-49关每一关是30分,50关是100 ...
- powerdesigner的基本使用转载
http://www.blogjava.net/wangdetian168/archive/2011/04/07/347847.html
- 汇编基础知识之二debug的使用
DEBUG的使用 (要在win32位习题下进行,win7 64位需要安装DosBox和debug这2个软件): 1:win64位下debug的使用教程: 下载debug.exe,这里我把debug放在 ...
- CentOS 安装
选择选择启动介质 Install or upgrade an existing system: 安装或升级现有的系统 install system with basic video driver: 安 ...
- 日历js插件
因为做了一个培训管理模块,要有一个开始与结束培训时间.时间日期如果个用户手动输入的话,即使你要求了时间格式,但是用户可能还是会输错时间格式.所以想想,还是找了一个js日历插件.下面来介绍下我自己用的一 ...
- css 多行溢出
<div style=" height: 38px; max-width: 180px; -webkit-box-orient: vertical; word-break: break ...
- BizTalk开发系列(九) MAP的连接方法
BizTalk中的Map编辑器可以在源架构和目标架构创建连接.有三种创建连接的方式: 1.普通的连接方式,将左边的记录拖到右边. 2.根据结构自动连接,点击MAP的网格,在属性中选择结构(Struct ...
- DevExpress GridView加入DevExpress中的右键菜单PopuMenu
1. 添加一个Barmanager控件 2. 加入popumenu控件,点击该控件右上角的黑色三角号,编辑选项,点击编辑的选项,选择事件,编辑事件. 3. 在使用该右键菜单的控件添加MouseUp事件 ...
- Objective-C objc_class 介绍
目录(?)[-] Objective-C objc_class 介绍 NSObject objc_class isa super_class name version info instanc ...
- keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群
keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...