再Java web项目开发中,要不可避免地使用数据库,而不同重量的数据库(如MySQL,Oracle)内部处理数据的方式不同,如果直接用数据库的访问接口来操作数据库,应用程序的可移植性会很差,所以我们将采用JDBC,一套访问数据库的标准Java类库
一.JDBC
JDBC时一套用于执行SQL语句的JavaAPI
在最开始,未产生JDBC时,应用程序时直接与数据库进行交互的,那么就会用到不同的数据库的接口,那么当用户在程序中更换要操作的数据库时,则也要重新更换新的数据库接口,代码改动很大
产生JDBC后,应用程序则会和JDBC交互,用JDBC提供的各种数据库驱动来与各数据库连接。
这样提高了数据库的通用性,而通过JDBC连接到的数据库再使用SQL语句即可完成对数据库中数据的操作
二.JDBC常用API
1.Driver接口
Driver接口是所有JDBC驱动程序必须实现的接口,在编写程序时,必须把数据库的驱动jar包加载到项目中
2.DriverManager类
DriverManager类用于创建与数据库的连接,在这个类中要用到重要的静态方法来获取Connection对象(getConnection(String url, String user, String pwd))
3.Connection接口
Connection接口表示程序与数据库的连接,只有获得了Connection对象才能访问数据库
接口中定义了一系列方法,我最常用的是prepareStatement(String sql)用来获取PreparedStatement对象
4.Statement接口
Statement接口主要是对数据库中的表进行操作,执行SQL语句,该接口提供了执行SQL语句的3个常用方法。
在实际开发中,使用Statement接口会比较繁琐且存在安全问题,所以我们可以使用PreparedStatement接口
5.PreparedStatement接口
它是Statement的子接口,拓展了带参数的SQL执行语句,用“?”来代替参数,再通过setter()方法,如:setString(),setFloat(),setInt(),setObject()等为参数赋值
setObject()表示参数无论是何种类型,都可以用。
executeUpdate()实现数据库增删改的功能
executeQuery()事项数据库查询的功能
6.ResultSet接口
ResultSet接口用于保存查询语句返回的结果集,将其封装到一个表格中
应用程序中常常调用next()方法作为循环条件来迭代结果集
接口也定义了大量getter()方法(同setter()类似)来获取数据
三.编写 JDBC程序
1.加载并注册数据库驱动
2.通过DriverManager获取Connection对象
3.通过Connection获取Prepare Statement对象
4.编写要执行的SQL语句
5.使用Prepare Statement对象执行SQL语句,获取结构
6.对ResultSet结果集进行操作(查询,迭代....)
7.关闭连接,释放资源
注意在写程序时要抛出异常,用alt + enter 可以快速抛出。
代码附注释:
package com.my002.test;
//注册账号
import java.sql.*;
import java.util.Collection;
import java.util.Scanner;
public class TestJDBC {
public static void main(String[] args) throws SQLException {
//设计一个简单的注册页面
//创建一个键盘输入的扫描包
Scanner sc = new Scanner(System.in); //创建了一个Scanner对象in,这个作用就是获取控制台的输入
System.out.println("欢迎来到用户注册系统");
System.out.println("请输入您要注册的用户的账号");
//接收用户注册的用户名
String userName = sc.nextLine(); //接收String类型的数据
System.out.println("请输入您要注册的用户的密码");
//接收键盘输入的密码
String userPwd = sc.nextLine();
PreparedStatement ps = null;
Connection conn = null;
//连接数据库,把输入的账号和密码保存到数据库中
//加载驱动:反射机制
try {
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理器,连接数据库
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/a01","root","1234");//aa不定,自己定义,直接加catch,不要try catch
//编写sql语句:注册账号的sql语句,在写其他功能时,只修改这里即可
//UPDATE users SET password = ? WHERE userName = ?;
//delete from users where userName = ?;
String sql="insert into users(userName,userPwd) values(?,?)";
//预处理sql语句:把sql语句发送到数据库上
ps = conn.prepareStatement(sql);
//给?赋值:
ps.setString(1,userName);
ps.setString(2,userPwd);
//执行sql语句
int num = ps.executeUpdate();
//处理结果
if(num > 0){
System.out.println("注册成功!!!!");
}else{
System.out.println("注册失败!!!!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭资源
try {
ps.close(); //ps是一个局部变量,
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}