JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。其优点是不论使用何种数据库,只需要更改配置文件即可。

前言

2016-07-10学校组织来大连东软实训,我选择的是 JavaWeb 方向,经过20天的学习收获还是蛮大的。第一个知识点是 jdbc 。为了留点纪念,所以想把老师讲的知识全部复述一下,可以说是详细版教程。

在东软,老师把 MySQL 和 Oracle 的使用方法都介绍了,但是由于 Oracle 过大,占内存,卸载不干净,所以在这里只介绍 MySQL 数据库的操作。

MySQL 的安装

首先到官网下载 MySQL 的数据库,和MySQL Workbench 的数据库操作界面。Windows 版的在安装时记得在填写密码时一定要记住,并且选择 utf-8 编码。mac 版的安装很简单,但是在创建数据库的时候记得填写密码,否则会生成临时密码,如果当时没有记住临时密码就惨了。

然后在 MySQL 上新建一个数据库,并在空白区域右键 create schema

创建一张表

当然 JDBC 是需要掌握 SQL 语句的一般语法。

使用 JDBC 的话一般只进行增加(insert)删除(delete)修改(update)查询(select) 等操作而很少进行 创建(create) 操作,所以现在需要手动创建一张表。

CREATE TABLE stu (
stu_no INT(20),
stu_name VARCHAR(20) NOT NULL,
stu_tel VARCHAR(15),
CONSTRAINT pk_stu_no PRIMARY KEY (stu_no),
CONSTRAINT uk_stu_tel UNIQUE KEY (stu_tel)
);

这里以学生表为例。

eclipse的安装

在东软老师推荐用 MyEclipse ,因为将来的 JavaWeb 需要各种插件。但是 MyEclipse 需要花钱买,否则需要破解。破解网上教程太多,就不举例了。

而 eclipse 是开源免费的。如果只用 JDBC 的话 eclipse 完全足够。这里给出官网下载地址

注意选择 Java EE 版本,并可以选择中国镜像,下载速度更快。

JDBC 的初步实现

用 eclipse 新建一个 java project 起名为 jdbc

在工程下新建文件夹,命名为 lib ,将MySQL 的驱动文件复制到该文件夹,并右键 Build Path -> Add to Build Path 。这时发现在工程里出现 Referenced Libraries ,里面有和刚才同名的 jar 文件。

src 中新建一个包。由于包的名字一般由公司域名倒置构成,所以我起名为 com.xunge.jdbc

在包中新建一个类,类名为 JDBCDemo, 并录入以下代码。

package com.xunge.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCDemo {
public static void main(String[] args) {
try {
// 加载数据库驱动程序
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 定义数据库URL
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
// 获得与数据库的连接
Connection con = null; // 数据库连接
Statement st = null; // 语句
try {
con = DriverManager.getConnection(url, "root", "root");
// 创建 Statement 语句
st = con.createStatement();
// 执行 SQL 语句
int result = st.executeUpdate("insert into stu values(2014201106,'jiangxunzhi','13654505793')");
System.out.println(result + "行数已更新");
} catch (SQLException e) {
e.printStackTrace();
}
// 释放数据库资源
finally {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

代码中的 try catch 和 导的包是用 eclipse 自动提示添加的。

上面的代码用 executeUpdate 方法,可以进行 增加(insert)删除(delete)修改(update) 操作,返回的是更新数据的行数。而 查询(select) 语句需要用 executeQuery 方法。

JDBC 的代码重构

然而这个代码如果多次执行的话重复的代码过多,需要进行代码复用。现在可以看到的是 连接数据库删除数据库 代码是不变的,可以进行代码复用。

方法是:

1.在 src 新建一个包,包名为 com.xunge.jdbc.common

2.在该包下新建一个文件,文件名为 dbmysql.properties。文件内容如下

# MySQL
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/jbdc?useUnicode=true&characterEncoding=utf-8
username = root
password = root

这个是 MySQL 数据库的配置文件。如果用的是 Oracle 数据库,则配置文件如下

#Oracle
driver = oracle.jdbc.driver.OracleDriver
url = jdbc:oracle:thin:@localhost:1521:orcl
username = scott
password = tiger

properties 文件为配置文件。

2.在该包下新建一个类,类名为 JDBCUtil,作为 JDBC 的工具类,内容如下。

package com.xunge.jdbc.common;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

// 工具类是代码重构的一种方式
// 他解决的是在不同类中片段重复出现的代码
// 工具类的方法必须是声明成静态

public class JDBCUtil {
private static String driverClass;
private static String dbUrl;
private static String userName;
private static String passWord;
// 只会执行一次
static {
// 读取配置文件信息
Properties p = new Properties();
try {
p.load(JDBCUtil.class.getResourceAsStream("db.properties"));
} catch (IOException e1) {
e1.printStackTrace();
}
driverClass = p.getProperty("driver");
dbUrl = p.getProperty("url");
userName = p.getProperty("username");
passWord = p.getProperty("password");
// 加载驱动程序
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获得与数据库的连接
public static Connection getConnection() {
Connection con = null;
try {
// 获得连接
con = DriverManager.getConnection(dbUrl, userName, passWord);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
// 释放数据库的资源
public static void closeResource(Statement st, Connection con) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 释放数据库的资源 方法的重载
public static void closeResource(ResultSet rs, Statement st, Connection con) {
try {
rs.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

之后就可以引用工具类里的函数将 JDBC 实现出来。

JDBC 的查询

由上文知 增加(insert)删除(delete)修改(update) 操作用 executeUpdate 方法,返回的是更新数据的行数。

查询(select) 操作需要用 executeQuery 方法,需要用 executeQuery 方法,用 ResultSet 接收数据并输出。

package com.xunge.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.xunge.jdbc.common.JDBCUtil;

public class JDBCDemo_select {

public static void main(String[] args) {
Connection con = null;
Statement st = null;
ResultSet rs = null; // 结果集,用于保存查询到的数据
con = JDBCUtil.getConnection();
try {
st = con.createStatement();
// executeQuery 有一个返回值 ResultSet
rs = st.executeQuery("select * from stu");
// 处理结果集,取出数据
// 先判断有没有数据,如果有再去数据
while (rs.next()) {
// 按列取,用 get XXX方法,同事需要指定列名(有别名,按别名取)
int stu_no = rs.getInt("stu_no");
String stu_name = rs.getString("stu_name");
String stu_tel = rs.getString("stu_tel");
System.out.println(stu_no + "\t" + stu_name + "\t" + stu_tel);
}
} catch (SQLException e) {
e.printStackTrace();
}
finally {
JDBCUtil.closeResource(rs, st, con);
}
}
}

JDBC 的预编译语句实现

这里介绍一下 预编译语句。预编译语句 的优点是 如果遇到两条 SQL 语句除了几个参数不同,其他不变的话(尤其是插入语句!!),用 预编译语句 是再合适不过的啦。预编译不仅运行更快,而且写起来也方便很多。

package com.xunge.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.xunge.jdbc.common.JDBCUtil;

public class JDBCDemo_gai {
public static void main(String[] args) {
Connection con = null;
PreparedStatement st = null; // 预编译语句
con = JDBCUtil.getConnection();
try {
// 预编译语句最大特点是先生成执行计划,这时具体的值用 ? 替代
st = con.prepareStatement("insert into stu values (?, ?, ?)");
// 执行之前需要将 ? 设值, 有几个 ? 就需要设值几个值
// 使用 setXXX 设值, setXXX 方法需要两个参数,一个是需要代表第几个 ? ,从1开始,第二个是代表值
st.setInt(1, 2014201106);
st.setString(2, "jiangxunzhi");
st.setString(3, "13654505797");
st.executeUpdate();

st.setInt(1, 2014201105);
st.setString(2, "gongyuxin");
st.setString(3, "13654505796");
st.executeUpdate();
// 以后建议使用 PreparedStatement 执行 SQL 语句
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
JDBCUtil.closeResource(st, con);
}
}
}

最后一段

以上就是 JDBC 配置的全部过程及简单的应用,相信在将来的 JavaWeb 开发中一定会用到其中的知识。

说说东软学校吧

东软老师真的很不错,很负责,也很耐心,遇到的一些问题向老师提问都会很快得到详细的解释,这样的教学方式非常值得大学老师的学习。

如果你们学校也组织来东软实训的话,我作为过来人也给出几条建议吧

  1. 记得带网线!!!来这之前还一直担心没有网怎么熬过这个月,不过在贴吧里有很多卖账号的东软学生,比在外面办无线网卡合适多了。不过光用无线的话网速太慢,下载顶多200K,有网线的话轻松到1M。
  2. 如果是在东软A园区的话是没有独立卫浴的。