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. 【Python】 用户图形界面GUI wxpython IV 菜单&对话框

    更多组件 ■ 菜单栏 Menu 菜单是很多GUI必不可少的一部分.要建立菜单,必须先创建菜单栏: menuBar = MenuBar() menu = Menu() item1 = menu.Appe ...

  2. 听翁恺老师mooc笔记(14)--格式化的输入与输出

    关于C语言如何做文件和底层操作: 文件操作,从根本上说,和C语言无关.这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数来操作文件,最基本的最原始的文件操作.你需要理解,我们在这部分所学习的 ...

  3. 2017-2018-1 Java演绎法 小组成员贡献量汇总

    [第一周]贡献量(31) [说明] 完成情况 是指 每次是否全部完成分配的任务,如果全部完成贡献量记为1,否则记为0,与贡献量(时间量)相加计算贡献比例,由于前十周有具体的任务分配,Alpha阶段(第 ...

  4. Numpy - 多维数组(上)

    一.实验说明 numpy 包为 Python 提供了高性能的向量,矩阵以及高阶数据结构.由于它们是由 C 和 Fortran 实现的,所以在操作向量与矩阵时性能非常优越. 1. 环境登录 无需密码自动 ...

  5. 利用python实现简单随机验证码

    #!/usr/bin/env python # -*- coding:utf-8 -*- import random temp ='' for i in range(6): num = random. ...

  6. Beta冲刺Day1

    项目进展 李明皇 今天解决的进度 点击首页list相应条目将信息传到详情页 明天安排 优化信息详情页布局 林翔 今天解决的进度 前后端连接成功 明天安排 开始微信前端+数据库写入 孙敏铭 今天解决的进 ...

  7. openfalcon

    一.环境准备 操作系统:centos7(minimal,www.centos.org下载的包是CentOS-7-x86_64-Minimal-1611.iso) 1.1 更换阿里yum(个人习惯) 步 ...

  8. JAVA_SE基础——41.instanceof关键字(运算符)

    instanceof 关键字 instanceof关键字的作用:判断一个对象是否属于指定的类别. instanceof关键字的使用前提:判断的对象与指定的类别必须要存在继承或者实现的关系.关于实现以后 ...

  9. 业余草基于JAVA的模块化开发框架JarsLink

    需求背景 应用拆分的多或少都有问题.多则维护成本高,每次发布一堆应用.少则拆分成本高,无用功能很难下线.故障不隔离.当一个系统由多人同时参与开发时,修改A功能,可能会影响B功能,引发故障.多分支开发引 ...

  10. Extensions in UWP Community Toolkit - Mouse Cursor

    概述 UWP Community Toolkit Extensions 中有一个为 Mouse 提供的扩展 - Mouse Cursor Extensions,本篇我们结合代码详细讲解 Mouse C ...