JDBC基础超详细(二)(PreparedStatement与Statement的区别,避免mysql注入)
源码奉上,大家和我一起操作,印象更加深刻
import java.sql.*;
public class Javatell {
public static void main(String []args){
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null;
//注册驱动
try {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//获取链接
String url="jdbc:mysql://localhost:3306/user";
String user="root";
String password="200101";
connection=DriverManager.getConnection(url,user,password);
//获取数据库操作对象
statement=connection.createStatement();
//定义插入语句
String insertSql="insert into user_information values (4,'你好','123456')";
//定义更新语句
String updateSql="update user_information set user_name='王五' where user_name='李四'";
//定义删除语句
String deleteSql="delete from user_information where user_name='张三' ";
//定义查询语句
String selectSql="select * from user_information ";
//首先定义count表示结果展示的行数
int count=0;
//专门执行dml语句(insert,delete,update)
count = statement.executeUpdate(insertSql);
//判断结果,如果输出一行,表示该语句影响到了一行,表示成功
System.out.println(count==1?"插入成功":"插入失败");
count=statement.executeUpdate(updateSql);
System.out.println(count==1?"更新成功":"更新失败");
count=statement.executeUpdate(deleteSql);
System.out.println(count==1?"删除成功":"删除失败");
resultSet=statement.executeQuery(selectSql);
while (resultSet.next()) {
//不管数据库中是什么类型,都是取出string
String userId= resultSet.getString("user_id");
String userName= resultSet.getString("user_name");
String userPassword= resultSet.getString("user_password");
System.out.println(userId+userName+userPassword);
}
} catch (SQLException e) {
e.printStackTrace();
}
finally {
if (resultSet!=null){try{
resultSet.close();
}
catch (SQLException e) {
e.printStackTrace();}}
try {
if (statement!=null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try{
if (connection!=null){
connection.close();
}
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
一、注册驱动(第一步)
驱动
驱动,即我们从官网下载的jar包,如果没有jar包,我们可以编译程序,但是程序无法运行,将官网下载的jar包添加到依赖。如下图:
驱动注册的两种方式
- 多层注册(为了保证代码的整洁,这里将抛出异常的语句删除,com.mysql.jdbc.Driver()这一条语句是来源于刚刚导入的jar包,并不是idea自带的)
Driver driver=new com.mysql.jdbc.Driver();DriverManager.registerDriver(driver);
- 利用反射机制注册(最常用,直接导入Driver这个类)
Class.forName("com.mysql.jdbc.Driver");
二、获取链接与获取数据库操作对象(第二、三步)
- 代码示例
//获取链接
Connection connection=DriverManager.getConnection(url,user,password);
//获取数据库操作对象
Statement statement=connection.createStatement();
- url(这里以MySql数据库为例子):url=jdbc:mysql://ip地址:端口/数据库名称
//本地数据库,user为数据库名称
String url="jdbc:mysql://localhost:3306/user";
//数据库的用户为root
String user="root";
//进入数据库的密码,一定要更改成自己的
String password="123456";
三、定义sql语句以及结果判断
定义sql语句(查询单独讲解)
//定义插入语句
String insertSql="insert into user_information values (4,'你好','123456')";
//定义更新语句
String updateSql="update user_information set user_name='王五' where user_name='李四'";
//定义删除语句
String deleteSql="delete from user_information where user_name='张三' ";
结果判断statement.executeUpdate(插入,更新,删除)
- 这是我的初始表
- 判断语句
int count=0;
//专门执行dml语句(insert,delete,update)
count = statement.executeUpdate(insertSql);
//判断结果,如果输出一行,表示该语句影响到了一行,表示成功
System.out.println(count==1?"插入成功":"插入失败");
count=statement.executeUpdate(updateSql);
System.out.println(count==1?"更新成功":"更新失败");
count=statement.executeUpdate(deleteSql);
System.out.println(count==1?"删除成功":"删除失败");
- 结果展示
结果判断statement.executeQuery(查询)
在Java中,有一个ResultSet的数据类型,专门用于存储select的语句的结果,而其还拥有一个
resultSet.next()类似与C语言中指针类型的操作,关系如下图:
所以我们既然可以定位到每一个行,就可以在行中定位到每一列,最后输出行列中的值
- 判断语句与输出语句
Statement resultSet=statement.executeQuery(selectSql);
while (resultSet.next()) {
//不管数据库中是什么类型,都是取出string,取出相应的列数
String userId= resultSet.getString("user_id");
String userName= resultSet.getString("user_name");
String userPassword= resultSet.getString("user_password");
//另外一种方式 ,不建议,列数对应一旦改变就无法精准输出
/*String userId= resultSet.getString(1);
String userName= resultSet.getString(2);
String userPassword= resultSet.getString(3);*/
System.out.println(userId+userName+userPassword);
}
} catch (SQLException e) {
e.printStackTrace();
}
- 结果展示
四、关闭通道(重要)
- 当我们执行jdbc时,这个时候是多个线程在同时运行,如果我们结束时候没有结束这些线程,他们会一直保存着,这个连接是与数据库服务器的一个连接,虽然你的方法结束了,但是这个资源依然存在数据库连接并没有释放,如果不设置close,长时间使用,你会发现自己的电脑卡的飞起。👻
- 线程结束的顺序(就像栈那样,先进行链接,在获取对象,最后看结果,而关闭时,先进后出):
打开时:Connection -> PreparedStatement -> ResultSet
关闭时:ResultSet-> PreparedStatement -> Connection
- 代码演示(要在finally语句中进行,保证结束后不会在进行其他操作)
finally {
if (resultSet!=null){try{
resultSet.close();
}
catch (SQLException e) {
e.printStackTrace();}}
try {
if (statement!=null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try{
if (connection!=null){
connection.close();
}
}catch (SQLException e){
e.printStackTrace();
}
}