JDBC是连接数据库和Java程序的桥梁,通过JDBC API可以方便地实现对各种主流数据库的操作。本篇将介绍一下如何使用JDBC操作数据库(以MySQL为例)。

一、JDBC

  JDBC制定了统一访问各类关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现。

  JDBC规范将驱动程序归结为以下几类(选自Core Java Volume Ⅱ——Advanced Features):

  • 第一类驱动程序将JDBC翻译成ODBC,然后使用一个ODBC驱动程序与数据库进行通信。
  • 第二类驱动程序是由部分Java程序和部分本地代码组成的,用于与数据库的客户端API进行通信。
  • 第三类驱动程序是纯Java客户端类库,它使用一种与具体数据库无关的协议将数据库请求发送给服务器构件,然后该构件再将数据库请求翻译成数据库相关的协议。
  • 第四类驱动程序是纯Java类库,它将JDBC请求直接翻译成数据库相关的协议。

二、通过JDBC操作数据库

  我们需要访问数据库时,首先要加载数据库驱动,只需加载一次,然后在每次访问数据库时创建一个Connection实例,获取数据库连接,获取连接后,执行需要的SQL语句,最后完成数据库操作时释放与数据库间的连接。

  1. 加载数据库驱动

  Java加载数据库驱动的方法是调用Class类的静态方法forName(),语法格式如下:

Class.forName(String driverManager)

  例如加载MySQL数据库驱动如下:

try {
Class.forName("com.mysql.jdbc.Driver");
} catch(ClassNotFoundException e) {
e.printStackTrace();
}

  如果加载成功,会将加载的驱动类注册给DriverManager;如果加载失败,会抛出ClassNotFoundException异常。

  需要注意的是,要在项目中导入mysq-connection-java的jar包,方法是在项目中建立lib目录,在其下放入jar包。

  

  右键jar包 Build Path->Add to Build Path。

  

  之后会多出一个Referenced Libraries,导入成功。

  2. 建立连接

  加载完数据库驱动后,就可以建立数据库的连接了,需要使用DriverManager类的静态方法getConnection()方法来实现。如下:

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/database_name";
String user = "root";
Strign password = "root"
//建立连接
Connection conn = DriverManager.getConnection(url, user, password);

  url是数据库的url,其中mysql指定数据库为mysql数据库,localhost是本地计算机,可以换成IP地址127.0.0.1,3306为MySQL数据库的默认端口号,database_name是所要连接的数据库名;user和password对应数据库的用户名和密码;最后再通过getConnection建立连接。

  3. 对数据库表中数据进行增删改查

  建立了连接之后,就可以使用Connection接口的createStatement()方法来获取Statement对象,也可以调用prepareStatement()方法获得PrepareStatement对象,通过executeUpdate()方法来执行SQL语句。

  先看一个查询的。

 import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException; public class JDBCTest { public static void main(String[] args) throws ClassNotFoundException, SQLException {
//连接数据库
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/mybatis_test";
String user = "root";
String password = "123456"; //建立数据库连接
Connection conn = DriverManager.getConnection(url, user, password); String sql = "select * from user";
Statement stmt = conn.createStatement(); //创建一个statement对象
ResultSet rs = stmt.executeQuery(sql); //执行查询 int id, sex;
String username, address;
System.out.println("id\t姓名\t性别\t地址\t"); while(rs.next()) { //遍历结果集
id = rs.getInt("id");
username = rs.getString("username");
sex = rs.getInt("sex");
address = rs.getString("address");
System.out.println(id + "\t" + username + "\t" + sex + "\t" + address);
}
} }

  运行结果如下:

  

  一般在数据库中我们将性别写为数字,然后用Java语言进行转换,比如上述运行结果,1代表男性、2代表女性、0代表未知,我们修改sex = rs.getInt("sex");这行代码如下:

sex = rs.getInt("sex");
if(sex == 1) {
_sex = "男";
} else if(sex == 2) {
_sex = "女";
} else {
_sex = "未知";
}

  首先在while循环的外面加上String _sex,在输出中将sex改为_sex即可,运行结果如下:

  

  对于插入,我们可以使用Statement接口中的executeUpdate()方法,如下:

String sql = "insert into user(username, sex, address) values('张三','1','陕西西安')";
Statement stmt = conn.createStatement(); //创建一个Statement对象
stms.executeUpdate(sql); //执行SQL语句
conn.close(); //关闭数据库连接对象

  还可以使用PreparedStatement接口中的executeUpdate()方法,如下:

String sql = "insert into user(username, sex, address) values(?,?,?)";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, "张三"); //为第一个问号赋值
ps.setInt(2, 2); //为第二个问号赋值
ps.setString(3, "陕西西安"); //为第三个问号赋值
ps.executeUpdate();
conn.close();

  修改同插入,也有上述两种方法,只需更改sql语句即可。

  删除也是一个很常用的操作,使用executeUpdate()方法执行用来做删除的SQL语句,方法同上方Statement接口的操作。

三、完整实例

  下面给一个完整的例子,该例子的数据库配置文件在外部的properties中,该例子以SQL Server为例,其它的数据库都是同样的道理。

  1. jdbc.properties

  用于编写数据库配置文件,不直接写在程序中的好处是提高了灵活性,如果需要修改数据库名称或配置等信息,可以在这里修改,无需改动程序。

 driver = com.microsoft.sqlserver.jdbc.SQLServerDriver
url = jdbc:sqlserver://127.0.0.1:1433;DatabaseName=TTMS
username = root
password = root

  2. DBUtils.java

  编写JDBC代码。

 import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; public class DBUtil {
private final String dbConnFile = "resource/database/jdbc.properties";
private Connection conn=null;
private String dbDriver; //定义驱动
private String dbURL; //定义URL
private String userName; //定义用户名
private String password; //定义密码 //从配置文件取数据库链接参数
private void loadConnProperties(){
Properties props = new Properties();
try {
props.load(new FileInputStream(dbConnFile));//根据配置文件路径Conf加载配置文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
this.dbDriver = props.getProperty("driver");//从配置文件中取得相应的参数并设置类变量
this.dbURL = props.getProperty("url");
this.userName = props.getProperty("username");
this.password = props.getProperty("password"); } public boolean openConnection(){
try {
loadConnProperties();
Class.forName(dbDriver);
this.conn = DriverManager.getConnection(dbURL,userName,password);
return true;
} catch(ClassNotFoundException classnotfoundexception) {
classnotfoundexception.printStackTrace();
System.err.println("db: " + classnotfoundexception.getMessage());
} catch(SQLException sqlexception) {
System.err.println("db.getconn(): " + sqlexception.getMessage());
}
return false;
} protected void finalize() throws Exception{
try {
if(null!=conn)
conn.close();
}catch (SQLException e) {
e.printStackTrace();
} } // 查询并得到结果集
public ResultSet execQuery(String sql) throws Exception {
ResultSet rstSet = null;
try {
if (null == conn)
throw new Exception("Database not connected!");
Statement stmt = conn.createStatement();
rstSet = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rstSet;
} // 插入一条新纪录,并获取标识列的值
public ResultSet getInsertObjectIDs(String insertSql) throws Exception{
ResultSet rst = null;
try {
if(null==conn)
throw new Exception("Database not connected!"); Statement stmt = conn.createStatement(); stmt.executeUpdate(insertSql, Statement.RETURN_GENERATED_KEYS);
rst = stmt.getGeneratedKeys(); } catch (SQLException e) {
e.printStackTrace();
}
return rst;
} //以参数SQL模式插入新纪录,并获取标识列的值
public ResultSet getInsertObjectIDs(String insertSql, Object[] params) throws Exception {
ResultSet rst = null;
PreparedStatement pstmt = null ;
try {
if (null == conn)
throw new Exception("Database not connected!");
pstmt = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS); if(null != params){
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
}
pstmt.executeUpdate();
rst = pstmt.getGeneratedKeys();
} catch (SQLException e) {
e.printStackTrace();
}
return rst;
} // 插入、更新、删除
public int execCommand(String sql) throws Exception{
int flag = 0;
try {
if(null==conn)
throw new Exception("Database not connected!"); Statement stmt = conn.createStatement();
flag = stmt.executeUpdate(sql); stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
} /* // 存储过程调用
public void callStordProc(String sql, Object[] inParams, SqlParameter[] outParams) throws Exception {
CallableStatement cst = null ;
try {
if (null == conn)
throw new Exception("Database not connected!");
cst = conn.prepareCall(sql); if(null != inParams){
for (int i = 0; i < inParams.length; i++) {
cst.setObject(i + 1, inParams[i]);
}
} if (null!=outParams){
for (int i = 0; i < inParams.length; i++) {
cst.registerOutParameter(outParams[i].getName(), outParams[i].getType());
}
}
cst.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
*/
// 释放资源
public void close(ResultSet rst) throws Exception {
try {
Statement stmt = rst.getStatement();
rst.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
} public PreparedStatement execPrepared(String psql) throws Exception {
PreparedStatement pstmt = null ;
try {
if (null == conn)
throw new Exception("Database not connected!");
pstmt = conn.prepareStatement(psql);
} catch (SQLException e) {
e.printStackTrace();
}
return pstmt;
} // 释放资源
public void close(Statement stmt) throws Exception {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
} // 释放资源
public void close() throws SQLException, Exception{
if(null!=conn){
conn.close();
conn=null;
}
} public Connection getConn() {
return conn;
} public static void main(String[] args) { }
}

  3. DBUtil_TestDriver.java

  测试程序。

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.ResultSet; import java.sql.Blob; public class DBUtil_TestDriver { //测试一般数据写入
private static void test_insert(){
DBUtil db = new DBUtil();
db.openConnection();
String sql = "insert into studio(studio_name, studio_row_count, studio_col_count, studio_introduction )"
+ " values(?,?, ?, ?)";
Object [] params = new Object[4];
params[0]=new String("test2");
params[1]=new Integer(2);
params[2]=new Integer(2);
params[3]=new String("just a test");
try {
ResultSet rst= db.getInsertObjectIDs(sql, params); if (rst!=null && rst.first()) {
System.out.println(rst.getInt(1));
} db.close(rst);
db.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } //测试lob数据写入
private static void test_insert_lob(){ String sql = "insert into play(play_type_id, play_lang_id, play_name, play_ticket_price, play_image )"
+ " values(?,?, ?, ?, ?)";
Object [] params = new Object[5];
params[0]=null;
params[1]=null;
params[2]=new String("just a test");
params[3]=new Float(5); FileInputStream fis = null;
File file = new File("resource/image/header.jpg"); //测试写图片 try {
DBUtil db = new DBUtil();
db.openConnection();
fis = new FileInputStream(file);
params[4]=fis; ResultSet rst= db.getInsertObjectIDs(sql, params); if (rst!=null && rst.first()) {
System.out.println(rst.getInt(1));
} db.close(rst);
db.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } //测试lob数据读取
private static void test_read_lob(){
String sql = "select * from play"; FileInputStream fis = null; try {
DBUtil db = new DBUtil();
db.openConnection();
ResultSet rst = db.execQuery(sql);
if (rst!=null) {
while(rst.next()){
System.out.println(rst.getString("play_name"));
System.out.println(rst.getFloat("play_ticket_price"));
int playID=rst.getInt("play_id"); byte[] buf = new byte[256];
Blob blob = rst.getBlob("play_image");
if(blob!=null ){
//需要在在工程目录下建立路径Cache/Play_Image/,然后将照片缓存到该路径下
File file = new File("Cache/Play_Image/"+ playID + ".jpg");
FileOutputStream sout = new FileOutputStream(file);
InputStream in = blob.getBinaryStream();//获取BLOB数据的输入数据流 for (int i = in.read(buf); i != -1;) {
sout.write(buf);
i = in.read(buf);
}
in.close();
sout.close();
} }
} db.close(rst);
db.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public static void main(String[] args) {
// TODO Auto-generated method stub
//test_insert();
test_insert_lob();
test_read_lob();
} }

  至于数据库sql文件可自行设计,这里就不再编写了。

Java高级篇(三)——JDBC数据库编程的更多相关文章

  1. JAVA高级篇(三、JVM编译机制、类加载机制)

    一.类的加载过程 JVM将类的加载分为3个步骤: 1.装载(Load) 2.链接(Link) 3.初始化(Initialize) 其中 链接(Link)又分3个步骤,如下图所示: 1) 装载:查找并加 ...

  2. Java JDBC数据库编程

    课程  Java面向对象程序设计 一.实验目的 掌握数据库编程技术 二.实验环境 1.微型计算机一台 2.WINDOWS操作系统,Java SDK,Eclipse开发环境,Microsoft SQL  ...

  3. JDBC数据库编程(java实训报告)

    文章目录 一.实验要求: 二.实验环境: 三.实验内容: 1.建立数据库连接 2.查询数据 2.1 测试结果 3.添加数据 3.1.测试结果 4.删除数据 4.1.测试结果 5.修改数据 5.1 测试 ...

  4. JDBC数据库编程常用接口(转)

    JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口(API),制定了统一的访问各种关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现.这东西能够 ...

  5. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...

  6. JAVA高级编程序——JDBC(连接mysql数据库)——(一)

    java要想连接数据库,就要用JDBC(java database connection),用这个jar包 (mysql-connector-java-xxx-xx-bin.jar) sun公司为我们 ...

  7. Java ——JDBC数据库编程

    数据库分类 关系型数据库:以表来存放数据的,数据与数据之间的关系通过表之间的连接体现 面向对象的数据库:保存的是对象本身 其它 数据库:数据库管理系统中创建一个个的保存数据的单位 数据是保存在数据库的 ...

  8. java架构《并发线程高级篇三》

    本章主要介绍和讲解concurrent.util里面的常用的工具类. 一.CountDownLatch使用:(用于阻塞主线程) 应用场景 :通知线程休眠和运行的工具类,是wait和notify的升级版 ...

  9. JDBC数据库编程

    常识名词:ODBC ,JDBC,JDBC API ,JDBC Driver API  数据准备,续上节:   JDBC编程流程 最基本的JDBC操作 本段内容主要完成JDBC的增删查改操作 packa ...

随机推荐

  1. java之简单工厂模式详解

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  2. Konckout开发实例:简单的表单提交页面

    <!doctype html> <html > <head> <meta http-equiv="Content-Type" conten ...

  3. java排序算法(十):桶式排序

    java排序算法(十):桶式排序 桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征: 待排序列所有的值处于一个可枚举的范围之类: 待排序 ...

  4. Axure RP简单作品

    点击按钮,同时出现1-7 点击按钮,依次出现1-7,

  5. 走进webpack(3)-- 小结

    写这一系列的文章,本意是想要梳理一下自己凌乱的webpack知识,只是使用过vue-cli,修改过其中的一部分代码,但是对于一个简单项目从0开始搭建webpack的流程和其中的依赖并不是十分清楚.所以 ...

  6. 多目标跟踪(MOT)论文随笔-POI: Multiple Object Tracking with High Performance Detection and Appearance Feature

    网上已有很多关于MOT的文章,此系列仅为个人阅读随笔,便于初学者的共同成长.若希望详细了解,建议阅读原文. 本文是tracking by detection 方法进行多目标跟踪的文章,最大的特点是使用 ...

  7. pyc反编译-uncompyle2的安装及使用

    pyc反编译-uncompyle2的安装及使用 0x00 安装 1.下载并解压到安装目录 python setup.py install //安装 2.下载链接: 链接:https://pan.bai ...

  8. JavaScript(第十四天)【面向对象和原型】

    学习要点: 1.学习条件 2.创建对象 3.原型 4.继承 ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建 ...

  9. C语言第八次作业

    一.PTA实验作业 题目1:统计一行文本的单词个数 1.本题PTA提交列表 2.设计思路 // 一个非空格和一个空格代表一个单词 char str[1000]: 存放一行文本 定义 I,j=0:用作循 ...

  10. bug终结者 团队作业第四、五周

    bug终结者 团队作业第四.五周 博客编辑者:20162322朱娅霖 本周学习任务: 团队协作完成<需求规格说明书> 工作流程 第四周 团队成员各自完成蓝墨云班课中<需求规格说明书& ...