本文概述
本篇文章将分四块内容对JDBC编程进行介绍:
一. JDBC编程概述
二. JDBC开发步骤
三. 工具类撰写和使用
四. properties配置文件
一. JDBC编程概述
1. 什么JDBC
JDBC(Java Database Connection):为多种关系数据库提供统一访问。它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准和规范。
2. 常见数据库介绍
Mysql:开源免费的数据库,小型的数据库。非常实用和受欢迎。已经被Oracle收购了.MySQL6.x版本也开始收费。
Oracle:收费的大型数据库,Oracle公司的产品。一般中大型公司会使用。Oracle收购了SUN公司,Mysql数据库。
DB2:IBM公司的收费数据库产品。常应用在银行系统和金融系统中.
SQLServer:MicroSoft 公司收费的中型的数据库。常常在C#、.net等语言中使用。
SyBase:提供了一个非常专业数据建模的工具PowerDesigner,但是数据库本身已经淡出历史舞台。
SQLite: 嵌入式的小型数据库,基本上用于移动端。
Java相关的数据库:MYSQL,Oracle。
数据库的设计和开发,sql语句的编写在这里不做详细的介绍。
3. JDBC开发原理
Java和数据库之间没有必然的联系,两者之间是如何连接的呢?虽然Java提供了各种数据库接口,但是我们并不知道各种数据库具体的实现原理,难以对接口进行具体的实现。
所以,数据库生产商提供了这些接口的实现类:驱动
Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动。
JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库。每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库。
二. JDBC开发步骤
JDBC一般的开发步骤如下:
首先要从官方网站上下载Mysql的驱动,并通过Eclipse导入驱动(jar包)
JDBC开发步骤如下:
- 注册驱动(Driver)
- 获得连接(Connection)
- 获得语句执行平台(Statement)
- 使用SQL语句进行处理
- 释放资源,关闭链接
数据库中创建示例:
create table users(
username varchar(10),
pass varchar(10),
nicheng varchar(30)
);
insert into users (username,pass,nicheng) values('wjy','wjykl22','凉凉夜色为你思念成河');
select * from users;
Java连接数据库
1.注册驱动:
官方API推荐方法:
Class.forName("com.mysql.jdbc.Driver");
不推荐使用DriverManager.registerDriver(new com.mysql.jdbc.Driver());注册,以上代码有两点不足:
- 硬编码,后期不易维护
- 驱动在源码中就被注册过,驱动会被两次注册
Driver源码:
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
}
2.获得连接:
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "wjykl22";
Connection con = DriverManager.getConnection(url, username, password);
其中url:需要连接数据库的位置(网址)目前来说格式基本上固定。
第一部分:jdbc,这是固定的;
第二部分:数据库名称,我们连接的是Mysql数据库,所以使用Mysql
第三部分:由数据库厂商规定的,每个厂商都有各自的要求,分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(jdbc)组成。
username:数据库用户名。
password:数据库密码。
采用上述方法就可以获得数据库的链接。
3.获得执行平台并执行sql语句
Statement stat = con.createStatement();
int executeUpdate(String sql);//用于执行insert update delete语句.
ResultSet executeQuery(String sql); //用于执行select语句.
boolean execute(String sql); //用于执行select返回true 执行其他的语句返回false.
4.结果集处理
得到ResultSet结果集后,需要对其中的数据进行数据的提取,对于ResultSet结果集的处理方法:
Object getObject(int index) / Object getObject(String name) 获得任意对象
String getString(int index) / Object getObject(String name) 获得字符串
int getInt(int index) / Object getObject(String name) 获得整形
double getDouble(int index) / Object getObject(String name) 获得双精度浮点型
5.释放资源
最后一步就是释放资源,与IO释放资源的方式如出一辙。
rs.close();
stmt.close();
con.close();
总结
完整的上述步骤如下:
public class JDBCDemo {
public static void main(String args[]) {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "wjykl22";
Connection con = DriverManager.getConnection(url, username, password);
Statement stat = con.createStatement();
stat.executeUpdate("insert into users (username,pass,nicheng) values('wjy2','wjykl33','如水流央')");
ResultSet rs = stat.executeQuery("select * from users");
while(rs.next()) {
System.out.println(rs.getString("username")
+"\t"+rs.getString("pass")+"\t"+rs.getString("nicheng"));
}
rs.close();
stat.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
预处理对象方法
为了防止代码存在SQL注入漏洞,使得代码更加完善,我们一般采用预处理对象:PreparedStatement
每条sql语句所有的实际参数,都使用逗号分隔。
1. 预处理对象并执行sql语句
String sql = "insert into sort(sid,sname) values(?,?)";
PreparedStatement psmt = conn.prepareStatement(sql)
2. 设置实际参数
void setXxx(int index, Xxx xx)
完整的代码程序段如下:
public class LoginDemo {
/*
* Java程序实现用户的登录,用户名和密码,数据库检查
* 防止注入攻击
* Statment有一个子接口PrepareStatment,表示预编译的SQL语句对象,可以高效的执行
* 这个方法是Connection数据库连接的方法
* 如何获取这个实现类呢?
*/
public static void main(String args[]) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/world";
String username = "root";
String password = "wjykl22";
Connection con = DriverManager.getConnection(url,username,password);
Scanner sc = new Scanner(System.in);
String user = sc.nextLine();
String pass = sc.nextLine();
//执行sql语句,查询用户名和密码。
//注意要写问号
String sql = "select * from users where username =? and pass =?";
java.sql.PreparedStatement pst = con.prepareStatement(sql);
//调用pst中的set方法
pst.setObject(1, user);
pst.setObject(2, pass);
System.out.println(sql);
ResultSet rs = pst.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("username") + " " + rs.getString("pass"));
}
}
}
三. 工具类撰写和使用
作为一名程序员最应该学会的事情就是偷懒。设想一下,如果我们要在多各程序中使用Mysql数据库,会有很多代码重复使用,我们可以创建一个工具类Utils,通过工具类来完成注册驱动,获得链接,获得执行平台以及释放资源的操作。
代码如下:
public class JDBCUtils {
public static final String DRIVERNAME = "com.mysql.jdbc.Driver";
public static final String URL = "jdbc:mysql://localhost:3306/mydb";
public static final String USER = "root";
public static final String PASSWORD = "root";
static {
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
System.out.println("数据库驱动注册失败!");
}
}
public static Connection getConn() throws Exception {
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
return conn;
}
}
通过调用Utils类中的各种静态方法来达到重复利用代码的效果。
四. properties配置文件
上述代码还是不太方便,如果要修改某个参数,需要修改源代码,有没有方法能够不修改源代码就能够完成配置的修改呢?
通常情况下,我们习惯使用properties文件来存储与数据库有关的配置文件。
- 文件位置:任意,建议src下
- 文件名称:任意,扩展名为properties
- 文件内容:一行一组数据,格式是“key=value”.
3.1 key命名自定义,如果是多个单词,习惯使用点分隔。例如:jdbc.driver
3.2 value值不支持中文,如果需要使用非英文字符,将进行unicode转换。
例如:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
user=root
password=root
加载配置文件properties的方法:
对应properties文件处理,开发中也使用Properties对象进行。我们将采用加载properties文件获得流,然后使用Properties对象进行处理。
public class JDBCUtils {
private static String driver;
private static String url;
private static String user;
private static String password;
static {
try {
// 1. 使用Properties处理流
// 使用load()方法加载指定的流
Properties props = new Properties();
Reader is = new FileReader("db.properties");
props.load(is);
// 2. 使用getProperty(key),通过key获得需要的值,
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 获得连接
*/
public static Connection getConnection() {
try {
// 1 注册驱动
Class.forName(driver);
// 2 获得连接
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
总结
JDBC编程是Java学习中的重点,对于初学Java的学习者来说也是一大难点,需要大量的练习和经验的总结。JDBC经常和WEB一起使用,在之后文章中会结合具体的案例对JDBC进行进一步讲解。欢迎继续观看后续内容,一起体会Java语言的智慧与魅力。