让我们来谈谈JDBC

图片 2

让我们来谈谈JDBC

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’ OENVISION ‘a’=’a  密码:a’ O大切诺基 ‘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卡塔 尔(英语:State of Qatar)

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

               
使用完的数据库连接,亦非一向接发卖毁,而是要放回到连接池。

        >
数据库连接池的普及的品质:

 

               
早先连接数量:数据连接池创设以往,保存数据库连接的多少

 

               
最小空闲连接数:数据库连接池起码得未选取的数据库连接的数码

 

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

 

               
每一次扩张连接数:当数据库连接都被占有未来,三回性扩张的数据库连接的个数

 

               
最浦那接数:数据库连接池的最大体积,当最利兹接数饱和了,则不再次创下制新的数据库连接

 

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

 

        > 不乏先例的数据库连接池

            –
全体的数据库连接池都亟需落到实处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在类型中应当只有叁个实例。   

 

 

 

转发请表明出处!

谢谢您的开卷。假设文章对您有用,那么请轻轻点个赞,以资鼓劲。

 

 

 

admin

网站地图xml地图