JDBC技术

JDBC技术,第1张

JDBC技术 JDBC 1.JDBC是什么?

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代码实现JDBC
package 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);
        }
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5138764.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存