DriverManager
注册驱动:DriverManger.registerDriver();
Class.forName()方法参数“com.mysql.jdbc.Driver”中Driver源码使用;
获取数据库连接
DriverManager.getConnection(url,username,password);
url:连接路径jdbc:mysql://ip地址(域名):端口号/数据库名称?参数&参数...
注:参数useSSL表示是否安全连接方式
注:useServerPrepStmts表示是否开启预编译
username:用户名
password:密码
Connection
获取执行sql的对象
Statement creatStatement(); //返回一个执行sql对象
PreparedStatement prepareStatement(sql);//预编译SQL的执行SQL对象:防止SQL注入
管理事务(3个方法)
setAutoCommit(bool autoCommit); //true表示自动提交,false表示手动提交
commit(); //提交
rollback(); //回滚
示例(使用try catch实现)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Main {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://127.0.0.1:3306/stu?useSSL=false";
String username="root";
String password="123456";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql语句
String sql_code = "UPDATE student set english = 60 where sn='张三'";
//4.获取执行sql对象
Statement stmt = conn.createStatement();
try {
//设置手动提交
conn.setAutoCommit(false);
//5.执行sql语句
int answer = stmt.executeUpdate(sql_code);
//6.处理结果
System.out.println(answer);
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
conn.rollback();
throw new RuntimeException(e);
}
//7.关闭连接
stmt.close();
conn.close();
}
}
Statement
int executeUpdate(sql); //执行DML、DDL语句
返回值:受影响的行数
DDL语句成功后,返回值也可能为0
ResultSet executeQuery(sql);//执行DQL语句
返回值:结果集对象
ResultSet
boolean next(); //光标从当前位置移动一行
true表示有数据,false表示没有数据
datatype getDatatype(参); //获取数据
参数int:列的编号,1开始
参数String:列的名称
可将数据封装到ArrayList中进行调用
示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class jdbc01 {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://127.0.0.1:3306/stu?useSSL=false";
String username="root";
String password="123456";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql语句
String sql_code = "select id,sn,sex from student;";
//4.获取执行sql对象
Statement stmt = conn.createStatement();
try {
//设置手动提交
conn.setAutoCommit(false);
//5.执行sql语句
ResultSet ans = stmt.executeQuery(sql_code);
//6.处理结果
while(ans.next()){
int a = ans.getInt("id");
String b = ans.getString(2);
String c = ans.getString(3);
System.out.println(a+"\t"+b+"\t"+c);
}
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
conn.rollback();
throw new RuntimeException(e);
}
//7.关闭连接
stmt.close();
conn.close();
}
}
PrepareStatement
防止SQL注入
将密码设置为 'or'1'='1 得到SQL语句为:
select * from userinfo where user_name = 'hfkjsfhsky'and password = ''or'1'='1'
前面返回值为0,后面返回值为1,返回结果为全部数据
PrepareStatement
获取PrepareStatement对象
conn.prepareStatement(sql);
此时sql语句需要设置为:select * from userinfo where user_name = ? and password = ?
PrepareStatement对象参数设置:setXxx(参数1,参数2)
参数1表示第一个?的值,第二个参数表示第二个?的值
防止注入原理:对特殊字符进行转译,不改变语义
优点
预编译机制,性能高
#预编译需要在url参数中开启
#SQL底层中,检查SQL语法和编译SQL比较耗时,开启预编译后,该步骤只执行一次,提高了执行性能
防止SQL注入
配置MySQL执行日志(需重启mysql服务)