目录
JDBC 操作数据库
<提示:JDBC -ODBC 桥连接已经不再广泛使用. 淘汰的技术>
JDBC-ODBC 桥
JDBC-ODBC桥是一个JDBC驱动程序。完成了从JDBC操作带ODBC操作之间的转换工作。允许JDBC驱动程序被用作ODBC的驱动程序。使用JDBC-ODBC桥连接数据库的步骤是:
(1) 首先加载JDBC-ODBC桥的驱动程序。代码如下:
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
Class类是java.lang包中的一个类,通过该类的静态方法forName()可加载sun.jdbc.odbc包中的JdbcOdbcDriver类来建立JDBC-ODBC桥连接器。
(2)使用java.sql包中的Connection接口,并通过DriverManager类的静态方法getConnection()创建连接对象。格式如下:
Connection conn = DriverManager.getConnection(“jdbc:odbc:数据源名字” , “user name” , “password”);
数据源必须给出一个简短的描述名。假设没有设置user name和password,要与数据源tom交换数据,建立Connection对象的代码如下:
Connection conn = DriverManager.getConnection(“jdbc.odbc:tom”,”“,”“);
(3)向数据库发送SQL语句。使用Statement接口声明一个SQL语句对象,并通过刚才创建的连接数据库对象conn的createStatement()方法创建这个SQL对象。代码如下:
Statement sql = conn.createStatement();
JDBC-ODBC桥作为连接数据库的过渡性技术,现在已经不被Java技术广泛应用,现在广泛应用的是JDBC技术。但并不表示JDBC-ODBC桥技术已经被淘汰。由于ODBC技术被广泛地使用,使得Java可以利用JDBC-ODBC桥可以访问几乎所有的数据库。JDBC-ODBC桥作为sun.jdbc.odbc包与JDK一起自动安装,不需要特殊配置。
1.通过JDBC-ODBC 桥连接SQL Server 数据库
建立数据库连接,需要指定数据库的驱动和路径。
指定驱动:
String driverClass=”sun.jdbc.odbc.JdbcOdbcDriver”;
采用JDBC-ODBC方式连接数据库,该参数指定的是连接方式,并不需要引入驱动包。
指定路径:
String url=”jdbc:odbc:db_database05”;
以下是win10操作系统中的ODBC 配置
1.打开控制面板-管理工具-找到ODBC数据源-系统DSN-添加
如下图:
由于基本上用不到所以只是做个简介.
JDBC 连接数据库
JDBC是Java连接数据库的一种非常快速和有效的方法。但是JDBC不能直接使用,必须配合数据库提供商所提供的数据库连接驱动才能实现数据库的连接。
使用JDBC连接数据库主要分为3个步骤:获取数据库连接驱动、指定数据库连接字符串和通过驱动管理器管理驱动。
获取数据库连接的驱动,在Java中主要使用Class.forName来实现。Class 类的实例表示正在运行的Java应用程序中的类和接口。其自身并没有公共构造方法,Class 类是在加载时由 Java 虚拟机及通过调用类加载器中的defineClass方法自动构造的。
数据库连接字符串主要由连接数据库所使用驱动器、服务器的IP地址、数据库名称以及连接用户名和密码几部分组成。
通过驱动管理器管理驱动是使用DriverManager类来实现的,该类的主要功能是将数据库连接字符串转换成与其对应的数据库连接接口,以实现数据库的连接。
连接数据库
import java.sql.*; //导入java.sql包
public class Conn { // 创建类Conn
Connection con; // 声明Connection对象
public Connection getConnection(){ //建立返回值为Connection的方法
try {
// 加载驱动
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
System.out.println("数据库驱动加载成功"); (1)
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
// 连接数据库
con=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;" +
"DatabaseName=db_jdbc","sa",""); (2)
System.out.println("数据库连接成功");
} catch (SQLException e) {
e.printStackTrace();
}
return con; //按方法要求返回个Connection对象
}
// 主方法
public static void main(String[] args) {
Conn c = new Conn(); // 创建本类对象
c.getConnection(); // 调用连接数据库方法
}
}
* 向数据库发送SQL 语句 *
实例getConnection()方法,只是获取与数据库的连接。要执行SQL语句首先要获得Statement类对象。通过创建的连接数据库对象con的createStatement()方法可获得Statement对象。
try {
Statement sql = con.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
* 处理查询结果集
有了Statement对象以后,可调用相应的方法实现对数据库的查询和修改。并将查询的结果集存放在ResultSet类的对象中。例如如下语句可返回一个ResultSet对象
try {
Connection con = .... // 省略部分代码
// 获取 Statement
Statement stmt = con.createStatement();
// 获取结果集
ResultSet res = stmt.executeQuery("select * from tb_emp");
res.close();
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
运行结果为返回一个ResultSet对象,ResultSet对象一次只可以看到结果集中的一行数据,使用该类的next()方法可将光标从当前位置向后或下移一行。
* 顺序查询*
ResultSet类的next()方法的返回值是boolean类型的数据,当游标移动到最后一行之后会返回false。下面的实例就是将数据表tb_emp中的全部信息显示在控制台上。
import java.sql.*; //导入java.sql包
public class Gradation { // 创建类
static Connection con; // 声明Connection对象
static Statement sql; // 声明Statement对象
static ResultSet res; // 声明ResultSet对象
public Connection getConnection() { // 连接数据库方法
try {
// 加载驱动
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
// 创建数据库连接
con = DriverManager.getConnection(
"jdbc:microsoft:sqlserver://localhost:1433;"
+ "DatabaseName=db_jdbc", "sa", "111");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
public static void main(String[] args) { // 主方法
Gradation c = new Gradation(); // 创建本类对象
con = c.getConnection(); // 与数据库建立连接
try {
sql = con.createStatement(); // 实例化Statement对象
res = sql.executeQuery("select * from tb_stu"); // 执行SQL语句,返回结果集
while (res.next()) { // 如果当前语句不是最后一条则进入循环
String id = res.getString("id"); // 获取列名是“id”的字段值
String name = res.getString("name"); // 获取列名是“name”的字段值
String sex = res.getString("sex"); // 获取列名是“sex”的字段值
String brithday = res.getString("brithday"); // 获取列名是“brithday”的字段值
System.out.print("编号:" + id); // 将列值输出
System.out.print(" 姓名:" + name);
System.out.print(" 性别:" + sex);
System.out.println(" 生日:" + brithday);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
* 模糊查询 *
SQL语句中提供了LIKE操作符进行模糊查询,可使用“%”来代替0个或多个字符,使用下划线“_”来代替一个字符。例如,查询姓张的同学信息,SQL语句如下。
import java.sql.*; //导入java.sql包
public class Train { // 创建类Train
static Connection con; // 声明Connection对象
static Statement sql; // 声明Statement对象
static ResultSet res; // 声明ResultSet对象
public Connection getConnection() { // 与数据库连接方法
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
con = DriverManager.getConnection(
"jdbc:microsoft:sqlserver://localhost:1433;"
+ "DatabaseName=db_jdbc", "sa", "");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
public static void main(String[] args) { // 主方法
Train c = new Train(); // 创建本类对象
con = c.getConnection(); // 获取与数据库的连接
try { // try语句捕捉异常
sql = con.createStatement(); // 实例化Statement对象
res = sql.executeQuery("select * from tb_stu where name like '张%'");// 执行SQL语句
while (res.next()) { // 如果当前记录不是结果集中的最后一条,进入循环体
String id = res.getString(1); // 获取id字段值
String name = res.getString("name"); // 获取name字段值
String sex = res.getString("sex"); // 获取sex字段值
String brithday = res.getString("brithday"); // 获取brithday字段值
System.out.print("编号:" + id); // 输出信息
System.out.print(" 姓名:" + name);
System.out.print(" 性别:" + sex);
System.out.println(" 生日:" + brithday);
}
} catch (Exception e) { // 处理异常
e.printStackTrace(); // 输出异常信息
}
}
}
* 预处理语句 *
向数据库发送一个SQL语句,数据库中的SQL解释器负责把SQL语句生成底层的内部命令,然后执行该命令。完成相关的数据操作。如果不断地向数据库提交SQL语句肯定会增加数据库中SQL解释器的负担。影响执行的速度。
对于JDBC,可以通过Connection对象的prepareStatement(String sql)方法对SQL语句进行编译预处理,生成数据库底层的内部命令,并将该命令封装在PreparedStatement对象中。通过调用该对象的相应方法执行底层数据库命令。这样应用程序能针对连接的数据库,实现将SQL语句解释为数据库底层的内部命令,然后让数据库执行这个命令,这样可以减轻数据库的负担,提供了访问数据库的速度。
对SQL进行预处理时可以通过使用通配符“?”来代替任何的字段值。例如:
sql = con.prepareStatement("select * from tb_stu where id = ?");
在执行预处理语句前,必须相应方法来设置通配符所表示的值。例如:
sql.setInt(1,2);
上述语句中的“1”表示从左向右的第几个通配符。“2”表示设置的通配符的值。将通配符的值设置为2后,功能等同于:
sql = con.prepareStatement("select * from tb_stu where id = 2”);
尽管书写两条语句,看似麻烦了一些,但使用预处理语句可使应用程序更容易动态的改变SQL语句中关于字段值条件的设定。
注意:通过setXXX()方法为SQL语句中的参数赋值时,建议利用与参数匹配的方法,也可以利用setObject()方法为各种类型的参数赋值。例如:
sql.setObject(2,’李丽’);
例 本实例预处理语句动态的获取制定编号的同学信息,本实例以查询编号为2的同学信息为例结果预处理语句的用法。
import java.io.*;
import java.sql.*;
public class Prep { //创建类Perp
static Connection con; //声明Connection对象
static PreparedStatement sql; //声明预处理对象
static ResultSet res; //声明结果集对象
public Connection getConnection() { //与数据库连接方法
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
con = DriverManager.getConnection(
"jdbc:microsoft:sqlserver://localhost:1433;"
+ "DatabaseName=db_jdbc", "sa", "");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
public static void main(String[] args) { //主方法
Prep c = new Prep (); //创建本类对象
con = c.getConnection(); //获取与数据库的连接
try {
sql = con.prepareStatement("select * from tb_stu where id = ?"); //实例化预处理对象
sql.setInt(1, 2); //设置参数
res = sql.executeQuery(); //执行预处理语句
while (res.next()) { //如果当前记录不是结果集中最后一行,则进入循环体
String id = res.getString(1); //获取结果集中的第一列的值
String name = res.getString("name"); //获取name列的列值
String sex = res.getString("sex"); //获取sex列的列值
String brithday = res.getString("brithday"); //获取brithday列的列值
System.out.print("编号:" + id); //输出信息
System.out.print(" 姓名:" + name);
System.out.print(" 性别:" + sex);
System.out.println(" 生日:" + brithday);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
* 添加 修改 删除记录 *
可以通过SQL语句对数据进行添加、修改和删除操作。可通过PreparedStatement类的指定参数动态的对数据表中原有数据进行修改操作。并通过executeUpdate()方法执行更新语句。
import java.sql.*; //导入java.sql包
public class Renewal { // 创建类
static Connection con; // 声明Connection对象
static PreparedStatement sql; // 声明PreparedStatement对象
static ResultSet res; // 声明ResultSet对象
// 建立返回值为Connection的方法
public Connection getConnection() {
try {
// 加载数据库驱动
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
// 创建数据库连接
con = DriverManager.getConnection(
"jdbc:microsoft:sqlserver://localhost:1433;"
+ "DatabaseName=db_jdbc", "sa", "111");
} catch (Exception e) {
e.printStackTrace();
}
// 按方法要求返回个Connection对象
return con;
}
// 主方法
public static void main(String[] args) {
Renewal c = new Renewal(); // 创建本类对象
con = c.getConnection(); // 调用连接数据库方法
try {
sql = con.prepareStatement("select * from tb_stu"); // 查询数据库
res = sql.executeQuery(); // 执行SQL语句
System.out.println("执行增加、修改、删除前数据:");
// 遍历查询结果集
while (res.next()) {
String id = res.getString(1);
String name = res.getString("name");
String sex = res.getString("sex");
String brithday = res.getString("brithday");
System.out.print("编号:" + id);
System.out.print(" 姓名:" + name);
System.out.print(" 性别:" + sex);
System.out.println(" 生日:" + brithday);
}
// 创建PrepareStatement对象
sql = con.prepareStatement("insert into tb_stu values(?,?,?,?)");
sql.setInt(1, 10);
sql.setString(2, "张宏"); // 预处理添加数据
sql.setString(3, "女");
sql.setString(4, "1993-10-20");
sql.executeUpdate();
// 创建PrepareStatement对象
sql = con
.prepareStatement("update tb_stu set brithday = ? where id = ?");
sql.setString(1, "1994-11-02"); // 更新数据
sql.setInt(2, 2);
sql.executeUpdate();
// 创建PrepareStatement对象
sql = con.prepareStatement("delete from tb_stu where id = ?");
sql.setInt(1, 1); // 删除数据
sql.executeUpdate();
// 查询修改数据后的tb_stu表中数据
sql = con.prepareStatement("select * from tb_stu");
res = sql.executeQuery(); // 执行SQL语句
System.out.println("执行增加、修改、删除后的数据:");
// 遍历查询结果集
while (res.next()) {
String id = res.getString(1);
String name = res.getString("name");
String sex = res.getString("sex");
String brithday = res.getString("brithday");
System.out.print("编号:" + id);
System.out.print(" 姓名:" + name);
System.out.print(" 性别:" + sex);
System.out.println(" 生日:" + brithday);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
* Connection 接口 *
* Statement 接口 *
* PreparedStatement *
* DriverManager 类*
ResultSet
开发步骤
(1)数据库连接类的实现,代码如下:
<%!
Connection Con;
public<