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. ES6 中 Promise 详解

    Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Promise 提供统一的 API ...

  2. 功能测试很low?不能升级到高级测试工程师?

    功能测试很low?不能升级到高级测试工程师? 功能测试很low?功能测试很简单?功能测试就是黑盒测试?功能测试没有技术含量?功能测试工资低?只会功能测试没有竞争力?功能测试这活初中生都可以干?功能测试 ...

  3. python全栈学习--day10(函数进阶)

    一,引言 现在我有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 报错了:NameError: name 'm ...

  4. 2017-2018-1 20155201 《信息安全系统设计基础》 pwd命令的实现

    2017-2018-1 20155201 <信息安全系统设计基础> pwd命令的实现 一.对pwd命令的学习 在终端中输入man pwd查看手册中对pwd这一命令的解释: 以绝对路径的方式 ...

  5. C语言最后一次作业——总结报告

    1.当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 首先是因为自己想学跟做动画沾边的专业(动画专业因为某 ...

  6. 项目Alpha冲刺Day3

    一.会议照片 二.项目进展 1.今日安排 服务器后台基本搭建完成,完成帐号权限一小部分完成并进行框架使用练手. 2.问题困难 跨专业成员不熟java的开发,有一名成员之前主要做安卓的,所以有比较多的东 ...

  7. python 二叉堆

    BinaryHeap() 创建一个新的,空的二叉堆. insert(k) 向堆添加一个新项. findMin() 返回具有最小键值的项,并将项留在堆中. delMin() 返回具有最小键值的项,从堆中 ...

  8. 读取.properties的内容1

    属性文件方便于项目进行更改,在项目开发中用的也是非常的普遍,在这里就把属性文件的读取通过代码进行一个小结: package com.oyy.test; import java.io.BufferedI ...

  9. Spark性能优化总结

    1. 避免重复加载RDD 比如一份从HDFS中加载的数据 val rdd1 = sc.textFile("hdfs://url:port/test.txt"),这个test.txt ...

  10. 利用java反射读写csv中的数据

      前一段有个需求需要将从数据库读取到的信息保存到csv文件中,在实现该需求的时候发现资料比较少,经过收集反射和csv相关资料,最终得到了如下程序.  1.在使用java反射读取csv文件数据时,先通 ...