一、JDBC是什么?
JDBC(Java Database Connectivity):是Java访问数据库的解决方案。
JDBC定义了一套标准的接口,即访问数据库的通用API,不同数据库的厂商根据各自数据库的特点实现这些接口。
JDBC希望用相同的方式访问不同的数据库,让具体的数据库操作与数据库厂商实现无关,从而不同数据库之间轻易的进行切换。
二、JDBC相关类和接口
一个类:DriverManager 驱动管理类
三个接口:Connection 连接接口
Statement 语句对象接口
ResultSet 结果集接口
三、下载数据库驱动
ps:我上传不上去,需要私聊我(笔芯)
四、JDBC工作原理(数据库连接JDBC的步骤)
(1)加载数据库驱动
Class.forName("com.mysql.cj.mysql.Driver");
(2)创建数据库连接
Connection conn = DriverManager.getConnection("mysql:jdbc://localhost:3306/myschool?severTimezone=GMT&useSSL=false","root","123456");
# myscool 数据库库名
# root 数据库账号
#123456 数据库密码
(3)创建Statement对象,执行SQL语句
Statement statm = conn.createStatement();
(4)返回ResultSet结果
#增删改
int rs = statm.executeUpdate(sql)
#查
ResultSet rs = statm.executeQuery(sql);
(5)释放资源(先开后关)
rs.close();
statm.close();
conn.close();
五、JDBC对数据库的增删改查
4.1 增加数据(Insert)
public class InsertTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名?serverTimezone=GMT&useSSL=false&characterEncoding=gbk","账号","密码");
//3.创建Statement对象,处理sql语句
Statement statm = conn.createStatement();
String sql = "insert into class(classid,classname) values(5,'软件2101班')";
int rs = statm.executeUpdate(sql);
//测试
if(rs>0) {
System.out.println("插入成功!");
}else {
System.out.println("插入失败!");
}
//4.关闭资源
statm.close();
conn.close();
}
}
4.2 删除数据(Delete)
public class DeleteTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名?serverTimezone=GMT&useSSL=false&characterEncoding=gbk","账号","密码");
//3.创建Statement对象,处理sql语句
Statement statm = conn.createStatement();
String sql = "delete from class where classid=4";
int rs = statm.executeUpdate(sql);
//测试
if(rs>0) {
System.out.println("删除成功!");
}else {
System.out.println("删除失败!");
}
//4.关闭资源
statm.close();
conn.close();
}
}
4.3 修改数据(Update)
public class UpdateTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Scanner input = new Scanner(System.in);
//1.加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名?serverTimezone=GMT&useSSL=false&characterEncoding=gbk","账号","密码");
//3.创建Statement对象,执行sql语句
Statement statm = conn.createStatement();
System.out.println("请输入班级名称:");
String classname = input.nextLine();
System.out.println("请输入班级编号:");
String classid = input.nextLine();
String sql = "Update class set classname ='"+classname+"'"+"where classid="+classid;
int ret = statm.executeUpdate(sql);
//判断
if(ret>0) {
System.out.println("修改成功!");
}else {
System.out.println("修改失败!");
}
//4.释放资源
statm.close();
conn.close();
}
}
4.5 查找数据(Select)
public class SelectTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名?serverTimezone=GMT&useSSL=false&characterEncoding=gbk","账号","密码");
//3.创建Statement对象,执行sql语句
Statement statm = conn.createStatement();
String sql = "select * from class";
ResultSet ret = statm.executeQuery(sql);
//判断
while(ret.next()) {
int classid = ret.getInt("classid");
String classname = ret.getString("classname");
System.out.println(classid+classname);
}
//4.释放资源
ret.close();
statm.close();
conn.close();
}
}
代码优化:
将冗余代码封装进一个工具类,每次使用直接调用即可。
public class DAOUtil {
//加载驱动
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接对象
public static Connection getConnection() {
Connection conn = null;
//2.获取连接
try {
String url = "jdbc:mysql://localhost:3306/库名?serverTimezone=GMT&useSSL=false&characterEncoding=gbk";
String user="账号";
String pwd = "密码";
conn = DriverManager.getConnection(url,user,pwd);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//释放资源
public static void closeResourse(Connection conn,PreparedStatement prestatm,ResultSet rs) {
if(rs !=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(prestatm !=null) {
try {
prestatm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn !=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
六、防止sql注入
1.什么是sql注入?
SQL注入(SQL Injection)是一种网络安全漏洞,允许攻击者在应用程序没有正确验证或清理用户输入数据的情况下,导致攻击者能够操纵数据库查询、获取、修改和删除敏感信息。
2.什么方法可以解决sql注入?
(1)使用预编译语句(prepared Statements):如使用?占位符,并通过编程语言的库绑定参数。
(2)使用存储过程(Stored Procedures):将SQL代码预先存储在数据库中,并通过参数调用
(3)验证和清理用户输入:确保用户输入不包含恶意字符或SQL关键字
(4)使用ORM工具:许多ORM工具会自动处理SQL构建,减少注入风险。