JDBC
JDBC:
*概念:Java DataBase Connectivity Java 数据库链接, Java语言操作数据库
*本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
*快速入门:
*步骤:(存在sql注入的问题)
1.导入驱动jar包
2.注册驱动
3.获取数据库链接对象 Connection
4.定义sql
5.获取执行sql的语句对象 Statement
6.执行sql
7.处理结果,释放资源
*详解各个对象:
1.DriverManager:驱动管理对象
*功能:
1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
2.获取数据库链接
Connection getConnection(String url ,String user ,String password);
url:指定链接路径
user:用户名
password :密码
2.Connection:数据库链接对象
*功能:
1.获取执行sql的对象:
Statement createStatement();
PreparedStatement preparedStatement(String sql);
2.管理事务:
*开启事务:setAutoCommit(bollean autoCommit):调用该方法设置参数为false,开启事务
*提交事务:commit();
*回滚事务:rollback();
3.Statement:执行sql对象
1.执行sql
1.int executUpdate(String sql):执行DML(增删改)
*返回值是影响的行数
2.ResultSet executeQuery(String sql):执行DQL(查询)
4.ResultSet:结果集对象,封装查询结果
*boolean next( ):游标向下移动一行,当返回false时,表示这一行没有数据
遍历结果集
while(resultset.next()){
sout(打印结果)
}
例子:
while(resultSet.next()){
System.out.println(resultSet.getInt(1)+"--"+resultSet.getString(2));
}
*getXxx():获取对象
*Xxx代表类型 :例如: int getInt()
*参数:
1.int:代表列的编号,从1开始 如getString(1) 获取第一列的数据
5.PreparedStatement:执行sql对象
1.SQL注入问题:在拼接sql时,有一些sql的特殊关键词参与字符串的拼接。会造成安全性问题
1.输入用户随便,输入密码时:a' or 'a' ='a'a
2.sql:select *from user where username = 'dasdas' and password = 'a' or 'a' ='a'
2.解决sql注入问题:使用PreparedStatement对象来解决
3.预编译的sql:参数使用?作为占位符
//比起比之前的步骤解决了sql注入问题
**JDBU工具类
package com.xxxx.util;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
public class JDBCUtil {
private static String url;
private static String user;
private static String password;
private static String driver;
static {
Properties properties =new Properties();
try {
properties.load(new FileInputStream("src/db.properties"));
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
driver = properties.getProperty("driver");
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
public static void close(ResultSet resultSet, Statement statement, Connection connection) throws SQLException {
statement.close();
connection.close();
resultSet.close();
}
}
*JDBC控制事务:
1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
2.操作:
*开启事务
*提交事务
*回滚事务
3.使用Connection对象来管理事务
*开启事务:setAutoCommit(bollean autoCommit):调用该方法设置参数为false,开启事务
*提交事务:commit();
*回滚事务:rollback();
package com.xxxx.jdbc;
import com.xxxx.util.JDBCUtil;
import java.sql.*;
import java.util.Scanner;
public class JDBC {
//导入驱动jar包
public static void main(String[] args) throws Exception {
//注册驱动
Connection connection = JDBCUtil.getConnection();
//开启事务
connection.setAutoCommit(false);
String sql1 ="update tb_user set uerAge = uerAge-? where userId = ?";
String sql2 ="update tb_user set uerAge = uerAge+? where userId = ?";
//获取sql语句的执行对象preparedStatement
PreparedStatement preparedStatement1 = connection.prepareStatement(sql1);
PreparedStatement preparedStatement2 = connection.prepareStatement(sql2);
//执行sql
preparedStatement1.setString(1, String.valueOf(5));
preparedStatement1.setString(2, String.valueOf(1));
preparedStatement2.setString(1, String.valueOf(5));
preparedStatement2.setString(2, String.valueOf(2));
//处理结果
preparedStatement2.executeUpdate();
//手动制造异常
int x = 1/0 ;
preparedStatement1.executeUpdate();
//提交事务
connection.commit();
//回滚
connection.rollback();
//释放资源
preparedStatement1.close();
preparedStatement2.close();
connection.close();
}
}