Java学习笔记(六十三)—— JDBC(基础)

概述
  • 概念:Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
  • JDBC本质:官方(sum公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)来编程,真正执行的代码是jar包中的实现类
简单入门
  • 步骤:
    • 导入驱动jar
    • 注册驱动
    • 获取数据库的连接对象 Connection
    • 定义sql
    • 获取执行sql语句的对象Statement
    • 执行sql,接收返回的结果
    • 处理结果
    • 释放资源
            // 1.导入驱动jar包
            // 1.1 复制驱动jar包到项目模块的libs目录下
    		// 1.2 右键 --> Add As Library
            // 2.注册驱动,MySQL5之后的驱动jar包可以省略该步骤
            Class.forName("com.mysql.jdbc.Driver"); 
            // 3.获取数据库的连接对象
            Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/db2",
                    "root", "root");
            // 4.定义sql语句
            String sql="update account set money = 500 where id=2";
            // 5.获取执行sql的对象Statement
            Statement stmt = conn.createStatement();
            // 6.执行sql
            int count = stmt.executeUpdate(sql);
            // 7.处理结果
            System.out.println(count); // 返回1
            // 8.释放资源
            stmt.close();
            conn.close();
对象
  • DriverManager:驱动管理对象

    • 概述:用于管理一组JDBC驱动程序的基本服务。
    • 功能:
    1. 注册驱动:告诉程序改使用哪一个数据库驱动jar
    static void registerDriver​(Driver driver) 
    	使用 DriverManager注册给定的驱动程序。 
    1. 获取数据库连接
    static Connection getConnection​(String url, String user, String password) 
    	尝试建立与给定数据库URL的连接。 
    	// url 指定连接的路径 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
    	// 如果连接的本机的mysql服务器,并且mysql服务器的端口号是3306,url可以简写为
    	// jdbc:mysql:///数据库名称
    	// user 用户名
    	// password 密码 
  • Connection:数据库连接对象

    • 概述:与特定数据库的连接(会话)。 执行SQL语句并在连接的上下文中返回结果。
    • 功能:
    1. 获取执行sql语句的对象
    Statement createStatement​() 
    	创建一个 Statement对象,用于将SQL语句发送到数据库。 
    PreparedStatement prepareStatement​(String sql) 
    	创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。   
    1. 管理事务:
    // 调用改方法,设置参数值为false,则开启事务
    void setAutoCommit​(boolean autoCommit) 
    	将此连接的自动提交模式设置为给定状态。  
    // 提交事务
    void commit​() 
    	使上次提交/回滚之后所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。
    //  回滚事务
    void rollback​() 
    	撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。 
  • Statement:执行sql的对象

    • 概述:用于执行静态SQL语句并返回其生成的结果的对象。
    // 可以执行任意的sql
    boolean execute​(String sql) 
    	执行给定的SQL语句,这可能会返回多个结果。
    // 返回值是影响的行数  
    int executeUpdate​(String sql) 
    	执行给定的SQL语句,这可能是 INSERT , UPDATE ,或 DELETE声明,或者不返回任何内容,如SQL DDL语句的SQL语句。
    ResultSet executeQuery​(String sql) 
    	执行给定的SQL语句,返回一个 ResultSet对象。      
  • ResultSet:结果集对象,封装查询结果

    next():游标向下移动一行
    getXX(参数):获取数据,XX代表数据类型 如:getInt()getString()
    	参数:int --> 代表列的编号,1开始
    		String --> 代表列的名称
            Connection connection=null;
            Statement statement=null;
            ResultSet resultSet=null;
            try {
                // 2.注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 3.获取连接对象
                connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
                // 4.创建sql语句
                String sql="select * from account";
                // 5.获取执行sql语句的对象
                statement = connection.createStatement();
                // 6.执行sql语句
                resultSet = statement.executeQuery(sql);
                // 7.处理结果
                // 7.1让游标向下移动异常
                // 获取到的是account表中的第一行的数据
                resultSet.next();
                int anInt = resultSet.getInt(1);
                String name = resultSet.getString("name");
                double aDouble = resultSet.getDouble(3);
                System.out.println(anInt+"---"+name+"---"+aDouble);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(resultSet!=null){
                    try {
                        resultSet.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(statement !=null){
                    try {
                        statement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }if(connection !=null){
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
            Connection connection=null;
            Statement statement=null;
            ResultSet resultSet=null;
            try {
                // 2.注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 3.获取连接对象
                connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
                // 4.创建sql语句
                String sql="select * from account";
                // 5.获取执行sql语句的对象
                statement = connection.createStatement();
                // 6.执行sql语句
                resultSet = statement.executeQuery(sql);
                // 7.处理结果
                while (resultSet.next()){
                    int anInt = resultSet.getInt(1);
                    String name = resultSet.getString("name");
                    double aDouble = resultSet.getDouble(3);
                    System.out.println(anInt+"---"+name+"---"+aDouble);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(resultSet!=null){
                    try {
                        resultSet.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(statement !=null){
                    try {
                        statement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }if(connection !=null){
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
    
  • JDBC抽取工具类

  • PreparedStatement:执行sql对象

    • SQL注入问题:在拼接sql时,由一些sql的特殊关键字参与字符串的拼接会造成一些安全性的问题
    • 解决SQL注入问题,用PreparedStatement对象
    • 预编译的SQL:参数使用?作为占位符
    • 步骤:
    1. 导入驱动jar
    2. 注册驱动
    3. 获取数据库的连接对象 Connection
    4. 定义sql
      4.1 注意:sql的参数作为占位符,select * from users where username=? and password= ?
    5. 获取执行sql语句的对象PreparedStatement,Connection.preparedStatement(String sql)
    6. ?赋值:setXX(参数1,参数2),参数1:? 的位置编号 从1开始,参数2:? 的值,XX:数据类型
    7. 执行sql,接收返回的结果
    8. 处理结果
    9. 释放资源
    1. 可以防止SQL的注入
    2. 效率更高
JDBC控制事务
  • 事务:一个包含多个步骤的业务操作,如果这个业务被事务管理,则这个步骤要么同时成功,要么同时失败
  • 操作:
  1. 开启事务
    • 在sql执行前开启事务
  2. 提交事务
    • 当所有sql执行完,提交事务
  3. 回滚事务
    • 在catch中回滚事务
  • 使用Connect对象来管理事务
    		// 调用改方法,设置参数值为false,则开启事务
    		void setAutoCommit​(boolean autoCommit) 
    			将此连接的自动提交模式设置为给定状态。  
    		// 提交事务
    		void commit​() 
    			使上次提交/回滚之后所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。
    		//  回滚事务
    		void rollback​() 
    			撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。
  • 例:JDBC抽取工具类 ——>练习——>2
练习
  • 表添加一条记录

        // account 表添加一条记录
        Statement statement=null;
        Connection con=null;
        try {
            // 2.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 3.定义sql
            String sql="insert into account(name,money) values('wangwu',3700)";
            // 4.获取Connection对象
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2","root","root");
            // 5.获取执行sql的Statement对象
            statement = con.createStatement();
            // 6.执行sql
            int count = statement.executeUpdate(sql);
            System.out.println(count);
    
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (con!=null){
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
  • 表修改一条记录

            // account表修改数据
            Connection connection=null;
            Statement statement=null;
            try {
                // 2.注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 3.获取连接对象
                connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
                // 4.创建sql语句
                String sql="update account set money=2000 where id=3";
                // 5.获取执行sql语句的对象
                statement = connection.createStatement();
                // 6.执行sql语句
                int count = statement.executeUpdate(sql);
                System.out.println(count);
    
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(statement !=null){
                    try {
                        statement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }if(connection !=null){
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
  • 表修改一条记录

            // account表删除一条记录
            Connection connection=null;
            Statement statement=null;
            try {
                // 2.注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 3.获取连接对象
                connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
                // 4.创建sql语句
                String sql="delete from account where id=3";
                // 5.获取执行sql语句的对象
                statement = connection.createStatement();
                // 6.执行sql语句
                int count = statement.executeUpdate(sql);
                System.out.println(count); 
    
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(statement !=null){
                    try {
                        statement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }if(connection !=null){
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
  • 创建一张表

            // 创建一张表,stu
            Connection connection=null;
            Statement statement=null;
            try {
                // 2.注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 3.获取连接对象
                connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
                // 4.创建sql语句
                String sql="create table stu(id int,name varchar(20))";
                // 5.获取执行sql语句的对象
                statement = connection.createStatement();
                // 6.执行sql语句
                int count = statement.executeUpdate(sql);
                System.out.println(count); // 0
    
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(statement !=null){
                    try {
                        statement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(connection !=null){
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
    
  • 定义一个方法,查询表的数据并将其封装为对象,然后装载集合,返回

    //对应封装account表数据的java类
    public class Account {
        private int id;
        private String name;
        private double money;
    
        public Account(int id, String name, double money) {
            this.id = id;
            this.name = name;
            this.money = money;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public double getMoney() {
            return money;
        }
    
        public void setMoney(double money) {
            this.money = money;
        }
    
        @Override
        public String toString() {
            return "Account{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", money=" + money +
                    '}';
        }
    }
        public static void main(String[] args) {
            List<Account> all = findAll();
            System.out.println(all);
        }
        public static List<Account> findAll(){
           /* 查询所有Account对象*/
            Connection connection=null;
            Statement statement =null;
            ArrayList<Account> accounts = new ArrayList<>();
            ResultSet resultSet=null;
            try {
                // 1.注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 2.获取连接
                connection = DriverManager.getConnection("jdbc:mysql:///db2", "root", "root");
                // 3.定义sql语句
                String sql="select * from account";
                // 4.获取执行sql的对象
                statement = connection.createStatement();
                // 5.执行sql语句
                resultSet = statement.executeQuery(sql);
                // 6.遍历结果集,封装对象,装载
                
                while (resultSet.next()){
                    int id=resultSet.getInt(1);
                    String name=resultSet.getString(2);
                    double money=resultSet.getDouble(3);
                    accounts.add(new Account(id,name,money));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(resultSet!=null){
                    try {
                        resultSet.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(statement!=null){
                    try {
                        statement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(connection!=null){
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
            return accounts;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值