您的位置:澳门新葡8455最新网站 > 数据库管理 > 让我们来谈谈JDBC

让我们来谈谈JDBC

发布时间:2019-10-13 20:54编辑:数据库管理浏览(179)

    JDBC的简约介绍

    1.JDBC

    概念

    • JDBC : Java Database Connectivity,java连接数据库,使用Java操作数据库的技术。
    • 真相 : 其实便是sun企业定义的一套操作全部关系型数据库的法则,即接口。
      逐个数据库商家去完结那套接口,提供数据库操作驱动jar包,我们得以行使那套
      接口进行(JDBC)编制程序,真正实行的代码是驱动jar包的兑现类。

        1)JDBC简介

    高速入门

    本身使用的是jdk10和mysql-connector-java-5.1.45-bin.jar。

    步骤:

    1. 导入驱动jar包
      • 花色根目录创设文件夹libs。
      • 将mysql-connector-java-5.1.45-bin.jar复制到libs目录下
      • 右击libs下,Add as Library将jar包导入项目中
    2. 注册驱动
    3. 收获数据库连接对象(Collection)
    4. 定义sql
    5. 得到实行sql语句的靶子 Statement
    6. 试行sql,接受重返结果(ResultSet)
    7. 管理结果
    8. 释放财富

       // 2. 注册驱动
       Class.forName("com.mysql.jdbc.Driver");
       // 3. 获取连接对象Collection
       Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "nrblwbb7");
       // 4. 定义sql
       String sql = "UPDATE STUDENT SET AGE = 23 WHERE NAME = '王智'";
       // 5. 获取执行sql语句的对象 Statement
       Statement statement = conn.createStatement();
       // 6. 执行sql,接受返回结果(ResultSet)
       int result = statement.executeUpdate(sql);
       // 7. 处理结果
       System.out.println(result);
       // 8. 释放资源
       statement.close();
       conn.close();
      

            - JDBC正是Java中年天命之年是数据库格局

    详解各类对象

    1. DriverManager:驱动管理对象
    2. Connection:数据库连接对象
    3. Statement:执行sql对象
    4. ResultSet:结果集对象
    5. PreparedStatement :执行sql对象

            - 大家能够经过JDBC来举办SQL语句。

    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/db
          • 细节:假使连接的是本机mysql服务器,况兼mysql服务私下认可端口是3306,则url能够简写为:jdbc:mysql:///数据库名称
          • jdbc是连接数据库的情商,mysql是连连mysql数据库的子左券
        • user:用户名
        • password:密码

     

    Collection连接对象

    功能:

    1. 赢得实施sql的对象
      • Statement createStatement()
      • PreparedStatement prepareStatement(String sql)
    2. 治才具务
      • 张开事务:setAutoCommit(boolean autoCommit) :调用该措施设置参数为false,即展开事务
      • 交由业务:commit()
      • 回滚事务:rollback()

        2)获取数据库连接

    Statement试行静态sql对象

    功能:

    1. 执行sql
      • boolean execute(String sql) :能够实践自便的sql (领会)
      • int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
        • 重回值:影响的行数,能够经过那个影响的行数决断DML语句是或不是执行成功 重临值>0的则推行成功,反之,则失败。
      • ResultSet executeQuery(String sql) :执行DQL(select)语句

    布置举个例子:

     public static void main(String[] args) {
            Connection conn = null;
            Statement stmt = null;
            try {
                // 1. 加载驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 2. 获取连接对象
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3?useSSL=true", "root", "nrblwbb7");
                // 3. 创建sql
                String sql = "INSERT INTO ACCOUNT VALUES (NULL,'网址',2000)";
                // 4. 获取执行sql对象
                stmt = conn.createStatement();
                // 5. 执行sql
                int count = stmt.executeUpdate(sql);
                // 6. 处理结果
                System.out.println("影响的行数为:" + count);
                if(count > 0){
                    System.out.println("插入成功");
                }else{
                    System.out.println("操作失败");
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                // 7. 释放资源
                if(stmt != null){
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(conn != null){
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
    
            }
      }
    

    修改例如:

     public static void main(String[] args) {
            /**
             * 由于Connection和Statement实现了AutoCloseable接口,所以可以使用自动关闭
             */
            try(
                    // 2.获取Connection对象
                    Connection conn = DriverManager.getConnection(
                            "jdbc:mysql://localhost:3306/db3?useSSL=true",
                            "root",
                            "nrblwbb7") ;
                    // 3. 获取Statement对象
                    Statement stmt = conn.createStatement()
                    ){
                // 1.加载驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 4. 创建sql
                String sql = "UPDATE ACCOUNT SET BALANCE = 1500 WHERE NAME = '网址'";
                // 5. 执行sql
                int count = stmt.executeUpdate(sql);
                // 6. 处理结果
                System.out.println(count);
                if(count > 0){
                    System.out.println("修改成功");
                }else{
                    System.out.println("操作失败或者记录未更改");
                }
                // 7. 关闭连接,由于try..with..resource会自动关闭,所以无须担心
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    

    除去比如:

     public static void main(String[] args) {
            /**
             * 由于Connection和Statement实现了AutoCloseable接口,所以可以使用自动关闭
             */
            try(
                    // 2.获取Connection对象
                    Connection conn = DriverManager.getConnection(
                            "jdbc:mysql://localhost:3306/db3?useSSL=true",
                            "root",
                            "nrblwbb7") ;
                    // 3. 获取Statement对象
                    Statement stmt = conn.createStatement()
                    ){
                // 1.加载驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 4. 创建sql
                String sql = "DELETE FROM ACCOUNT WHERE NAME = '网址'";
                // 5. 执行sql
                int count = stmt.executeUpdate(sql);
                // 6. 处理结果
                System.out.println(count);
                if(count > 0){
                    System.out.println("删除成功");
                }else{
                    System.out.println("删除失败");
                }
                // 7. 关闭连接,由于try..with..resource会自动关闭,所以无须担心
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    

    图片 1

    ResultSet:结果及对象,封装查询结果

    功能:

    1. 打包查询结果:
      • boolean next(): 游标向下移动一行,判别当前行是不是是最终一行最后(是不是有多少),倘诺是,则赶回false,若是或不是则赶回true
      • getXxx(参数):获取数据
        • Xxx:代表数据类型 如: int getInt() , String getString()
        • 参数:
          1. int:代表列的编号,从1最初 如: getString(1)
          2. String:代表列名称。 如: getDouble("balance")
      • 注意:
        • 行使手续:
          1. 游标向下活动一行
          2. 剖断是不是有数据
          3. 获取数据

    举个大概例子:

     @Test
        public void selectDemo(){
            try {
                // 1.加载驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 2.创建sql语句
                String sql = "select * from account";
                try(
                        // 3.获取连接对象
                        Connection conn = DriverManager.getConnection(
                                "jdbc:mysql://localhost:3306/db3?useSSL=true",
                                "root",
                                "root");
                        // 4.获取执行sql语句对象
                        Statement stmt = conn.createStatement()
                ){
                    // 5.执行sql
                    ResultSet rs = stmt.executeQuery(sql);
                    // 6.处理结果集
                    while(rs.next()){
                        // 获取id
                        int id = rs.getInt("id");
                        // 获取姓名
                        String name = rs.getString("name");
                        // 获取账户余额
                        double balance = rs.getDouble("balance");
                        // 正确的处理应该是封装为对象,进行处理,这就简单展示下
                        System.out.println("id = " + id + ", name = " + name + ", balance = " + balance);
                    }
    
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
        }
    

     

    PreparedStatement:施行动态sql的目的

    功能:

    1. 进行动态的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.45-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. 频率更加高

      - java.sql.Connection 数据库连接

    打包工具类

    src下db.properties的信息:

    # 驱动
    driver=com.mysql.jdbc.Driver
    # url
    url=jdbc:mysql://127.0.0.1:3306/db3?useSSL=true
    # 用户
    username=root
    # 密码
    password=root
    

    装进的工具类如下:

    public class JDBCUtils {
    
        private static String driver;
        private static String url;
        private static String username;
        private static String password;
    
        static{
            try {
                // 读取配置文件
                InputStream inputStream = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
                Properties pro = new Properties();
                pro.load(inputStream);
                // 静态变量赋值
                driver = pro.getProperty("driver");
                url = pro.getProperty("url");
                username = pro.getProperty("username");
                password = pro.getProperty("password");
                // 注册驱动
                Class.forName(driver);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取连接对象
         * @return 返回连接对象
         */
        public static Connection getConn() throws SQLException {
            return DriverManager.getConnection(url,username,password);
        }
    
        /**
         * 关闭资源
         * @param stmt
         * @param conn
         */
        public static void close(Statement stmt,Connection conn){
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 关闭资源
         * @param rs
         * @param stmt
         * @param conn
         */
        public static void close(ResultSet rs, Statement stmt, Connection conn){
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
    

            - 大家对数据库的任何操作都以从获取Connection最初

    事务管理

    1. 政工:三个分包四个步骤的事情操作。假诺那些专门的职业操作被事务处理,则那多个步骤要么同一时候打响,要么同期失败。
    2. 操作:
      1. 拉开事务
      2. 付给业务
      3. 回滚事务
    3. 动用Connection对象来保管事务

      • 开启事务:setAutoCommit(boolean autoCommit) :调用该措施设置参数为false,即张开事务
        • 在施行sql此前开启事务
      • 付给业务:commit()
        • 当有着sql都实行完提交业务
      • 回滚事务:rollback()
        • 在catch中回滚事务

      测试:

       public static void main(String[] args) {
           Connection conn = null;
           PreparedStatement pstmt1 = null;
           PreparedStatement pstmt2 = null;
           try {
               // 1.创建sql,转账的sql
               String sql1 = "UPDATE ACCOUNT SET BALANCE = BALANCE - ? WHERE ID = ?";
               String sql2 = "UPDATE ACCOUNT SET BALANCE = BALANCE + ? WHERE ID = ?";
               // 2.获取连接对象
               conn = JDBCUtils.getConn();
      
               // 开启事务
               conn.setAutoCommit(false);
      
               // 3.获取执行sql对象,进行预编译
               pstmt1 = conn.prepareStatement(sql1);
               pstmt2 = conn.prepareStatement(sql2);
               // 4.替换占位符
               pstmt1.setDouble(1,500);
               pstmt1.setInt(2,1);
               pstmt2.setDouble(1,500);
               pstmt2.setInt(2,2);
               // 5.执行sql
               pstmt1.executeUpdate();
               // int i = 3 / 0;
               pstmt2.executeUpdate();
      
               // 提交事务
               conn.commit();
           } catch (Exception e) {
               if(conn != null) {
                   try {
                       // 事务回滚
                       conn.rollback();
                   } catch (SQLException e1) {
                       e1.printStackTrace();
                   }
               }
               e.printStackTrace();
           } finally {
               JDBCUtils.close(pstmt1,conn);
               JDBCUtils.close(pstmt2,null);
           }
       }
      

            - 获取数据库连接的多个参数:

                1.数据库的地址 url

                    语法:jdbc:子公约:商家内容

                    MySQl的格式:jdbc:mysql://主机名:端口号/数据库名字

                    例子:jdbc:mysql://localhost:3306/test

     

                2.客商名 user 连接数据库使用的顾客名

                3.密码 password 数据库的密码

                4.数据库驱动全类名 driverClass

     

            - 基本步骤:

                1.导入数据库驱动的jar包

                    mysql-connector-java-5.1.37-bin.jar

                2.预备多个参数

                    - url

                    - user

                    - password

                    - driverClass

                3.加载数据库驱动

                    Class.forName(driverClass)

                4.通过DriverManager来获取数据库连接   

                    static Connection getConnection(String url, String user, String password)

     

            - 问题:

                - 在JDBC的代码中有如下一行代码:

                    Class.forName("com.mysql.jdbc.Driver");

                    - 我们开掘那行代码和任何的代码未有上下文关系,正是不写她编写翻译也不会出错。

                        何况,那行代码不写也好使,那是干什么吧?

                        - Class.forName() 主假若将三个类加载进的虚拟机。

                        - 通过阅览mysql的Driver的源码,开采类中有多个静态代码块:

                            static {

                                try {

                                    java.sql.DriverManager.registerDriver(new Driver());

                                } catch (SQLException E) {

                                    throw new RuntimeException("Can't register driver!");

                                }

                            }

                        - 静态代码块会在类被加载进设想机时就能试行,也正是当大家调用          Class.forName("com.mysql.jdbc.Driver");

                            以往,该静态代码块会立时试行。

                            而静态代码块中,有如下代码:

                                java.sql.DriverManager.registerDriver(new Driver());

                            那一个代码会将数据库驱动注册进DriverManager中。

     

                        - 不过大家以此东西不写也好使,因为在JDBC4未来,程序会自行加载数据库驱动。

                        - 就算是那样,可是大家渴求这行代码必需写。越发是在web工程,更是必需写。   

     

     

            - 核心类:

                - java.sql.DriverManager

                    - 数据库驱动的管理器,肩负加载数据库的驱动获取数据库连接

                    - static Connection getConnection(String url, String user, String password) 

                        - getConnection方法用来经过url地址,顾客名,密码等参数来收获数据库连接的

     

                - java.sql.Connection

                    - 数据库连接

                    - Statement createStatement() 

                        - 创制一个Statement对象,通过Statement对象来推行SQL语句

     

                - java.sql.Statement

                    - SQL语句的试行器

                        - boolean execute(String sql) 

                            - 试行一条SQL语句,并再次来到三个布尔值,试行成功再次来到true,施行停业重临false。用的相当少

                        - ResultSet executeQuery(String sql) 

                            - 推行查询的SQL语句,并再次回到一个结果集

                        - int executeUpdate(String sql) 

                            - 实践修改数据的SQL语句(增加和删除改),并赶回受影响的行数

     

                - java.sql.ResultSet

                    - 查询到的多寡的结果集,大家透过JDBC查询数据库得到的数据,都封装在ResultSet中

                    - boolean next() 

                        - 调整光标向下移动一行,假若光标当前职分是afterLast则赶回false,告诉您十分的少了,就别读了。

                            要是光标移动今后,未有在afterLast则赶回true,能够读取数据。

     

                    - 在ResultSet有很多getXxx(int),比如getString(),getInt(),getByte()。

                        通过那个方法能够读取当前行的数量,它们供给一个int值作为参数,

                            int指的是读取数据的列数。

                        列数是从1起来的。

     

                    - 在ResultSet中还也可以有不少getXxx(String),它和上边的艺术的功效同样,

                        只可是它们须求的都是String类型的参数,参数代表的是当前的列名,

                            举个例子:大家要获得id的值

                                getInt("id")

                            要获取name的值

                                getString("name")

                        注意:假如查询的SQL使用了别名,则列名以别名称为准。

     

        3)数据的增删改

            //创设一个SQL推行器

            Statement stat = conn.createStatement();

     

            //创造二个SQL语句

            String sql = "INSERT INTO t_stu(`name` , age) VALUES('沙僧',28)";

     

            //执行SQL语句

            //executeUpdate用来推行一条修改SQL的口舌

     

            //它需求二个String类型sql作为参数,并会再次回到一个int型的值,该值表示SQL语句实施未来影响到的行数

            int count = stat.executeUpdate(sql);

     

        4)数据的询问

            //创建Statement对象

            Statement stmt = conn.createStatement();

            //创制贰个SQL语句

            String sql = "SELECT id, name sname, age FROM t_stu WHERE id=2";

            //施行查询

            ResultSet rs = stmt.executeQuery(sql);

            //调整光标下移一行

            //要是当前行有数量,则读取

            if(rs.next()){

     

                //获取id,name,age

                int id = rs.getInt("id");

                String name = rs.getString("sname");

                int age = rs.getInt("age");

     

                System.out.println(id+"--"+name+"--"+age);

            }

     

            > 查询操作和修改的尤为重要分歧的是,查询使用executeQuery(),

                它会再次回到ResultSet结果集,我们须要对结果集进行读取。

     

            > 当大家只须求读取贰个数码时,用if。

                当需求读取全体数据时,用while

     

            > 代码的行业内部:

                - Connection、Statement、ResultSet,那些财富都是索要和数目构建连接的

                    那些能源大家并非总必要动用,当我们不适用这么些财富,要求将那几个财富关闭。

                - 关闭财富顺序:

                    从后往前关:

                        先关 ResultSet

                        在关 Statement

                        最后关 Connection

                - 示例代码:

                    //定义四个变量

                    Connection conn = null;

                    Statement stmt = null;

                    ResultSet rs = null;

     

                    try{

     

                    }catch(Exception e){

                        e.printStackTrace();

                    }finally{

     

                        if(rs!=null){

                            //关闭ResulSet

                            try {

                                rs.close();

                            } catch (SQLException e) {

                                // TODO Auto-generated catch block

                                e.printStackTrace();

                            }

                        }

     

                        if(stmt != null){

                            try {

                                stmt.close();

                            } catch (SQLException e) {

                                e.printStackTrace();

                            }

                        }

     

                        if(conn != null){

                            try {

                                conn.close();

                            } catch (SQLException e) {

                                e.printStackTrace();

                            }

                        }

     

                    }

     

    图片 2

     

     

    2.JDBC

        1) SQL注入

            > 近日大家的施用的是Statement来进行SQL语句

                而大家传递的参数时通过拼接字符串的款型增加进SQL语句

            > "SELECT * FROM t_user WHERE username='"+username+"' AND password='"+password+"'"   

            > 这种样式假使平常客户的拜会,难题十分的小,不过一旦出现恶心的客商,

                他纵然传递了如此一组参数 客商名 : a' OSportage 'a'='a  密码:a' O奥迪Q5 'a'='a

            > 那八个参数假使拼接进SQL语句,SQL语句会形成如下的气象:

                "SELECT * FROM t_user WHERE username='a' OR 'a'='a' AND password='a' OR 'a'='a'"   

            > 通过这种新鲜的参数,导致大家SQL语句的语义完全改变,那样正是顾客名和密码不得法也得以登陆

                那样就对我们的网址带来非常大的安全隐患

            > 解决:

                1.在客商输入时展开表达,验证客户名中是或不是满含特殊字符 ' " 等等

                2.倘诺大家平素接纳Statement则永世都会有SQL注入的祸患,所以最好施工方案是不选取Statement

                    而是选取PreparedStatement

     

        2) PreparedStatement

            > java.sql.PreparedStatement --> 预编写翻译的Statement

            > PreparedStatement是Statement的子接口,使用方法和Statement类似,可是它在Statement做了一部分恢弘。

            > 获取PreparedStatement是经过Connection的prepareStatement()的艺术获得的,这么些办法必要传贰个SQL语句,

                当大家透过SQL语句获取七个PreparedStatement时,JDBC会将SQL语句头阵送给MySQL,

                    让我们的数据库对SQL语句实行预编写翻译操作。

            > 使用PreparedStatement的好处:

                1.PreparedStatement采纳占位符来替换SQL语句中的变量,更利于编写和读书,维护起来更为的简短。

                2.MySQL在施行一条SQL语句时,要分多个步骤:

                    1) 编写翻译SQL语句,检查SQL语句是不是有语法错误

                    2) 执行SQL语句

                    使用Statement时,每回都亟待开展这多少个步骤,而MySQL能够对已经编写翻译过的说话实行缓存,

                        使用PreparedStatement,推行三遍之后,会对SQL语句进行缓存,下一次重新施行时功能越来越高。

                    那一个优点显示的不明朗。

                3.选拔PreparedStatement时SQL语句会付出MySQL举行预编写翻译,预编写翻译的历程MySQL会将SQL语句,

                    调换为三个像样于Java中艺术的东西,而作者辈的那么些填充的占位符,会以艺术的参数的款型发送给MySQL

                  那样正是传递在意外的参数,也不能够更动SQL语义,所以它实用的制止了SQL注入的标题。

     

            > 所以我们实在的应用中相对无法运用Statement而是使用PreparedStatement

     

        3) 大数据

            - 十分的大的数量

            - 大数据重要分两种:

                1.大文本数据

                2.大的字节数据

            - mysql对文本的分寸有限量,也正是超出一定的分寸未来,文件将无法插入进数据库,插入时会抛出非常

            - 大家得以修改mysql对文本的大小的界定,修改my.ini文件

                在my.ini文件中增加如下配置

                    max_allowed_packet = 10M

     

        4) 批处理(batch)

            - 批管理指的是二回操作中试行多条SQL语句

            - 批管理比较于壹回一遍实行作用会增高广大

            - 批管理重若是分两步:

                1.就要推行的SQL语句保存

                2.执行SQL语句

            - Statement和PreparedStatement都援助批管理操作,这里大家只须求领悟PreparedStatement的批管理方式:

                - 方法:

                    void addBatch()

                        - 将在实践的SQL先保存起来,先不施行

                        - 那个办法在设置完全数的占位符之后调用

                    int[] executeBatch()

                        - 这一个艺术用来实践SQL语句,那几个方法会将批管理中保有SQL语句实践

     

            - mysql暗中同意批管理是关门的,所以大家还亟需去开辟mysql的批处理:

                    rewriteBatchedStatements=true

                我们要求将上述的参数增多到mysql的url地址中

     

            - 注意:低版本的mysql-jdbc驱动也不扶持批管理

     

        5) 事务(Transaction)

            - 在付出中大家的四个政工往往须要相同的时间操作八个表,那么些操作往往是不可分割,业务中的对数据库的一再操作,

                要么同有的时候间打响,要么全都退步。

            - 注意:大家在同三个业务中使用的数据库连接(Connection)必得是同二个。   

     

            - 事务的个性(ACID):

                 原子性(atomicity)

                    二个事情是四个不可分割的劳作单位,事务中包罗的诸操作要么都做,要么都不做。

     

                一致性(consistency)

                    事务必需是使数据库从贰个一致性状态变到另三个一致性状态。一致性与原子性是全面相关的。

     

                隔离性(isolation)

                    八个业务的奉行无法被另外交事务情烦恼。

                        即一个作行业内部部的操作及应用的数目对出现的其他专门的工作是割裂的,并发实施的次第业务之间不能够相互郁闷。

     

                持久性(durability)

                    悠久性也称长久性(permanence),指四个事务一旦付出,它对数据库中数量的改换就活该是长久性的。

                        接下去的别的操作或故障不应有对其有别的影响。

     

            - 操作专业的主题步骤:

                1.拉开事务

                    - 开启事务现在,大家只后的具有操作将都会在同三个作业个中

                2.操作数据库

                    - 开启事务今后再去操作数据库,全数操作将不会一贯付出到数据库中

                3.交由业务

                    - 将修改应用到数据库

                4.回滚事务

                    - 数据库操作进度中出现卓殊了,回滚事务,回滚事务以后,数据库形成开启事务以前的情况

     

            - mysql中的事务调节

                #敞开事务

                START TRANSACTION

     

                #回滚事务

                ROLLBACK

     

                #交给业务

                COMMIT

     

            - JDBC中的事务首要透过Connection对象来调节的

                1.拉开事务

                    void setAutoCommit(boolean autoCommit) throws SQLException;

                    - 设置职业是或不是自动提交,暗中认可是机动提交

                    - 设置工作手动提交

                        conn.setAutoCommit(false);

     

                2.提交业务

                    void commit() throws SQLException;

                    - 提交业务

                    conn.commit()

     

                3.回滚事务

                    void rollback() throws SQLException;

                    - 回滚事务

                    conn.rollback()

     

            - 事务调节的格式:

                //创建叁个Connection

                Connection conn = null;

     

                try{

     

                    //获取Connection

                    conn = JDBCUtils.getConnection();

     

                    //开启事务

                    conn.setAutoCommit(false);

     

                    //对数据库进行操作

     

                    //操作成功,提交业务

                    conn.commit();

     

                }catch(Exception e){

                    e.printStackTrace();

     

                    //回滚事务

                    try {

                        conn.rollback();

                    } catch (SQLException e1) {

                        e1.printStackTrace();

                    }

     

                }finally{

                    JDBCUtils.close(conn, null, null);

                }

     

        6) 数据库连接池

            > 数据库连接池便是贮存数据库连接(Connection)的会面

            > 大家获得一个数据库连接是一个绝对很艰难的经过,

                假诺我们获得四个数据库连接,使用贰遍之后就给它停业了

                    下一遍再去行使的时候将要重新创立二个新的数据库连接。

            > 所以大家提议了一个数据库连接池的定义,数据库连接池放的都是数据库连接(Connection)

                大家在去行使数据库连接时候,不用再去重新成立数据库连接,而是径直从池中拿走,

                    使用完的数据库连接,亦非直接销毁,而是要放回到连接池。

            > 数据库连接池的大规模的品质:

     

                    初始连接数量:数据连接池创制未来,保存数据库连接的多少

     

                    最小空闲连接数:数据库连接池起码得未利用的数据库连接的数目

     

                    最大空闲连接数:数据库连接池最大闲置连接数,当闲置连接数满了后头,将不会有任何总是踏向池

     

                    每回扩展连接数:当数据库连接都被占用以往,三次性扩充的数据库连接的个数

     

                    最阿比让接数:数据库连接池的最大容积,当最罗安达接数饱和了,则不再次创下设新的数据库连接

     

                    最大等待时间:当数据库连接池饱和之后,等待获取数据库连接的时光

     

            > 常见的数据库连接池

                - 全体的数据库连接池都必要实现DataSource,当使用数据库连接池时,大家便不再必要选取DriverManger获取数据库连接

                    而是利用DataSource。

                     - Connection getConnection()

                        - 从数据库连接池中猎取数据库连接对象

     

                1.DBCP

                    - DBCP是Apache出品的一款数据库连接

                    - DBCP依赖于commons-pool

                    - 使用DBCP供给导入两个jar包:

                        commons-dbcp-1.4.jar

                        commons-pool-1.5.5.jar

                    - 当大家透过数据库连接池获取数据库连接以后,大家所获得到数据库连接已经不是大家耳濡目染的不行Connection

                        数据库连接池对Connection对象开展了包装,它修改Connection的close()方法,

                            再去调用close()数据库连接将不会真的关闭,而是要放回到数据库连接池中,供别的线程使用。

                    - 核心类:

                        BasicDataSourceFactory

     

                2.C3P0(重点)

                    - C3P0利用的是XML作为配置文件

                    - 使用c3p0须求导入二个jar包:

                        c3p0-0.9.1.2.jar

                    - 导入c3p0的安插文件:

                        1.配备文件的名字:c3p0-cofig.xml

                        2.安排文件须要放到类路线下(src)

                    - 核心类:   

                        ComboPooledDataSource

                    - 注意:

                        DataSource就也正是池子,我们的数据库连接都以从DataSource中拿到的,

                            若是程序中有多个DataSource的实例,那么大家说你还比不上不用数据库连接池。

                        所以我们的DataSource在类型中应当独有三个实例。   

     

     

     

    转发请评释出处!

    感激您的读书。借使作品对你有用,那么请轻轻点个赞,以资激励。

     

     

     

    本文由澳门新葡8455最新网站发布于数据库管理,转载请注明出处:让我们来谈谈JDBC

    关键词:

上一篇:读书笔记4,存储过程和用户权限

下一篇:没有了