MySQL数据库 JDBC 有注入攻击bug
JDBC对数据库表进行增删改查操作
- 导入jar包
- 注册驱动 告诉jvm 我们使用哪种驱动程序
Class.forName("com.mysql.jdbc.Driver");
- 获得连接对象 Connection
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称","用户名","密码")
- 获得执行者对象 Statement用于执行SQL语句 把SQL语句发送到数据库执行 Statement state = conn.createStatement()
- 执行SQL语句 返回结果
int row=state.executeUpdate(sql语句);----→增删改
ResultSet rs=state.executeQuery(sql语句);----→查
- 处理结果 (打印行数、遍历结果集)
- 释放资源
//封装一个工具类
package cn.kgc.utils;
import java.sql.*;
public class UtilsJDBC {
/**
* 创建工具类 工具中的方法都是静态方法 方便直接通过类名调用
* 定义四个静态成员变量 用于连接数据库的相关信息
* 定义静态代码块 注册驱动
* 定义一个静态方法获得Connection对象 并返回conn对象 遇到异常时需要把编译异常改为运行异常
* 定义一个静态方法 释放资源
*/
//1.定义四个静态成员变量 用于连接数据库的相关信息
private static String driver="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://localhost:3306/day03";
private static String user="root";
private static String password="123456";
//2.静态代码块 优先执行 只执行一次
//注册驱动
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn=null;
try {
conn=DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
//如果数据连接失败 那么程序没有必要继续了
//需要把编译异常改为运行异常
throw new RuntimeException("获取数据库失败");
}
return conn;
}
//3.定义一个静态方法 释放资源
public static void close(ResultSet rs, Statement state,Connection conn){
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (state!=null){
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
//测试
package cn.kgc.utils;
import java.sql.Connection;
public class Test {
public static void main(String[] args) {
Connection conn = UtilsJDBC.getConnection();
System.out.println(conn);
}
}
//操作
package cn.kgc.utils;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBC {
//添加数据
@Test
public void testInsert(){
//1 2 注册驱动 获得连接
Connection conn = UtilsJDBC.getConnection();
//3 获得执行者对象
Statement state=null;
try {
state = conn.createStatement();
//4 执行SQL语句
int row1 = state.executeUpdate("INSERT INTO products \n" +
"VALUES('p0012','华为',2999,'2',002),('p0013','华为p10',4000,'3',003)");
int row2 = state.executeUpdate("DELETE FROM products WHERE pid='p003'");
int row3 = state.executeUpdate("ALTER TABLE products CHANGE flag top VARCHAR(2)");
//处理结果 (打印行数)
System.out.println(row1+"行数据添加成功");
System.out.println(row2+"行数据删除成功");
System.out.println(row3+"行数据更改成功");
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭资源
UtilsJDBC.close(null,state,conn);
}
}
}
//原生
package cn.kgc.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo01JDBC {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//注册驱动 告诉jvm 我们使用哪种驱动程序
Class.forName("com.mysql.jdbc.Driver");
//获得连接对象 Connection
Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/day03","root","123456");
System.out.println(connection);
//获得执行者对象 Statement用于执行SQL语句 把SQL语句发送到数据库执行
Statement statement = connection.createStatement();
System.out.println(statement);
//执行SQL语句 返回结果 增删改:int affected(受影响的)影响数据库的行数 查询:ResultSet结果集
int row = statement.executeUpdate("INSERT INTO category(cname)VALUES ('化妆品'),('宠物用品'),('饮料');");
System.out.println(row);
//释放资源
statement.close();
connection.close();
}
}