zoukankan      html  css  js  c++  java
  • JDBC

    JDBC:
        1. 概念:Java DataBase Connectivity  Java 数据库连接, Java语言操作数据库
            * JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

        2. 快速入门:
            * 步骤:
                1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
                2. 注册驱动
                3. 获取数据库连接对象 Connection
                4. 定义sql
                5. 获取执行sql语句的对象 Statement
                6. 执行sql,接受返回结果
                7. 处理结果
                8. 释放资源

            * 代码实现:
                  //1. 导入驱动jar包
                //2.注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                //3.获取数据库连接对象
                Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
                //4.定义sql语句
                String sql = "update account set balance = 500 where id = 1";
                //5.获取执行sql的对象 Statement
                Statement stmt = conn.createStatement();
                //6.执行sql
                int count = stmt.executeUpdate(sql);
                //7.处理结果
                System.out.println(count);
                //8.释放资源
                stmt.close();
                conn.close();

     详解各个对象:
            1. DriverManager:驱动管理对象
                * 功能:
                    1. 注册驱动:告诉程序该使用哪一个数据库驱动jar
                        static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。
                        写代码使用:  Class.forName("com.mysql.jdbc.Driver");
                        通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
                         static {
                                try {
                                    java.sql.DriverManager.registerDriver(new Driver());
                                } catch (SQLException E) {
                                    throw new RuntimeException("Can't register driver!");
                                }
                            }

                        注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。
                    2. 获取数据库连接:
                        * 方法:static Connection getConnection(String url, String user, String password)
                        * 参数:
                            * url:指定连接的路径
                                * 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
                                * 例子:jdbc:mysql://localhost:3306/db3
                                * 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
                            * user:用户名
                            * password:密码
            2. Connection:数据库连接对象
                1. 功能:
                    1. 获取执行sql 的对象
                        * Statement createStatement()
                        * PreparedStatement prepareStatement(String sql)  
                    2. 管理事务:
                        * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
                        * 提交事务:commit()
                        * 回滚事务:rollback()
            3. Statement:执行sql的对象
                1. 执行sql
                    1. boolean execute(String sql) :可以执行任意的sql 了解
                    2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
                        * 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
                    3. ResultSet executeQuery(String sql)  :执行DQL(select)语句

      4. ResultSet:结果集对象,封装查询结果
                * boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
                * getXxx(参数):获取数据
                    * Xxx:代表数据类型   如: int getInt() ,    String getString()
                    * 参数:
                        1. int:代表列的编号,从1开始   如: getString(1)
                        2. String:代表列名称。 如: getDouble("balance")
            5. PreparedStatement:执行sql的对象
                1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
                    1. 输入用户随便,输入密码:a' or 'a' = 'a
                    2. sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'

                2. 解决sql注入问题:使用PreparedStatement对象来解决
                3. 预编译的SQL:参数使用?作为占位符
                4. 步骤:
                    1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
                    2. 注册驱动
                    3. 获取数据库连接对象 Connection
                    4. 定义sql
                        * 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
                    5. 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql)
                    6. 给?赋值:
                        * 方法: setXxx(参数1,参数2)
                            * 参数1:?的位置编号 从1 开始
                            * 参数2:?的值
                    7. 执行sql,接受返回结果,不需要传递sql语句
                    8. 处理结果
                    9. 释放资源

                5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
                    1. 可以防止SQL注入
                    2. 效率更高

    account表 添加一条记录

     1 Statement stmt = null;
     2                     Connection conn = null;
     3                     try {
     4                         //1. 注册驱动
     5                         Class.forName("com.mysql.jdbc.Driver");
     6                         //2. 定义sql
     7                         String sql = "insert into account values(null,'王五',3000)";
     8                         //3.获取Connection对象
     9                         conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
    10                         //4.获取执行sql的对象 Statement
    11                         stmt = conn.createStatement();
    12                         //5.执行sql
    13                         int count = stmt.executeUpdate(sql);//影响的行数
    14                         //6.处理结果
    15                         System.out.println(count);
    16                         if(count > 0){
    17                             System.out.println("添加成功!");
    18                         }else{
    19                             System.out.println("添加失败!");
    20                         }
    21             
    22                     } catch (ClassNotFoundException e) {
    23                         e.printStackTrace();
    24                     } catch (SQLException e) {
    25                         e.printStackTrace();
    26                     }finally {
    27                         //stmt.close();
    28                         //7. 释放资源
    29                         //避免空指针异常
    30                         if(stmt != null){
    31                             try {
    32                                 stmt.close();
    33                             } catch (SQLException e) {
    34                                 e.printStackTrace();
    35                             }
    36                         }
    37             
    38                         if(conn != null){
    39                             try {
    40                                 conn.close();
    41                             } catch (SQLException e) {
    42                                 e.printStackTrace();
    43                             }
    44                         }
    45                     }

    JDBC控制事务:
        1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
        2. 操作:
            1. 开启事务
            2. 提交事务
            3. 回滚事务
        3. 使用Connection对象来管理事务
            * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
                * 在执行sql之前开启事务
            * 提交事务:commit()
                * 当所有sql都执行完提交事务
            * 回滚事务:rollback()
                * 在catch中回滚事务

     1 public class JDBCDemo10 {
     2 
     3             public static void main(String[] args) {
     4                 Connection conn = null;
     5                 PreparedStatement pstmt1 = null;
     6                 PreparedStatement pstmt2 = null;
     7         
     8                 try {
     9                     //1.获取连接
    10                     conn = JDBCUtils.getConnection();
    11                     //开启事务
    12                     conn.setAutoCommit(false);
    13         
    14                     //2.定义sql
    15                     //2.1 张三 - 500
    16                     String sql1 = "update account set balance = balance - ? where id = ?";
    17                     //2.2 李四 + 500
    18                     String sql2 = "update account set balance = balance + ? where id = ?";
    19                     //3.获取执行sql对象
    20                     pstmt1 = conn.prepareStatement(sql1);
    21                     pstmt2 = conn.prepareStatement(sql2);
    22                     //4. 设置参数
    23                     pstmt1.setDouble(1,500);
    24                     pstmt1.setInt(2,1);
    25         
    26                     pstmt2.setDouble(1,500);
    27                     pstmt2.setInt(2,2);
    28                     //5.执行sql
    29                     pstmt1.executeUpdate();
    30                     // 手动制造异常
    31                     int i = 3/0;
    32         
    33                     pstmt2.executeUpdate();
    34                     //提交事务
    35                     conn.commit();
    36                 } catch (Exception e) {
    37                     //事务回滚
    38                     try {
    39                         if(conn != null) {
    40                             conn.rollback();
    41                         }
    42                     } catch (SQLException e1) {
    43                         e1.printStackTrace();
    44                     }
    45                     e.printStackTrace();
    46                 }finally {
    47                     JDBCUtils.close(pstmt1,conn);
    48                     JDBCUtils.close(pstmt2,null);
    49                 }
    50         
    51         
    52             }
    53         
    54         }
  • 相关阅读:
    Python爬取中国疫情的实时数据
    文件上传
    条件查询和分页(第三周)
    全国疫情可视化图表
    Jquery的Ajax技术(第二周)
    软件工程开课博客
    求一个整数数组、环形数组中最大子数组的和
    今日所学—Android中ViewPager的使用
    今日所学—Android中ExpandableListView的使用
    你看,蚂蚁金服都上市了,程序员什么时候才能财富自由呢?
  • 原文地址:https://www.cnblogs.com/lsymove/p/11278687.html
Copyright © 2011-2022 走看看