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 ...
随机推荐
- ASM文件系统
1.确认数据库版本 2.个人理解的存储解决方案的发展趋势 2.1图示说明 2.2图示描述 如上图我们描述了在不同时期的IT行业(数据库)出现的存储文件系统,下面我们将分别说明: ü 裸设备:所谓裸设 ...
- 允许浏览器跨域访问web服务端的解决方案
今天和同事探讨了前后端如何真正实现隔离开发的问题,如果前端单独作为服务发布,势必会涉及到无法直接调用后端的接口的问题,因为浏览器是不允许跨域提交请求的. 所谓跨域访问,就是在浏览器窗口,和某个服务端通 ...
- 求最大连续bit数
描述 功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字 输出: 无 返回: 对应的二进制数 ...
- 关于c++风格 code style
Header files should be self-contained. All header files should have #define guards to prevent multip ...
- Python强化训练笔记(四)——字典的排序
假如有学生成绩以字典顺序排列:{'Tom': 87, 'Jack': 90, 'Rose': 100.....} 想要根据学生的成绩来进行排序,可以考虑使用sorted函数.但是sorted函数用在字 ...
- Python强化训练笔记(二)——元组元素的命名
对于一个元组如: >>> s1 = ('Jim', 21, 'boy', '5788236@qq.com') 我们要得到该对象的名字,年龄,性别及邮箱的方法为s1[0],s1[1], ...
- css3学习----transform
css 2D转换
- 读过的laravel文章
Laravel 中使用 JWT(Json Web Token) 实现基于API的用户认证 http://www.tuicool.com/articles/IRJnaa api token https: ...
- c语言的输入输出函数
参考文章: http://blog.sina.com.cn/s/blog_784f40b80100psg9.html C语言输入输出函数分为两类: 1.格式化输入输出函数 2.非格式化输入输出 --- ...
- 【转】Unity中的协同程序-使用Promise进行封装(一)
原文:http://gad.qq.com/program/translateview/7170767 译者:陈敬凤(nunu) 审校:王磊(未来的未来) 每个Unity的开发者应该都对协同程序非 ...