Java Database Connectivity(Java语言连接数据库)
2.JDBC的本质是什么?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VDNhD98L-1636273055310)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210521144936599.png)]
为什么要指定一套JDBC接口呢?
每个数据库底层实现的原理都不一样,每个数据库产品
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-esiPG2S1-1636273055312)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210521150041549.png)]
SUN公司定义这个接口,各个数据库厂家纷纷响应,去编写实现类,java程序员调用这些实现类,来连接数据库。
3.jdbc开发前的准备工作[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFSk0zbB-1636273055313)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210523152326733.png)]
4.JDBC编程六步(重点)第一步:注册驱动(作用:告诉java程序员,即将要连接哪个品牌的数据库)
第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了)
第三步:获取数据库操作对象(专门执行sql语句的对象)
第四步:执行sql语句(DQL,DML)
第五步:处理查询结果集(只有第四步执行的是select语句的时候,才有第五步查询结果集。)
第六步:释放资源.
5.java代码实现JDBCpackage JDBC;
import java.sql.*;
public class JdbcTest03 {
public static void main(String[] args) {
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null;
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/bjpowernode";
String username="root";
String password="123456";
connection= DriverManager.getConnection(url,username,password);
//3.获取出具库操作对象
statement=connection.createStatement();
//4.执行sql语句
// insert delete update 语句用函数executeUpdate()
//select 语句得用executeQuery()函数
String sql="select * from t_student";
//返回以ResultSet 查询结果集
//5.处理查询结果集
resultSet=statement.executeQuery(sql);
//ResultSet类的next()函数,有数据就返回true,没有数据就返回false
System.out.println("son"+"t"+"sname"+"t"+"classno");
System.out.println("---------------------------------");
while(resultSet.next()){
//这是第一种获取,注意:getString()的下标从1开始(建议少用)
//第二种获取(重要):这种方式获取程序会更为健壮
String sno=resultSet.getString("sno");
String sName=resultSet.getString("sname");
String classNo=resultSet.getString("classno");
System.out.println(sno+"t"+sName+"t"+classNo);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(resultSet!=null) {
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
5.sql语句的注入问题(背)
为什么会导致sql注入?
用户输入的信息含有sql语句的关键字,这些关键字参与sql语句的编译过程,导致原来的sql语句意思被扭曲,进而到达sql注入。
怎么解决sql语句的注入问题?
只要用户输入的信息不参与sql语句的编译过程,就可以解决了。
代码实现:
将第三步获取数据库操作对象(Statement)改为(PreparedStatement)欲编译的数据库操作对象。
PreparedStatement继承了java.sql.Statement,其执行原理是:预先对sql语句的框架编译,然后再给sql语句传值。
package JDBC;
import java.sql.*;
public class JdbcTest04 {
public static void main(String[] args) {
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/bjpowernode";
String userName="root";
String passWord="123456";
connection= DriverManager.getConnection(url,userName,passWord);
//3.获取数据库操作对象 ?:为占位符
String sql="select * from t_user where logName=? and logPwd=?";
//DBMS会对sql语句经行预编译,这样就不会出现sql注入了
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1,"张三");
preparedStatement.setString(2,"123456");
//4.执行sql语句 注意:这里不用再写参数(否则会再编译一次)
resultSet=preparedStatement.executeQuery();
//5.查询处理结果集
} catch (Exception e) {
e.printStackTrace();
}finally {
if(resultSet!=null) {
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
6.JDBC的行级锁
在select语句后面加行级锁、悲观锁。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qXQqBrrt-1636273055315)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210527090503438.png)]
JDBC工具类:
package JDBC;
import java.sql.*;
public class MyJdbc {
private MyJdbc(){}
static{
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
String url="jdbc:mysql://localhost:3306/bjpowernode";
String username="root";
String password="123456";
return DriverManager.getConnection(url,username,password);
}
public static void close(Connection conn, Statement stmt, ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
行级锁演示程序:
package JDBC;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcTest09 {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
//1-2步
conn=MyJdbc.getConnection();
//3步骤
conn.setAutoCommit(false);
String sql="select * from emp where job=? for update";
ps=conn.prepareStatement(sql);
ps.setString(1,"MANAGER");
rs=ps.executeQuery();
while(rs.next()){
System.out.println(rs.getString("ename")+"t"+
rs.getString("job")+"t"+
rs.getString("sal"));
}
conn.commit();
} catch (SQLException throwables) {
if(conn!=null){
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
throwables.printStackTrace();
}finally {
MyJdbc.close(conn,ps,rs);
}
}
}
package JDBC;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JdbcTest10 {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement ps=null;
try {
conn=MyJdbc.getConnection();
conn.setAutoCommit(false);
String sql="update emp set sal=sal*1.1 where job=?";
ps=conn.prepareStatement(sql);
ps.setString(1,"MANAGER");
int count=ps.executeUpdate();
System.out.println(count);
conn.commit();
} catch (SQLException throwables) {
if(conn!=null){
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
throwables.printStackTrace();
}finally{
MyJdbc.close(conn,ps,null);
}
}
}



