jdbc 1.1 什么是jdbc,JDBC入门教程,使用jdbc连接数据库进行增删改查。PreparedStatement解决sql注入。

1具体内容

1.1 概念

JDBC(Java DataBase Connectivity)就是 Java 数据库连接,说白了就是用 Java 语言来操作数据库。原来我们操作数据库是在控制台使用 SQL 语句来操作数据库,JDBC 是用 Java 语言向数据库发送 SQL 语句。JDBC(Java Data Base Connectivity,Java 数据库连接)是一种用于执行 SQL 语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用 Java 语言编写的类和接口组成。JDBC 提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。同时,JDBC也是个商标名。 JDBC 屏蔽了底层不同数据库的操作差异,从而使开发者可以通过统一的 Java API 来进行操作不同的数据库,而不必考虑底层具体数据库实现的差异。 所以尽管底层数据库及其驱动有很多种,但 JDBC 是不变的
在这里插入图片描述

1.2 JDBC API

由 sun 公司提供,内容为供程序员调用的接口与类,集成在 java.sql 和 javax.sql 包中。JDBC API 可做三件事:与数据库建立连接、执行 SQL 语句、处理结果。
在这里插入图片描述

  1. DriverManager 类
    JDBC 驱动程序管理器 ,是一工厂实现类,用了工厂方法模式。是JDBC的管理层,作用于用户和驱动程序之间。DriverMangerm可以注册和删除加载的驱动程序,可以根据给定的 url 获取符合 url 协议的驱动 Driver 或者是建立 Conenction 连接,进行数据库交互。有两个作用:1)注册驱动:让 JDBC 知道要使用的是哪个驱动所有的驱动程序类必须包含一个静态部分。这个静态部分在加载该实例时由 DriverManager 类进行注册。用户在正常情况下将不会直接调用 DriverManager.regiserDriver 方法,而是在加载驱动程序时由驱动程序自动调用。注册驱动程序:
    Class.forName(“com.mysql.jdbc.Driver”);DriverManager.registerDriver(new com.mysql.jdbc.Driver())System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);2)获取 Connection:它跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。

  2. Dirver 接口
    是驱动程序对象的接口,指向具体数据库驱动程序对象
    在这里插入图片描述

  3. connection接口
    在这里插入图片描述

  4. Statement 接口
    在这里插入图片描述

  5. ResultSet接口(结果集)
    在这里插入图片描述

  6. ResultSetMetaData对象

可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
获得ResultSetMetaData对象:
ResultSet对象的getMetaData()方法;
ResultSetMetaData对象的常用方法:
int getColumnCount() : 获得本次查询中的列数
String getColumnName(int column) :获得本次查询中指定列的列名。
String getColumnTypeName(int column) :检索指定列的数据库特定的类型名称。
int getColumnDisplaySize(int column) :指示指定列的最大标准宽度,以字符为单位。
String getTableName(int column) :获取指定列的表名称

存储结果集的结构的:表头列名 数据类型 列数量,没有数据。

// 4获取Statment对象,并执行sql
Statement stm=conn.createStatement();
ResultSet rs=stm.executeQuery(sql);//ResultSetMetaData:存储结果ResultSetMetaData metaData=rs.getMetaData();// 5.处理结果:
while(rs.next()){//判断有没有下一行,有就指向——便利行   
 for(int i=1;i<=metaData.getColumnCount();i++){//遍历        System.out.print(metaData.getColumnName(i)+":"+rs.getObject(i)+"\t");   
  }    
  System.out.println();
  }
  1. PreparedStatement
    PreparedStatement 接口继承 Statement接口 PreparedStatement比普通的Statement对象使用起来更加灵活,更有效率 。解决SQL注入(登陆千万不要用statement)。使用PrepareStatement对象 与 Statement对象的区别
    1.Statement 可以先行创建, 然后将sql语句写入.执行时传入sql
    2.PreparedStatement 在创建时一定要传入 sql语句, 因为它要先运送到数据库执行预编译
    3.PreparedStatement 在执行之前 先要设置 语句中的参数. (预处理的sql语句有占位? 执行前需要给?指定参数值,执行时可以直接执行不需要传入sql) PrepareStatement 在执行之前已经 设置好了 sql语句 以及对应参数. 执行方法不需要参数

2 JDBC驱动

Java DataBase Connection:使用java使用连接数据库。 由JDBC驱动直接访问数据库 优点:100% Java,快又可跨平台 缺点:访问不同的数据库需要下载专用的JDBC驱动不同的数据库都得下载不懂jar包,相同的数据库也需要不同的jar(版本不同) 版本不兼容

2.1 JDBC 访问数据库的步骤

(1)加载数据库的驱动:DriverManager.registerDriver(Driver)_Jar DriveManager里面的registerDriver(Driver driver)Class.forName(包名.类名)_驱动类中书写一个静态代码,只要加载这个 (2)创建与数据库的连接 DriverManager里面getConnection(String url, String user, String password) (3)获取Statemnt对象:stm=conn
(4)编写sql语句:Navicat写好
(5)执行sql语句 Statement里面executeQuery(String sql)
(6)处理结果
(7)释放资源(关闭连接):数据库的连接个数是有限。

public static void main(String[] args){

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage?
            useUnicode=true&characterEncoding=utf-8&useSSL=false","root","数据库密码");
            Statement statement = connection.createStatement();
            int i = statement.executeUpdate("insert sc value(2008,2,3)");
            System.out.println(i);
            statement.close();
            connection.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

执行查询:

    public static void main(String[] args){

        try {
            Class.forName("com.mysql.jdbc.Driver");
            //2连接数据库
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage?useUnicode=true&characterEncoding=utf-8&UseSSL=false", "root", "数据库密码");
            //3statement
            Statement statement = conn.createStatement();
            //4sql
            String sql = "select * from sc";
            //5执行sql
            ResultSet resultSet = statement.executeQuery(sql);
            //返回受影响的行数
            //6返回结果

                //获取查询的总列数
            ResultSetMetaData metaData = resultSet.getMetaData(); //获取对象
            int columnCount = metaData.getColumnCount();//总列数

            System.out.println(metaData.getCatalogName(1)+"\n"); // 获取数据库名
            while(resultSet.next()){
//                int anInt = resultSet.getInt(1); //第一列数据

                for (int i = 1; i <= columnCount; i++) {
                    System.out.print(metaData.getColumnName(i)+ ":"); // 查询这列的列名
                    System.out.print("\t" + resultSet.getObject(i)+ "\t\t\t");
                }
                System.out.println("");
            }
            //7释放连接
            statement.close();
            conn.close();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

PreparedStatement解决sql注入

public static void main(String[] args) throws ClassNotFoundException, SQLException {

        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage?
        useUnicode=true&characterEncoding=utf-8&UseSSL=false", "root", "数据库密码");
        PreparedStatement prepared = conn.prepareStatement("select * from sc where s_no = ?");
        prepared.setInt(1,2002);
        ResultSet resultSet = prepared.executeQuery();
        ResultSetMetaData metaData = resultSet.getMetaData();//创建对象
        int columnCount = metaData.getColumnCount();
        while (resultSet.next()){
            for (int i = 1; i <= columnCount ; i++) {
                System.out.print(resultSet.getObject(i)+"\t");
            }
            System.out.println("");
        }
    }

返回主键

 public static void main(String[] args){

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage?useUnicode=true&characterEncoding=utf-8&useSSL=false", "root", "1214521");
            PreparedStatement prepared = connection.prepareStatement("insert  stu(name) value (?)",Statement.RETURN_GENERATED_KEYS);
            prepared.setString(1,"张飞");
            int i1 = prepared.executeUpdate();
            
            System.out.println("受影响的行数"+i1); //返回受影响的行数
            ResultSet resultSet = prepared.getGeneratedKeys();
            while (resultSet.next()){
                    System.out.print("新增主键"+resultSet.getObject(1)+"\t");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杵意

谢谢金主打赏呀!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值