JDBC最基本的知识点要求理解并会使用下边的两个案例即可:
前言:
Jdbc操作步骤简析:
1.Connection conn=DriverManager.getConnection(url,账号,密码):用DriverManager类的连接方法根据url账号密码连接数据库,并返回一个连接对象Connection conn
2.Connection对象表示java代码和数据库的一个连接(将连接封装为一个java对象了<里边包含连接的数据库名,连接地址,表信息,数据库时区,数据库编码等信息>)
3.PreparedStatement pstmt = conn.prepareStatement(sql语句): 表示用连接对象的prepareStatement(sql语句)将sql语句发送给数据库并获取到一个预编译对象,预编译对象可以用来设置占位符的值,同时可以给数据库发送执行sql语句的指令
4.ResultSet rs = pstmt.executeQuery(): 表示用预编译对象pstmt的executeQuery()方法给数据库发送执行sql语句的指令来让数据库执行SQL语句, 并将 插叙结果放到一个结果集对象ResultSet rs中(可以从此对象中获取查询结果)。 //如果是数据操作就调用int rs=pstmt.executeUpdate();执行数据更新操作并返回生效的行数。
一、DML:
java
package com.zyq.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
//本类和StmtDemo1_DML不同之处在于:
// 将Statement类换成了PreparedStatement类(调用的方法也不同 <改成了conn.prepareStatement(sql)>)
// 好处在于PreparedStatement类支持: 给sql语句中包含 占位符 ? (可以防止黑客的sql注入攻击)
// SQL注入介绍: "select * from users where username= '+userName+' and password= '+password+' ";
// 当输入了上面的用户名 "'1' or 1 = 1 --" 和密码"123" ,上面的SQL语句变成如下格式:
// "SELECT * FROM user_table WHERE username='1' or 1=1 -- and password='123'"
// 此SQL中的 username='1' or 1=1 是一个永远成立的条件。 后边再加上两个减号 "--" 表示注释掉and password='123'"
// 则用此方式如论用户输什么账号密码,只要账号值后边加上 or 1=1 -- 则总是能登录成功(这就是黑客最低级的攻击手段:SQL注入)。
public class PStmtDemo1_DML {
public static void main(String[] args) throws Exception {
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tedu", "root", "root");
//3.定义sql
String sql = "insert into dept(dept_id,dname,loc)value (?,?,'延安')";
//String sql = "update dept set loc='yanAn' where dept_id=11";
//String sql = "delete from dept where dept_id=11";
//String sql = "create table ts(id int(10), name char(100))";
// 4.获取执行sql的对象statement
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 12);//给sql语句中的第1个占位符?赋值为12(表示插入的dept_id的值是12)
pstmt.setString(2, "java教学部");//给sql语句中的第2个占位符?赋值为"java教学部"(表示插入的dname值是"java教学部")
//5.执行sql
//int count = pstmt.executeUpdate(); //受影响的行
//System.out.println(count);//打印1表示成功插入了1行数据
boolean rs = pstmt.execute(); //受影响的行
//6.处理结果
System.out.println(rs);//打印1表示成功插入了1行数据
//7.释放资源
pstmt.close();
conn.close();
}
}
二、DQL:
java
package com.zyq.jdbc;
import java.sql.*;
//本类和StmtDemo2_DQL不同之处在于:
// 将Statement类换成了PreparedStatement类(调用的方法也不同 <改成了conn.prepareStatement(sql)>)
// 好处在于PreparedStatement类支持: 给sql语句中包含 占位符 ? (可以防止黑客的sql注入攻击)
// SQL注入介绍: 'select * from users where username=' "+userName+" ' and password=' "+password+" '";
// SQL注入介绍: "select * from users where username= '+userName+' and password= '+password+' ";
//
// 当输入了上面的用户名 "'1' or 1 = 1 --" 和密码"123" ,上面的SQL语句变成如下格式:
// "SELECT * FROM user_table WHERE username='1' or 1=1 -- and password='123'"
// 此SQL中的 username='1' or 1=1 是一个永远成立的条件。 后边再加上两个减号 "--" 表示注释掉and password='123'"
// 则用此方式如论用户输什么账号密码,只要账号值后边加上 or 1=1 -- 则总是能登录成功(这就是黑客最低级的攻击手段:SQL注入)。
public class PStmtDemo2_DQL {
public static void main(String[] args) throws Exception {
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tedu", "root", "root");
//3.定义sql
String sql = "select * from dept where dept_id=?";
// 4.获取执行sql的对象statement
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 10);
//5.执行sql并获取executeQuery返回的结果集对象ResultSet rs
ResultSet rs = pstmt.executeQuery(); //受影响的行
//6.处理结果(从结果集对象ResultSet rs中获取数据)
while(rs.next()){//6.1.判断结果集对象中是否有数据
int deptId=rs.getInt("dept_id");//6.2.从结果集对象ResultSet rs中获取数据dept_id
//"dept_id"也可以换成1(表示结果集中的第1列)
String dname=rs.getString(2);
String loc=rs.getString(3);
System.out.println("查询结果:" + deptId + ", " + dname + ", " + loc);
}
//7.释放资源
pstmt.close();
conn.close();
}
}
三、StmtDemo1_DML
java
package com.zyq.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class StmtDemo1_DML {
public static void main(String[] args) throws Exception {
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tedu", "root", "root");
//3.定义sql
String sql = "insert into dept(dept_id,dname,loc)value (11,'教学部','延安')";
//String sql = "update dept set loc='yanAn' where dept_id=11";
//String sql = "delete from dept where dept_id=11";
//String sql = "create table ts(id int(10), name char(100))";
// 4.获取执行sql的对象statement
Statement stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql); //受影响的行
//6.处理结果
System.out.println(count);//打印1表示成功插入了1行数据
//7.释放资源
stmt.close();
conn.close();
}
}
四、StmtDemo2_DQL
java
package com.zyq.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class StmtDemo2_DQL {
public static void main(String[] args) throws Exception {
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tedu", "root", "root");
//3.定义sql
String sql = "select * from dept where dept_id=10";
// 4.获取执行sql的对象statement
Statement stmt = conn.createStatement();
//5.执行sql并获取executeQuery返回的结果集对象ResultSet rs
ResultSet rs = stmt.executeQuery(sql); //受影响的行
//6.处理结果(从结果集对象ResultSet rs中获取数据)
while(rs.next()){//6.1.判断结果集对象中是否有数据
int deptId=rs.getInt("dept_id");//6.2.从结果集对象ResultSet rs中获取数据dept_id
//"dept_id"也可以换成1(表示结果集中的第1列)
String dname=rs.getString(2);
String loc=rs.getString(3);
System.out.println("查询结果:" + deptId + ", " + dname + ", " + loc);
}
//7.释放资源
stmt.close();
conn.close();
}
}
by zhaoYQ 2024-06-12 12:31