目录
一.JDBC简介:
1.1 JDBC理解:
- JDBC(Java datebasse connectivity) 称为Java连接数据库,它是一套接口。最开始学习Java时,对于数据的存储,处理,使用数组存储,处理数据,但是处理的数据不知道多少,并且内部元素是对象时,我们无法对数组的长度进行任意的变动。这个时候又学习了集合,可以对数据更好的处理,可集合只能在内存中运行,但是对于一些有关联的,数据量大的,需要修改的数据并且存储的数据,我们使用了数据库。使用数据库,使用客户端操作数据库服务器,现在使用JDBC可以使用Java程序对数据库的数据操作。
- Java程序连接数据库时,会有很多数据库比如Oracle,MySQL,serveSQL,而不同的数据库有它的不同的标准,程序员使用Java程序连接数据库时,不可能因为要使用这种数据库,就去学习使用这种数据库,这样严重影响效率。所以这种状况在设计JDBC时,将
JDBC由类和接口组成,而JDBC 的具体的实现是由具体的数据库厂商提供,以驱动程序形式提供,没有驱动无法完成数据库连接
!
如下图:
Java的应用程序连接数据库的时候,通过JDBC加载对应数据库的驱动jar(内部是该数据库的接口和具体的实现类,由对应的数据库厂家提供),加载完驱动之后,调用connection方法连接数据库。
注意点:
1.客户端和服务端之间的通信是基于TCP/IP协议的,Java(客户端)和数据库(服务端)也是基于TCP/IP协议的,只是在上面封装了,形成JDBC。所以JDBC也是基于TCP/IP协议的。(实现基础)
2.JDBC是接口,它定义一系列规范,定义了标准,具体的实现类是由数据库厂商提供。
3.无论是网络的七层模型,还是Java程序与数据库的连接都运用到了分层的思想,这样屏蔽了底层之间的差异,实现不同的功能,从而达到最终的目的。所以平常设计的时候我们可以经常考虑分层模型。一层解决不了,再加一层,直到消除差异。
二.JDBC组成:
JDBC是由JDBC API和JDBC Driver Interface两部分组成
2.1 JDBC API:
JDBC API内部包含程序员调用的接口与类,主要在java.sql 和 javax.sql中,作用是:与数据库建立连接(connection),发送执行SQL语句,处理结果。
JDBC 核心的API接口:
- Connection: 接口 连接对象
Statement: 接口 发送sql,通知数据库服务器执行
DriverManager: 类 驱动管理器, 管理项目中所有的数据库驱动
ResultSet: 接口 对应查询的结果
2.1.1 DriverManager类:
DriverManger(驱动管理器)的作用有两个:
- 注册驱动:这可以让JDBC知道要使用的是哪个驱动;
Class.forName("com.mysql.jdbc.Driver");
这个加载驱动也就是加载对应数据库的实现类和接口,参数是全路径名=包名+类名;
- 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。
connection = DriverManager.getConnection("数据库网址", "账号", "密码");
获取到这个connection是要Statement对象。
2.1.2 Connection接口:
Connection对象表示连接,与数据库的通讯都是通过这个对象展开的:
这个Connection对象,主要用来获取Statement对象的。
2.1.3 Statement接口:
Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句:
Statement有两个主要的方法:
void executeUpdate(String sql):执行增删改操作(insert、update、delete等);
ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;
executeUpdate返回的是增删改受影响的行数,而executeQuery返回的是一个Resultset结果集,是查询出来的表的数据。
代码演示:
//获取到statament对象,向数据库发送sql语句
statement = connection.createStatement();
//发送数据,并且操作数据库,插入数据
String sql="insert into dept value(10,'z',30)";
int i = statement.executeUpdate(sql);
//发送数据,删除数据
String sqldelete="delete from dept where dname='z'";
int i1 = statement.executeUpdate(sqldelete);
//返回受影响的行数
System.out.println(i1);
//发送sql语句,查询
String sqlselect="select *from emp where ename like '%i%'";
resultSet = statement.executeQuery(sqlselect);
2.1.4 ResultSet接口:
ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据:
ResultSet有两个主要的方法:
boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;
XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。
注意点:
1.next()方法是从第一行开始移动,也就是字段的那一行。之后再往下移动。
2.getXXX(int col)有它的重载方法 ------》getXXX(String column列名)获取指定列的所有数据。
代码演示:
//发送sql语句,查询
String sqlselect="select *from emp where ename like '%i%'";
resultSet = statement.executeQuery(sqlselect);
//next返回的是一个boolean类型
//解析,resultset的结果集,这个get索引的值来获取值 get(int index)
// while(resultSet.next()){
for(int j=0;j<4;j++){
resultSet.next();
String string = resultSet.getString(2);
String string1 = resultSet.getString(3);
String mgr = resultSet.getString(4);
System.out.println(string+" "+string1+" "+mgr);
}
System.out.println("==============");
//get(String 列名)来获取值,这样可读性就比较高
for(int j=0;j<4;j++){
resultSet.next();
String empno = resultSet.getString("empno");
String ename = resultSet.getString("ename");
String job = resultSet.getString("job");
System.out.println(empno+" "+ename);
System.out.println(empno+" "+ename+" "+job);
}
2.2 JDBC Driver Interface:
JDBC API 是提供给开发者的一组独立于数据库的 API,对任何数据库的操作都可以用这组 API 来进行。那么要把这些通用的 API 翻译成特定数据库能懂的"指令",就要由 JDBC Driver Interface 来实现了。JDBC Driver Interface 是面向 JDBC 驱动程序开发商的编程接口,它会把我们通过 JDBC API 发给数据库的通用指令翻译给他们自己的数据库。
三.JDBC练习:
通过JDBC实现一个学生管理系统:
package com.company.jdbcday906;/*
Author:
date:
problem:
学生管理系统
思路分析:
1.创建学生信息表,用户表(密码,用户名)
2.创建一个类作用是JDBC连接数据库,获取表中的数据
3.用户登录,把表中的数据和控制台输出的判断,正确就登录,没有的话,登录失败,然后输出判断是否注册,注册把输出的数据写入数据库中
4.登录之后写学生管理系统中的各种功能,这个时候写一个死循环1,2,3,4,功能都不能退出该循环。只有5才能然循环退出
*/
import com.company.day20Arraylist89.MyArrayList;
import java.sql.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
public class Studentmangersystem {
public static void main(String[] args) throws SQLException, ClassNotFoundException, InterruptedException {
//使用jdbc连接数据库,获取到数据
//查询用户表中的数据,并且返回
//定义一个用户的变量
String use;
String password;
//创建一个集合,用来存储这个得到的数据
//存放用户名
ArrayList listname = new ArrayList();
//存放密码
ArrayList listword = new ArrayList();
//加载驱动类(全路径名=包名+文件名)
Class.forName("com.mysql.jdbc.Driver");
//获取数据库网址,填写自己的用户名。连接数据库
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = DriverManager.getConnection();
//获取到statament对象,向数据库发送sql语句
statement = connection.createStatement();
//发送查询语句
String sql = "select *from studentsystem_user";
resultSet = statement.executeQuery(sql);
//返回一个结果集,得到里面的数据
while (resultSet.next()) {
// String string = resultSet.getString(1);
use = resultSet.getString("use");
password = resultSet.getString("password");
// System.out.println(use);
// System.out.println(password);
listname.add(use);
listword.add(password);
}
} catch (SQLException e) {
e.printStackTrace();
}
//登录判断
System.out.println("请输入你的用户名");
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
System.out.println("请输入你的密码");
String mima = scanner.next();
if (listname.contains(name) && listword.contains(mima)) {
System.out.println("正在加载..........");
//休眠3秒钟。
TimeUnit.SECONDS.sleep(3);
System.out.println("登录成功");
int i=0;
System.out.println("欢迎进入学生管理系统");
menu();
//循环执行系统功能
while(i!=2){
int choose = scanner.nextInt();
switch(choose){
case 2:
add();
break;
case 1:
show();
break;
case 3:
alter();
break;
case 4:
delete();
break;
case 5:
i= exit(i);
break;
}
}
} else {
System.out.println("用户名或者密码错误");
System.out.println("是否注册");
Scanner scanner1 = new Scanner(System.in);
String shuru = scanner1.next();
if (shuru.equals("是")) {
Connection jdbc = jdbc();
System.out.println("输入你的用户名");
Scanner scanner2 = new Scanner(System.in);
String name1 = scanner2.next();
System.out.println("输入你的密码");
String mima1 = scanner2.next();
String sql="insert into studentsystem_user values(?,?);";
PreparedStatement preparedStatement = jdbc.prepareStatement(sql);
preparedStatement.executeUpdate();
System.out.println("注册成功");
System.out.println("请重新登录");
} else {
System.out.println("失败");
}
}
}
public static Connection jdbc() throws ClassNotFoundException, SQLException {
//加载驱动类(全路径名=包名+文件名)
Class.forName("com.mysql.jdbc.Driver");
//获取数据库网址,填写自己的用户名。连接数据库
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection = DriverManager.getConnection();
// System.out.println("连接成功");
//获取到statament对象,向数据库发送sql语句
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//菜单功能,显示菜单
public static void menu(){
String[] menuarr={"1.显示所有的学生信息","2.添加学生","3.修改学生信息","4.删除学生信息","5.退出系统"};
for(int i=0;i<menuarr.length;i++){
System.out.println(menuarr[i]);
}
}
//显示所有学生的信息
public static void show() throws SQLException, ClassNotFoundException {
Connection jdbc = jdbc();
//查询所有的学生信息
String sql="select *from studentsytem_student;";
// ResultSet resultSet = jdbc.executeQuery(sql);
//使用prepareStatement,对这个预编译
PreparedStatement preparedStatement = jdbc.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while(resultSet.next()){
String id = resultSet.getString("id");
String name = resultSet.getString("name");
String sex = resultSet.getString("sex");
String age = resultSet.getString("age");
System.out.println(id+" "+name+" "+sex+" "+age);
}
}
//添加功能
public static void add() throws SQLException, ClassNotFoundException {
while (true){
try{
//要添加的数据
Scanner scanner = new Scanner(System.in);
System.out.println("输入学号:");
int id = scanner.nextInt();
System.out.println("输入名字:");
String name = scanner.next();
System.out.println("请选择性别:");
System.out.println("输入1为男,2为女:");
int anInt = scanner.nextInt();
String sex=null;
if(anInt==1){
sex="男";
}else if(anInt==2){
sex="女";
}
System.out.println("请输入年龄:");
int age = scanner.nextInt();
String sql="insert into studentsytem_student values(?,?,?,?);";
Connection jdbc = jdbc();
PreparedStatement preparedStatement = jdbc.prepareStatement(sql);
preparedStatement.setObject(1,id);
preparedStatement.setObject(2,name);
preparedStatement.setObject(3,sex);
preparedStatement.setObject(4,age);
int i = preparedStatement.executeUpdate();
System.out.println("添加成功");
break;
}catch(Exception e){
System.out.println("学号重复,重新输入");
break;
}
}
}
//修改功能,根据学号修改,不能修改学号
public static void alter() throws SQLException, ClassNotFoundException {
System.out.println("修改学生的学号:");
Scanner scanner = new Scanner(System.in);
int id = scanner.nextInt();
System.out.println("输入要修改的字段:");
String ziduan = scanner.next();
System.out.println("输入值:");
Object value = scanner.next();
Connection jdbc = jdbc();
String sql="update studentsytem_student set "+ziduan+" =? where id=?;";
System.out.println(sql);
PreparedStatement preparedStatement = jdbc.prepareStatement(sql);
preparedStatement.setObject(1,value);
preparedStatement.setObject(2,id);
preparedStatement.executeUpdate();
System.out.println("修改成功");
preparedStatement.clearParameters();
}
//删除功能,根据学号删除
public static void delete() throws SQLException, ClassNotFoundException {
System.out.println("输入要删除的学生的学号:");
Scanner scanner = new Scanner(System.in);
int id = scanner.nextInt();
Connection jdbc = jdbc();
String sql="delete from studentsytem_student where id=?;";
PreparedStatement preparedStatement = jdbc.prepareStatement(sql);
preparedStatement.setObject(1,id);
preparedStatement.executeUpdate();
System.out.println("删除成功");
}
//退出功能
public static int exit(int i){
System.out.println("已退出,欢迎使用再次本软件");
return i=2;
}
}