目录
一、JDBC概述
二、JDBC技术介绍
三、数据库驱动
?四、JDBC中常用的接口和类
4.1?Driver接口
4.2 DriverManager类
4.3 Connection接口
4.4 PreparedStatement接口
4.5 ResultSet接口
五、JDBC连接数据库流程
六、使用JDBC实现数据增删改查
6.1 数据库、数据表
6.2 新增操作
6.3 删除操作
6.4 修改操作
6.5 查询所有操作
6.6 模糊查询操作
6.7 查询单个操作
学习Java语言的数据库编程,就必须学习JDBC技术,因为JDBC技术是Java语言中被广泛使用的一种操作数据库的技术。在开发软件时,通常情况下都需要利用数据库保存数据,这就需要使用Java语言访问数据库。
一、JDBC概述
????????JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
二、JDBC技术介绍
早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动! JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。 当然还有第三方公司专门为某一数据库提供驱动,这样的驱动往往不是开源免费的!
注意事项:
JDBC不能直接访问数据库,必须依赖于数据库厂商提供的JDBC驱动程序完成以下三个步骤工作:
(1)建立与数据库连接
(2)向数据库发送sql语句
(3)处理从数据库返回的结果
三、数据库驱动
????????我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现。即在创建的Java项目中导入数据库驱动包程序。
?四、JDBC中常用的接口和类
????????JDBC提供了众多的接口和类,通过这些接口和类,可以实现与数据库的通信。JDBC中的核心类和接口有:DriverManager、Connection、Statement,和ResultSet。
4.1?Driver接口
????????Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。
每个驱动程序类必须实现的接口。Java SQL 框架允许多个数据库驱动程序。每个驱动程序都应该提供一个实现 Driver 接口的类。
//装载SQLServer驱动:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//装载MySql驱动:
Class.forName("com.mysql.jdbc.Driver");
//装载Oracle驱动:
Class.forName("oracle.jdbc.driver.OracleDriver");
4.2 DriverManager类
DriverManager类负责管理JDBC驱动程序的基本服务,是JDBC的管理层,作用于用户和驱动程序之间复制则跟踪可用的驱动程序,并在数据库和驱动程序之间建立连接。
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=db_数据库名称";
String user = "sa";
String password = "123";
Connection conn = DriverManager.getConnection(url, user, password);
4.3 Connection接口
Connection接口代表与特定数据库的连接,在连接的上下文中可以执行SQL语句并返回结果。Connection最为重要的一个方法就是用来获取PreparedStatement对象;
//创建向数据库发送预编译sql的PrepareSatement对象。
PrepareSatement ps = conn.prepareStatement(sql);
4.4 PreparedStatement接口
表示预编译的 SQL 语句的对象。
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
PreparedStatement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句:
//执行更新操作(insert、update、delete等);
void executeUpdate(String sql);
//执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;
ResultSet executeQuery(String sql);
4.5 ResultSet接口
ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的"行光标",以及获取当前行上的每一列上的数据:
//使"行光标"移动到下一行,并返回移动后的行是否存在;
boolean next();
//获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。
XXX getXXX(int col);
五、JDBC连接数据库流程
在访问数据库时,首先要加载数据库的驱动程序,不过只需在第一次访问数据库时加载一次;然后在每次访问数据库时创建一个Connection对象;紧接着执行操作数据库的sql语句,并处理返回结果;然后在完成此次操作时销毁的所有数据库对象,释放与数据库的连接。
具体流程及步骤:
//步骤1:加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//步骤2:建立数据库连接
String url="jdbc:sqlserver://localhost:1433;DatabaseName=db_jdbc";
Connection con = DriverManager.getConnection(url,"sa","123");
//步骤3:获得执行对象
PreparedStatement ps=con.prepareStatement("sql语句[增删改查]");
//步骤4:给sql语句中的占位符进行赋值
ps.setXxx(index,xxx);
//步骤5:开始执行sql语句
//增、删、改 ps.executeUpdate();
int n = ps.executeUpdate();
//查询:ps.executeQuery();
ResultSet rs = ps.executeQuery();
//遍历
while(rs.next()){
System.out.println(rs.getXxx(index));
}
//步骤6:关闭所有数据库对象
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
六、使用JDBC实现数据增删改查
6.1 数据库、数据表
--创建学生管理系统
create database db_stuManager
on primary
(
name = 'db_stuManager',--主数据文件的名称
--fileName:主数据文件的存储路径
fileName = 'D:\db_stuManager.mdf',
size = 3MB,--初始大小
maxsize = 10MB,--最大存储范围
filegrowth = 10%--增长百分比
)
log on
(
name = 'db_stuManager_ldf',
fileName = 'D:\db_stuManager_ldf.ldf',
size = 1MB,
maxsize = 3MB,
filegrowth = 10%
)
--使用当前数据库
use db_stuManager;
--创建一个学生信息表
--字段:学号 姓名 性别 年龄 地址 爱好 手机号码
create table tb_student
(
--identity:标识列|自增长 不可手动维护
sid int primary key identity(1,1),--学号
sname varchar(50) not null,--姓名
ssex varchar(2) not null check(ssex in('男','女')),--性别
sage int not null,--年龄
saddress varchar(100) default '浪琴湾',
shobby varchar(100) ,--爱好
sphone varchar(20) --电话
)
--插入数据
insert into tb_student values('zhangsan','男',15,'湖南长沙市','打游戏','1232632899')
6.2 新增操作
package com.zking;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
try {
// 1.加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
// 2.连接数据库
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=db_stuManager";
String user = "sa";
String password = "123";
Connection conn = DriverManager.getConnection(url, user, password);
// 3.创建执行对象
// ?:占位符
String sql = "insert into tb_student values(?,?,?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
// 使用输入器代替
System.out.println("您选择的是新增操作: ");
Scanner sc = new Scanner(System.in);
System.out.println("请输入姓名: ");
String name = sc.next();
System.out.println("请输入性别: ");
String sex = sc.next();
System.out.println("请输入年龄: ");
int age = sc.nextInt();
System.out.println("请输入地址: ");
String address = sc.next();
System.out.println("请输入爱好: ");
String shobby = sc.next();
System.out.println("请输入电话: ");
String sphone = sc.next();
// 3.2 给sql语句中的占位符赋值---通过ps(执行对象)赋值
ps.setString(1, name);
ps.setString(2, sex);
ps.setInt(3, age);
ps.setString(4, address);
ps.setString(5, shobby);
ps.setString(6, sphone);
// 4.通过执行对象调取执行sql语句的方法
int n = ps.executeUpdate();
// 5.判断是否成功
if (n > 0) {
System.out.println("成功");
} else {
System.out.println("失败");
}
// 6.关闭数据库连接
if (conn != null && !conn.isClosed()) {
conn.close();// 关闭
}
if (ps != null) {
ps.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.3 删除操作
package com.zking;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 0.定义连接对象 执行对象
Connection conn = null;
PreparedStatement ps = null;
try {
// 1.加载驱动
String className = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(className);
// 2.创建连接
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=db_stumanager";
conn = DriverManager.getConnection(url, "sa", "123");
// 3.创建执行对象
String sql = "delete from tb_stu where sid = ?";
ps = conn.prepareStatement(sql);
System.out.println("请输入要删除的学生的学号: ");
int sid = sc.nextInt();
ps.setInt(1, sid);
// 4.调用执行对象的方法并且返回影响的行数
int n = ps.executeUpdate();
// 5.判断影响的行数是否大于0
if (n > 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
// 6.关闭连接
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
// 6.关闭数据库连接
try {
if (conn != null && !conn.isClosed()) {
conn.close();// 关闭
}
if (ps != null) {
ps.close();// 关闭
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
6.4 修改操作
package com.zking;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 0.定义连接对象 执行对象
Connection conn = null;
PreparedStatement ps = null;
try {
// 1.加载驱动
String className = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(className);
// 2.创建连接
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=db_1015";
conn = DriverManager.getConnection(url, "sa", "123");
// 3.创建执行对象
// 修改
String sql = "update tb_stu set sname = ? , ssex = ? , sage = ? , saddress = ? ,shobby = ? , stelphone = ? where sid = ?";
ps = conn.prepareStatement(sql);
System.out.println("输入修改的学号: ");
int sid = sc.nextInt();
System.out.println("请输入姓名: ");
String name = sc.next();
System.out.println("请输入性别: ");
String sex = sc.next();
System.out.println("请输入年龄: ");
int age = sc.nextInt();
System.out.println("请输入地址: ");
String address = sc.next();
System.out.println("请输入爱好: ");
String shobby = sc.next();
System.out.println("请输入电话: ");
String sphone = sc.next();
// 给占位符赋值
ps.setString(1, name);
ps.setString(2, sex);
ps.setInt(3, age);
ps.setString(4, address);
ps.setString(5, shobby);
ps.setString(6, sphone);
ps.setInt(7, sid);
// 4.调用执行对象的方法并且返回其影响的行数
int n = ps.executeUpdate();
// 5.判断影响的行数是否大于0
if (n > 0) {
System.out.println("修改成功");
} else {
System.out.println("修改失败");
}
// 6.关闭连接
} catch (Exception e) {
e.printStackTrace();
} finally {
// 6.关闭数据库连接
try {
if (conn != null && !conn.isClosed()) {
conn.close();// 关闭
}
if (ps != null) {
ps.close();// 关闭
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
6.5 查询所有操作
package com.zking;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Test {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 1.加载驱动
// SQLServerDriver
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
// 2.创建连接
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=db_stuManager";
String user = "sa";
String password = "123";
conn = DriverManager.getConnection(url, user, password);
// 3.创建执行对象
String sql = "select * from tb_student";
ps = conn.prepareStatement(sql);
// 4.调用executeQuery 返回结果集对象
rs = ps.executeQuery();// 返回结果集对象
// 5.遍历结果集中的数据
while (rs.next()) {// 如果存在下一条数据 就可以打印
// 获取记录的每一个属性
// 学号
int sid = rs.getInt(1);
// int sid = rs.getInt("sid");
// 姓名
String sname = rs.getString(2);
// 性别
String ssex = rs.getString(3);
// 年龄
int sage = rs.getInt(4);
// 地址
String saddress = rs.getString(5);
// 爱好
String shobby = rs.getString(6);
// 电话
String sphone = rs.getString(7);
System.out.println("信息如下: " + sid + "---" + sname + "----" + ssex + "---" + sage + "----" + saddress
+ "----" + shobby + "---" + sphone);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 不管程序是否有问题 都会执行
try {
// 6.关闭(连接对象|执行对象|结果集对象)
if (conn != null && !conn.isClosed()) {
conn.close();
}
if (ps != null) {
ps.close();
}
if (rs != null) {
rs.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
6.6 模糊查询操作
package com.zking;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要搜索的地址: ");
String address = sc.next();
//连接对象 执行对象 结果集对象
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//2.创建连接对象
conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=db_stuManager", "sa", "123");
//3.创建执行对象
ps = conn.prepareStatement("select * from tb_student where saddress like '%"+address+"%'");
//4.返回结果集对象
rs = ps.executeQuery();
//5.遍历结果集
while(rs.next()) {
//获取记录的每一个属性
//学号
int sid = rs.getInt(1);
//int sid = rs.getInt("sid");
//姓名
String sname = rs.getString(2);
//性别
String ssex = rs.getString(3);
//年龄
int sage = rs.getInt(4);
//地址
String saddress = rs.getString(5);
//爱好
String shobby = rs.getString(6);
//电话
String sphone = rs.getString(7);
//System.out.println("信息如下: "+sid+"---"+sname+"----"+ssex+"---"+age+"----"+address+"----"+shobby+"---"+sphone);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭
try {
if(conn!=null && !conn.isClosed()) {
conn.close();
}
if(ps!=null) {
ps.close();
}
if(rs!=null) {
rs.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
6.7 查询单个操作
package com.zking;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入输入的学生的学号: ");
int id = sc.nextInt();
//连接对象 执行对象 结果集对象
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//2.创建连接对象
conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=db_stuManager", "sa", "123");
//3.创建执行对象
ps = conn.prepareStatement("select * from tb_student where sid = ?");
ps.setInt(1, id);
//4.返回结果集对象
rs = ps.executeQuery();
//5.遍历结果集
if(rs.next()) {
//获取记录的每一个属性
//学号
int sid = rs.getInt(1);
//int sid = rs.getInt("sid");
//姓名
String sname = rs.getString(2);
//性别
String ssex = rs.getString(3);
//年龄
int sage = rs.getInt(4);
//地址
String saddress = rs.getString(5);
//爱好
String shobby = rs.getString(6);
//电话
String sphone = rs.getString(7);
System.out.println("信息如下: "+sid+"---"+sname+"----"+ssex+"---"+sage+"----"+saddress+"----"+shobby+"---"+sphone);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭
try {
if(conn!=null && !conn.isClosed()) {
conn.close();
}
if(ps!=null) {
ps.close();
}
if(rs!=null) {
rs.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
|