一:初始JDBC
DBA通过DBMS来操作DB=====》DBS
1.1:JDBC的定义
01.Java DataBase Connectivity,java数据库连接技术
02.java.sql包下有一组用java语言来编写的类和接口(API)
03.不同的数据库厂商,提供了不同的数据库驱动包
1.2:JDBC和ODBC
JDBC:
01.纯java语言编写
02.性能高,跨平台
03.访问不同的数据库,需要下载不同的驱动包
ODBC:
01.不需要下载不同的驱动包
02.性能低,而且只能在windows系统中运行
1.3:常用的JDBC API
1. 数据库连接的四要素
01.驱动包 driver
02.连接数据库的地址 url
03.连接数据库的用户名
04.连接数据库的密码
2. Driver
在程序运行期间,动态的加载指定的驱动类
Mysql com.mysql.jdbc.Driver
Oracle oracle.jdbc.driver.OracleDriver
3. DriverManager
真正连接数据库需要的类
对象有一个getConncetion(url,userName,password),返回一个Conncetion对象!
Url==》需要连接的数据库地址
jdbc:mysql://ip地址:3306/数据库名称
userName:用户名
Password:密码
4. Connection
生成用来操作数据库的statement对象
createStatement()===》Statement对象
preparedStatement()===>PreparedStatement对象
5. PreparedStatement Statement
真正执行数据库的增删改查操作!
executeQuery()===>所有的查询使用,返回ResultSet对象
executeUpdate()===》增删改使用,返回int类型的数值
6. ResultSet
获取查询的返回结果集
1.4:使用JDBC 连接数据库的步骤
01.下载对应的驱动包并放在项目中
02.通过反射机制加载驱动类 Class.forName(“com.mysql.jdbc.Driver”)
03.通过DriverManager创建Connection对象
04.创建sql语句,通过statement对象来执行
05.处理结果集
06.释放资源
1.5:PreparedStatement 和Statement 的区别
01.创建statement对象的时候不需要sql语句
创建preparedStatement对象的时候需要sql语句
02.preparedStatement有预编译sql的功能,执行效率高
03.preparedStatement可以防止sql注入
04.preparedStatement可以使用占位符的方式给参数赋值,方便我们操作
二:第一个JDBC小案例
2.1:主菜单
// 让所有的方法中 使用 输入流对象
private static Scanner input = new Scanner(System.in);
// 主函数
public static void main(String[] args) {
// 默认显示一级菜单
showFirstMenu();
}
2.2:1级菜单
private static void showFirstMenu() {
System.out.println("=============欢迎您进入学生管理系统=============");
System.out.println("1:登录");
System.out.println("2:注册");
System.out.println("3:退出系统");
System.out.println("===================》请选择");
int choose = input.nextInt(); // 获取用户的输入
switch (choose) {
case 1: // 登录
login();
break;
case 2: // 注册
register();
break;
case 3: // 退出系统
System.out.println("欢迎您下次光临!");
System.exit(0);
break;
}
}
2.3:登录
private static void login() {
Connection connection = null; // 便于我们释放资源
Statement statement = null;
ResultSet rs = null;
try {
// 通过反射机制获取数据库驱动包
Class.forName("com.mysql.jdbc.Driver");
// 通过DriverManager获取Conncetion连接对象
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/t19", "root", "");
// 获取用户的输入
System.out.println("请输入用户名:");
String name = input.next();
System.out.println("请输入密码:");
String pwd = input.next();
// 通过connection对象创建statement对象
statement = connection.createStatement();
// 创建sql语句
String sql = "SELECT * FROM student WHERE studentName='" + name+ "' AND LoginPwd='" + pwd + "'";
// 通过statement对象执行sql语句
rs = statement.executeQuery(sql);
if (rs.next()) { // 证明有数据
System.out.println("登录成功");
showSecondMenu();// 2级菜单
} else {
System.out.println("登录失败,请您重新登录====");
login();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally { // 释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.4:注册
/**
* 注册 ===》数据的新增
* insert into student(LoginPwd,StudentName,Phone,Address,Email)
* values('admin','张三','15753049998,'海淀区','501804292@qq.com')
*
*/
private static void register() {
Connection connection = null; // 便于我们释放资源
Statement statement = null;
try {
// 通过反射机制获取数据库驱动包
Class.forName("com.mysql.jdbc.Driver");
// 通过DriverManager获取Conncetion连接对象
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/t19", "root", "");
// 获取用户的输入
System.out.println("请输入用户名:");
String name = input.next();
System.out.println("请输入密码:");
String pwd = input.next();
System.out.println("请输入phone:");
String phone = input.next();
System.out.println("请输入address:");
String address = input.next();
System.out.println("请输入email:");
String email = input.next();
// 通过connection对象创建statement对象
statement = connection.createStatement();
// 创建sql语句
String sql = "INSERT INTO student(LoginPwd,StudentName,Phone,Address,Email) VALUES('"+ pwd+ "','"+ name+ "','"+ phone+ "','"+ address+ "','" + email + "')";
// 通过statement对象执行sql语句
int row = statement.executeUpdate(sql);
if (row > 0) {
System.out.println("新增成功!");
showFirstMenu(); // 返回一级菜单
} else {
System.out.println("新增失败!");
register();// 再次注册
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally { // 释放资源
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.5:2级菜单
private static void showSecondMenu() {
System.out.println("============进入了2级菜单============");
System.out.println("============1:查询所有============");
System.out.println("============2:修改信息============");
System.out.println("============3:删除============");
System.out.println("============4:返回1级菜单============");
System.out.println("============(请您选择)============");
int choose = input.nextInt(); // 获取用户的输入
switch (choose) {
case 1: // 查询所有
findAllStudents();
break;
case 2: // 修改信息
updateByID();
break;
case 3: // 删除
deleteByID();
break;
case 4: // 返回1级菜单
showFirstMenu();
break;
}
}
2.6:查询所有
private static void findAllStudents() {
Connection connection = null; // 便于我们释放资源
Statement statement = null;
ResultSet rs = null;
try {
// 通过反射机制获取数据库驱动包
Class.forName("com.mysql.jdbc.Driver");
// 通过DriverManager获取Conncetion连接对象
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/t19", "root", "");
// 通过connection对象创建statement对象
statement = connection.createStatement();
// 创建sql语句
String sql = "SELECT * FROM student";
// 通过statement对象执行sql语句
rs = statement.executeQuery(sql);
// 循环获取每一个student对象
while (rs.next()) {
int studentNo = rs.getInt("studentNo");
String studentName = rs.getString("studentName");
String loginPwd = rs.getString("loginPwd");
// 获取日期
Timestamp birthday = rs.getTimestamp("BornDate");
System.out.println("学生编号==》" + studentNo);
System.out.println("学生姓名==》" + studentName);
System.out.println("登录密码==》" + loginPwd);
System.out.println("出生日期==》" + birthday);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally { // 释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}}
2.7:修改
private static void updateByID() {
Connection connection = null; // 便于我们释放资源
Statement statement = null;
try {
// 通过反射机制获取数据库驱动包
Class.forName("com.mysql.jdbc.Driver");
// 通过DriverManager获取Conncetion连接对象
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/t19", "root", "");
// 获取用户的输入
System.out.println("请输入需要修改的用户编号:");
int id = input.nextInt();
System.out.println("请输入新用户名:");
String name = input.next();
System.out.println("请输入新密码:");
String pwd = input.next();
// 通过connection对象创建statement对象
statement = connection.createStatement();
// 创建sql语句
String sql = "UPDATE student SET studentName='" + name+ "',LoginPwd='" + pwd + "' WHERE studentNo=" + id + "";
// 通过statement对象执行sql语句
int row = statement.executeUpdate(sql);
if (row > 0) {
System.out.println("修改成功!");
} else {
System.out.println("修改失败!");
}
showSecondMenu(); // 进入2级菜单
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally { // 释放资源
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.8:删除
private static void deleteByID() {
Connection connection = null; // 便于我们释放资源
Statement statement = null;
try {
// 通过反射机制获取数据库驱动包
Class.forName("com.mysql.jdbc.Driver");
// 通过DriverManager获取Conncetion连接对象
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/t19", "root", "");
// 获取用户的输入
System.out.println("请输入需要删除的用户编号:");
int id = input.nextInt();
// 通过connection对象创建statement对象
statement = connection.createStatement();
// 创建sql语句
String sql = "delete from student where studentno=" + id + "";
// 通过statement对象执行sql语句
int row = statement.executeUpdate(sql);
if (row > 0) {
System.out.println("删除成功!");
} else {
System.out.println("删除失败!");
}
showSecondMenu(); // 进入2级菜单
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally { // 释放资源
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.9:出现的问题
发现的问题:
01.数据库的所有操作方法中有重复代码 代码冗余
反射获取驱动包
释放资源
所有的增删改查都是用了相同的 JDBC API
02.可以sql注入 因为我们使用的Statement对象
解决办法:
01.提取所有方法中共同的JDBC API
02.提取所有的释放资源代码
03.把所有的Statement对象全部换成PreparedStatement对象
04.把所有sql语句中的参数换成占位符 ?(务必是英文状态下的)