• Java


    ##JDBC

    一、概念:

      1、JDBC(Java DataBase Connectivity) Java 数据库连接,Java语言操作数据库;是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。。

      2、JDBC本质:其实是官方定义的一套操作所有关系型数据库的规则(即接口),各个数据库厂家去实现这个接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

      3、快速入门(步骤):

      • 导入驱动jar包;
      • 注册驱动;
      • 获取数据库连接对象 Connection;
      • 定义SQL;
      • 获取执行SQL语句的对象 Statement;
      • 执行SQL,接收返回结果;
      • 处理结果;
      • 释放资源(与IO一样 close)。
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class JDBC {
        public void testJDBC(){
            Connection connection = null;
            Statement stmt = null;
            try {
                //1.注册驱动  mysql5 之后可以不写
                Class.forName("com.mysql.cj.jdbc.Driver");
                //2.获取Connection对象
                String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
                String user = "root";
                String password="123456";
                connection = DriverManager.getConnection(url,user,password);
                //3.定义sql
                String sql = "update stu set math = 99 where id = 2";
                //4.获取执行sql对象
                stmt = connection.createStatement();
                //5.执行sql
                int count = stmt.executeUpdate(sql);
                //6.处理结果,
                System.out.println(count);
                if(count>0){
                    System.out.println("修改成功");
                }else {
                    System.out.println("修改失败");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                //7.释放
                    try {
                        if(stmt!=null) {
                            stmt.close();
                        }
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                try {
                    if(connection!=null) {
                        connection.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                }
        }
    }

    二、各个对象详解:

      1、DriverManager:驱动管理对象

        功能:

        ①注册驱动:告诉程序该使用那一个数据库驱动jar

        • static void registerDriver(Driver driver)
        • Class.forName("com.mysql.jdbc.Driver")

           注意:mysql5之后的驱动jar包可以省略注册驱动的步骤

        ②获取数据库连接:

        • 方法:static Connection getConnection(String url,String user,String password)
        • 参数:
          • url:指定连接的路径
            • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
            • 举例:jdbc:mysql://localhostL3306/test
            • 如果连接的是本机mysql服务器,并且mysql服务默认的端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
          • user:用户名
          • password:密码

     

      2、Connection 数据库连接对象

        功能:

          ①获取执行sql的对象:

        • Statement createStatement()
        • PreparedStatement prepareStatement(String sql)
      • ②管理事务:
        • 开启事务:void setAutoCommit(boolean autoCommit),调用该方法设置参数为false,即开启事务。
        • 提交事务:void commit()
        • 回滚事务:void rollback()

      3、Statement执行SQL的对象

        执行sql

         ①boolean execute(String sql):可以执行任意的sql,了解一下即可。

         ②int executeUpdate(String sql):执行DML(insert、update、delete)语句、DDL(create、alter、drop)语句,返回值是影响的行数。

            ③ResultSet executeQuery(String sql):执行DQL(select)语句,常用。

      

      4、ResultSet 结果集对象,封装查询结果

         ①next():游标向下移动一行

         ②getXXX(参数):获取数据

        • XXX代表数据类型, 如int getInt()、String getString()
        • 参数:
          • int:代表列的编号(从1开始,与索引不同)。如String getString(1)
          • String:代表列的名称。如double getDouble(“balance”)
    import java.sql.*;
    
    public class TestResultSet {
        public void testJDBC(){
            Connection connection = null;
            Statement stmt = null;
            ResultSet resultSet = null;
            try {
                //1.注册驱动  mysql5 之后可以不写
                Class.forName("com.mysql.cj.jdbc.Driver");
                //2.获取Connection对象
                String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
                String user = "root";
                String password="123456";
                connection = DriverManager.getConnection(url,user,password);
                //3.定义sql
                String sql = "select *from stu";
                //4.获取执行sql对象
                stmt = connection.createStatement();
                //5.执行sql
                resultSet = stmt.executeQuery(sql);
                //6.处理结果,
                resultSet.next();
                    int id = resultSet.getInt(1);
                    String username = resultSet.getString("username");
                    int math = resultSet.getInt("math");
                    int english = resultSet.getInt("english");
                    int chinese = resultSet.getInt("chinese");
                    System.out.println(id+"--"+username+"--"+math+"--"+english+"--"+chinese);
                
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                //7.释放
                try {
                    if(resultSet!=null) {
                        resultSet.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                try {
                    if(stmt!=null) {
                        stmt.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                try {
                    if(connection!=null) {
                        connection.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    import java.sql.*;
    
    public class TestResultSet {
        public void testJDBC(){
            Connection connection = null;
            Statement stmt = null;
            ResultSet resultSet = null;
            try {
                //1.注册驱动  mysql5 之后可以不写
                Class.forName("com.mysql.cj.jdbc.Driver");
                //2.获取Connection对象
                String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
                String user = "root";
                String password="123456";
                connection = DriverManager.getConnection(url,user,password);
                //3.定义sql
                String sql = "select *from stu";
                //4.获取执行sql对象
                stmt = connection.createStatement();
                //5.执行sql
                resultSet = stmt.executeQuery(sql);
                //6.处理结果
                while (resultSet.next()){//先移动 在判断
                    int id = resultSet.getInt(1);
                    String username = resultSet.getString("username");
                    int math = resultSet.getInt("math");
                    int english = resultSet.getInt("english");
                    int chinese = resultSet.getInt("chinese");
                    System.out.println(id+"--"+username+"--"+math+"--"+english+"--"+chinese);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                //7.释放
                try {
                    if(resultSet!=null) {
                        resultSet.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                try {
                    if(stmt!=null) {
                        stmt.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                try {
                    if(connection!=null) {
                        connection.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

       5、PreparedStatement:执行sql的对象

        ①SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。

          sql:select  * from  user  where  username  =  'asdasd'  and  password  =  'a'  or  'a'  =  'a' 

        ②解决sql注入问题:使用PreparedStatement对象来解决

        ③预编译的SQL:参数使用?作为占位符

        ④步骤:

          1、导入驱动jar包

          2、注册驱动

          3、获取数据库连接对象 Connection

          4、定义sql          

             *注意:sql的参数使用?最为占位符,如:select  * from  user  where  username  = ?  and  password  = ? ;

          5、获取执行sql语句的对象PreparedStatement    Connection.prepareStatement(sql)

          6、给  ?赋值

             *方法:setXxx(参数1,参数2)

                参数1:?的位置编号,从1开始

                参数2:?的值

          7、执行sql,接受返回结果,不需要传递sql语句

          8、处理结果

          9、释放资源

         ⑤以后经常会使用PreparedStatement来完成增删改查的所有操作

          可以防止sql注入

          效率更高

    package jdbc_day01;
    
    import java.sql.*;
    
    public class TestPreparedStatement {
        public boolean testJDBC(String name,String userpassword){
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
            try {
                //1.注册驱动  mysql5 之后可以不写
                Class.forName("com.mysql.cj.jdbc.Driver");
                //2.获取Connection对象
                String url ="jdbc:mysql:///test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
                String user = "root";
                String password="123456";
                connection = DriverManager.getConnection(url,user,password);
                //3.定义sql
                String sql = "select *from bank where name = ? and password = ?";
                //4.获取执行sql对象
                preparedStatement = connection.prepareStatement(sql);
                preparedStatement.setString(1,name);
                preparedStatement.setString(2,userpassword);
                //5.执行sql
                resultSet = preparedStatement.executeQuery();
                //6.处理结果
                return resultSet.next();
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                //7.释放
                try {
                    if(resultSet!=null) {
                        resultSet.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                try {
                    if(preparedStatement!=null) {
                        preparedStatement.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                try {
                    if(connection!=null) {
                        connection.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            return false;
        }
    }
    
    package jdbc_day01;
    
    public class Main {
        public static void main(String[] args) {
            System.out.println(new TestPreparedStatement().testJDBC("zhangsan","123"));
        }
    }
  • 相关阅读:
    Springboot启动前执行方法
    UUID
    vue
    前端进阶
    动态代理
    c# 对接微信公众号JSSDK使用wx.uploadImage 上传图片,后台从微信服务器上下载的图片有问题损坏的解决办法
    浏览器数据库 IndexedDB基础使用
    使用Java命令行编译和打包jar
    ArcGIS JS API 路径回放
    基于Quick_SLPK_Server的NodeJs版I3S服务发布
  • 原文地址:https://www.cnblogs.com/yyanghang/p/11525493.html
Copyright © 2020-2023  润新知