JDBC连接数据库的原理和步骤
JDBC是Sun公司制定的⼀个可以⽤Java语⾔连接数据库的技术。
⼀、JDBC基础知识
JDBC(Java Data Base Connectivity,java数据库连接)是⼀种⽤于执⾏SQL语句的Java API,可以为多种关系数据库提供统⼀访问,它由⼀组⽤Java语⾔编写的类和接⼝组成。JDBC为数据库开发⼈员提供了⼀个标准的API,据此可以构建更⾼级的⼯具和接⼝,使数据库开发⼈员能够⽤纯 Java API 编写数据库应⽤程序,并且可跨平台运⾏,并且不受数据库供应商的限制。
1、跨平台运⾏:这是继承了Java语⾔的“⼀次编译,到处运⾏”的特点;
2、不受数据库供应商的限制:巧妙在于JDBC设有两种接⼝,⼀个是⾯向应⽤程序层,其作⽤是使得开发⼈员通过SQL调⽤数据库和处理结果,⽽不需要考虑数据库的提供商;另⼀个是驱动程序层,处理与具体驱动程序的交互,JDBC驱动程序可以利⽤JDBC API创建Java程序和数据源之间的桥梁。应⽤程序只需要编写⼀次,便可以移到各种驱动程序上运⾏。Sun提供了⼀个驱动管理器,数据库供应商——如MySQL、Oracle,提供的驱动程序满⾜驱动管理器的要求就可以被识别,就可以正常⼯作。所以JDBC不受数据库供应商的限制。
JDBC API可以作为连接Java应⽤程序与各种关系数据库的纽带,在带来⽅便的同时也有负⾯影响,以下是JDBC的优、缺点。优点如下:
操作便捷:JDBC使得开发⼈员不需要再使⽤复杂的驱动器调⽤命令和函数;
可移植性强:JDBC⽀持不同的关系数据库,所以可以使同⼀个应⽤程序⽀持多个数据库的访问,只要加载相应的驱动程序即可;
通⽤性好:JDBC-ODBC桥接驱动器将JDBC函数换成ODBC;
⾯向对象:可以将常⽤的JDBC数据库连接封装成⼀个类,在使⽤的时候直接调⽤即可。
缺点如下:
访问数据记录的速度受到⼀定程度的影响;
更改数据源困难:JDBC可⽀持多种数据库,各种数据库之间的操作必有不同,这就给更改数据源带来了很⼤的⿇烦
⼆、JDBC连接数据库的流程及其原理
1、在开发环境中加载指定数据库的驱动程序。例如,接下来的实验中,使⽤的数据库是MySQL,所以需要去下载MySQL⽀持JDBC的驱动程序(最新的是:mysql-connector-java-5.1.18-bin.jar);⽽开发环境是MyEclipse,将下载得到的驱动程序加载进开发环境中(具体⽰例的时候会讲解如何加载)。
2、在Java程序中加载驱动程序。在Java程序中,可以通过 “Class.forName(“指定数据库的驱动程序”)” ⽅式来加载添加到开发环境中的驱动程序,例如加载MySQL的数据驱动程序的代码为: Class.forName(“sql.jdbc.Driver”)
3、创建数据连接对象:通过DriverManager类创建数据库连接对象Connection。DriverManager类作⽤于Java程序和JDBC驱动程序之间,⽤于检查所加载的驱动程序是否可以建⽴连接,然后通过它的getConnection⽅法,根据数据库的URL、⽤户名和密码,创建⼀个JDBC Connection 对象。如:Connection connection = iConnection(“连接数据库的URL”, “⽤户名”, “密码”)。其中,URL=协议名+IP地址(域名)+端⼝+数据库名称;⽤户名和密码是指登录数据库时所使⽤的⽤户名和密码。具体⽰例创建MySQL的数据库连接代码如下:
Connection connectMySQL = iConnection(“jdbc:mysql://localhost:3306/myuser”,”root” ,”root” );
4、创建Statement对象:Statement 类的主要是⽤于执⾏静态 SQL 语句并返回它所⽣成结果的对象。
通过Connection 对象的createStatement()⽅法可以创建⼀个Statement对象。例如:Statement statament = ateStatement(); 具体⽰例创建Statement对象代码如下:
Statement statamentMySQL =ateStatement();
5、调⽤Statement对象的相关⽅法执⾏相对应的 SQL 语句:通过execuUpdate()⽅法⽤来数据的更新,包括插⼊和删除等操作,例如向staff表中插⼊⼀条数据的代码:
通过调⽤Statement对象的executeQuery()⽅法进⾏数据的查询,⽽查询结果会得到 ResulSet对象,ResulSet表⽰执⾏查询数据库后返回的数据的集合,ResulSet对象具有可以指向当前数据⾏的指针。通过该对象的next()⽅法,使得指针指向下⼀⾏,然后将数据以列号或者字段名取出。如果当next()⽅法返回null,则表⽰下⼀⾏中没有数据存在。使⽤⽰例代码如下:
ResultSet resultSel = uteQuery( “select * from staff” );
6、关闭数据库连接:使⽤完数据库或者不需要访问数据库时,通过Connection的close() ⽅法及时关闭数据连接。
[java] view plain copy
<pre name="code" class="java">package chp07;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBC_Test {
// 创建静态全局变量
static Connection conn;
static Statement st;
public static void main(String[] args) {
insert(); //插⼊添加记录
update(); //更新记录数据
delete(); //删除记录
query(); //查询记录并显⽰
}
/* 插⼊数据记录,并输出插⼊的数据记录数*/
public static void insert() {
conn = getConnection(); // ⾸先要获取连接,即连接到数据库
try {
String sql = "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)"
+ " VALUES ('Tom1', 32, 'M', 'china','Personnel','3','3000')"; // 插⼊数据的sql语句
st = (Statement) ateStatement(); // 创建⽤于执⾏静态sql语句的Statement对象int count = st.executeUpdate(sql); // 执⾏插⼊操作的sql语句,并返回插⼊数据的个数
System.out.println("向staff表中插⼊ " + count + " 条数据"); //输出插⼊操作的处理结果
conn.close(); //关闭数据库连接
} catch (SQLException e) {
System.out.println("插⼊数据失败" + e.getMessage());
}
}
/* 更新符合要求的记录,并返回更新的记录数⽬*/
public static void update() {
conn = getConnection(); //同样先要获取连接,即连接到数据库
try {
String sql = "update staff set wage='2200' where name = 'lucy'";// 更新数据的sql语句
st = (Statement) ateStatement(); //创建⽤于执⾏静态sql语句的Statement对象,st属局部变量int count = st.executeUpdate(sql);// 执⾏更新操作的sql语句,返回更新数据的个数
System.out.println("staff表中更新 " + count + " 条数据"); //输出更新操作的处理结果
conn.close(); //关闭数据库连接
} catch (SQLException e) {
System.out.println("更新数据失败");
}
}
/* 查询数据库,输出符合要求的记录的情况*/
public static void query() {
conn = getConnection(); //同样先要获取连接,即连接到数据库
try {
String sql = "select * from staff"; // 查询数据的sql语句
st = (Statement) ateStatement(); //创建⽤于执⾏静态sql语句的Statement对象,st属局部变量
st = (Statement) ateStatement(); //创建⽤于执⾏静态sql语句的Statement对象,st属局部变量
ResultSet rs = st.executeQuery(sql); //执⾏sql查询语句,返回查询数据的结果集
System.out.println("最后的查询结果为:");
while (rs.next()) { // 判断是否还有下⼀个数据
// 根据字段名获取相应的值
String name = rs.getString("name");
int age = rs.getInt("age");
String sex = rs.getString("sex");
String address = rs.getString("address");
String depart = rs.getString("depart");
String worklen = rs.getString("worklen");
mysql下载odbc失败String wage = rs.getString("wage");
//输出查到的记录的各个字段的值
System.out.println(name + " " + age + " " + sex + " " + address
+ " " + depart + " " + worklen + " " + wage);
}
conn.close(); //关闭数据库连接
} catch (SQLException e) {
System.out.println("查询数据失败");
}
}
/* 删除符合要求的记录,输出情况*/
public static void delete() {
conn = getConnection(); //同样先要获取连接,即连接到数据库
try {
String sql = "delete from staff where name = 'lili'";// 删除数据的sql语句
st = (Statement) ateStatement(); //创建⽤于执⾏静态sql语句的Statement对象,st属局部变量int count = st.executeUpdate(sql);// 执⾏sql删除语句,返回删除数据的数量
System.out.println("staff表中删除 " + count + " 条数据\n"); //输出删除操作的处理结果
conn.close(); //关闭数据库连接
} catch (SQLException e) {
System.out.println("删除数据失败");
}
}
/* 获取数据库连接的函数*/
public static Connection getConnection() {
Connection con = null; //创建⽤于连接数据库的Connection对象
try {
Class.forName("sql.jdbc.Driver");// 加载Mysql数据驱动
con = Connection(
"jdbc:mysql://localhost:3306/myuser", "root", "root");// 创建数据连接
} catch (Exception e) {
System.out.println("数据库连接失败" + e.getMessage());
}
return con; //返回所建⽴的数据库连接
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论