12.JavaAPI(JDBC数据库编程)

目录

一、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();
			}
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡独东执

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值