1、使用JDBC连接数据库的步骤
- 注册驱动
- 获取连接
- 获取传输器
- 执行sql,返回结果
- 数据处理
- 关闭连接
2、示例
1.1、使用Statement进行查询操作
public class JDBC_01 {
public static void main(String[] args) {
String jdbc = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
String user = "root";
String password = "00000000";
try {
//1、注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2、获取连接
Connection conn = DriverManager.getConnection(url, user, password);
//3、获取传输器
Statement st = conn.createStatement();
//4、执行sql(查询所有数据),返回结果
ResultSet rs = st.executeQuery("select * from user");
//5、数据处理
while (rs.next()) {
int id = rs.getInt("id");
String number = rs.getString("number");
String name = rs.getString("name");
int age = rs.getInt("age");
int chi = rs.getInt("chi");
int math = rs.getInt("math");
int eng = rs.getInt("eng");
System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng);
}
//6、关闭连接
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
1.2、使用Statement进行更新操作
public class JDBC_01 {
public static void main(String[] args) {
String jdbc = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
String user = "root";
String password = "00000000";
try {
//1、注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2、获取连接
Connection conn = DriverManager.getConnection(url, user, password);
//3、获取传输器
Statement st = conn.createStatement();
//4、执行sql,返回结果
ResultSet rs = st.executeQuery("select * from user");
//5、数据处理
while (rs.next()) {
int id = rs.getInt("id");
String number = rs.getString("number");
String name = rs.getString("name");
int age = rs.getInt("age");
int chi = rs.getInt("chi");
int math = rs.getInt("math");
int eng = rs.getInt("eng");
System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng);
}
//6、关闭连接
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
1.3、使用PreparedStatement进行查询操作
public class JDBC_03 {
public static void main(String[] args) {
String jdbc = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
String user = "root";
String password = "00000000";
try {
//1、注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2、获取连接
Connection conn = DriverManager.getConnection(url, user, password);
//3、获取传输器
PreparedStatement ps = conn.prepareStatement("select * from user");
//4、执行sql,返回结果
ResultSet rs = ps.executeQuery();
//5、数据处理
while (rs.next()) {
int id = rs.getInt("id");
String number = rs.getString("number");
String name = rs.getString("name");
int age = rs.getInt("age");
int chi = rs.getInt("chi");
int math = rs.getInt("math");
int eng = rs.getInt("eng");
System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng);
}
//6、关闭连接
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
1.4、使用PreparedStatement进行更新操作
public class JDBC_04 {
public static void main(String[] args) {
String jdbc = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
String user = "root";
String password = "00000000";
try {
//1、注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2、获取连接
Connection conn = DriverManager.getConnection(url, user, password);
//3、获取传输器
PreparedStatement ps = conn.prepareStatement("insert into user values(?, ?, ?, ?, ?, ?, ?)");
//4、执行sql,返回结果
ps.setInt(1, 22);
ps.setString(2, "220");
ps.setString(3, "叶良辰");
ps.setInt(4, 100);
ps.setInt(5, 100);
ps.setInt(6, 100);
ps.setInt(7, 100);
int i = ps.executeUpdate();
//5、数据处理
System.out.println(i);
//6、关闭连接
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
3、步骤详解
3.1、加载驱动
3.1.1、Driver接口
- java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口,这个接口是提 供给数据库厂商使用的,不同数据库厂商提供不同的实现
- 在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现
3.1.2、mysql的驱动
-
mysql8之前
com.mysql.jdbc.Driver
-
mysql8之后
com.mysql.cj.jdbc.Driver
3.1.3、加载与注册JDBC驱动
-
调用Class类的静态方法forName()
Class.forName(“com.mysql.cj.jdbc.Driver”);
-
驱动程序管理器类的 registerDriver() 方法
DriverManager.registerDriver(com.mysql.jdbc.Driver);
3.2、建立连接
-
可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接
DriverManager.getConnection(url, user, password);
-
getConnection() 方法需要三个参数url、user、password
-
user、password是当前连接的数据库管理程序的用户名和密码
-
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的 驱动程序,从而建立到数据库的连接
-
JDBC URL的标准由三部分组成,各部分间用冒号分隔
-
jdbc:子协议:子名称
-
协议:JDBC URL中的协议总是jdbc
-
一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为 了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
-
3.3、获取传输器
3.3.1、主要接口
- Statement
- PreparedStatement
- CallableStatement
3.3.2、使用Statement
3.3.2.1、获取Statement
connection.createStatement();
3.3.2.1、使用Statement的弊端
sql注入攻击:
SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在 用户输入数据中注入非法的 SQL 语句段或命令(如:SELECT user, password FROM user_table WHERE user=’a’ OR 1 = ‘ AND password =’ OR ‘1’ = ‘1’) ,从而利用系统的 SQL 引擎完成恶意行为的做法
因为Statement传输的sql语句是用+进行拼接处理的,所以有此漏洞
解决方法:
使用PreparedStatement,参数用?代替可以防止sql注入
3.3.3、使用PreparedStatement
3.3.3.1、获取PreparedStatement
connection.prepareStatement("//sql语句");
3.3.3.2、PreparedStatement的特点
-
PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行
-
PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值
-
防止SQL注入
3.4、释放资源
-
释放ResultSet、Statement、Connection、PreparedStatement
-
数据库连接(Connection)是非常稀有的资源,用完后必须马上释放, 如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是
尽量晚创建,尽量早的释放
-
最晚获取的最先关闭
关闭顺序:ResultSet——>Statement(PreparedStatement)——>Connection
3.5、ResultSet
ResultSet rs = preparedstatement.executeQuery();
ResultSet rs = statement.executeQuery("//sql语句");
-
只有返回结果的sql语句才会使用execute创建ResultSet对象
-
ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现
-
ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行
-
关于ResultSet
- 代表结果集,封装了使用 JDBC 进行查询的结果
- ResultSet 返回的实际上就是一张数据表. 有一个指针指向数据表的第一条记录的前面
-
可以调用 next() 方法检测下一行是否有效. 若有效该方法返回 true, 且指针下移. 相当于 Iterator 对象的 hasNext() 和 next() 方法的结合体
-
当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一 列的值
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/270755.html