java深入探究07-jdbc上

1.连接数据库三种方式

//连接数据库的URL
    private String url = "jdbc:mysql://localhost:3306/day17";
                        // jdbc协议:数据库子协议:主机:端口/连接的数据库   //

    private String user = "root";//用户名
    private String password = "root";//密码
方法一:创建驱动程序对象
//1.创建驱动程序类对象
        Driver driver = new com.mysql.jdbc.Driver(); //新版本
        //Driver driver = new org.gjt.mm.mysql.Driver(); //旧版本
        
        //设置用户名和密码
        Properties props = new Properties();
        props.setProperty("user", user);
        props.setProperty("password", password);
        
        //2.连接数据库,返回连接对象
        Connection conn = driver.connect(url, props);
View Code

方法二:使用驱动器类连接数据库(注册了2次没必要)

Driver driver = new com.mysql.jdbc.Driver();
        //Driver driver2 = new com.oracle.jdbc.Driver();
        //1.注册驱动程序(可以注册多个驱动程序)
        DriverManager.registerDriver(driver);
        //DriverManager.registerDriver(driver2);
        
        //2.连接到具体的数据库
        Connection conn = DriverManager.getConnection(url, user, password);
        System.out.println(conn);
View Code

方式三推荐:加载驱动程序

//通过得到字节码对象的方式加载静态代码块,从而注册驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        
        //Driver driver2 = new com.oracle.jdbc.Driver();
        //1.注册驱动程序(可以注册多个驱动程序)
        //DriverManager.registerDriver(driver);
        //DriverManager.registerDriver(driver2);
        
        //2.连接到具体的数据库
        Connection conn = DriverManager.getConnection(url, user, password);
        System.out.println(conn);
View Code
 

2.JDBC核心API

  java.sql.*和javax.sql

  1)Driver接口:java驱动程序接口,任何数据库厂商都要实现这个接口;

        这个接口里面有一个方法:connect(url,properties)

          url:jdbc协议:数据库子协议://主机:端口号/数据库

          user:数据库用户名

          password:数据库密码

  2)DriverManger类:管理驱动程序Driver的

        registerDriver(Driver):注册驱动程序,可以注册多个驱动程序对他们进行管理

        getConnection(url,user,password):获得连接对象

  3)Connection接口:表示java程序与数据库的连接对象

        CreateStatement();创建Stataement对象

        prepareStatement();创建PrepareStatement()对象

        prepareCall(String sql);创建CallableStatement对象

  4)Statement接口

        excuteUpdate():执行预编译存储过程sql语句

        executeQuery()   执行预编译的查询sql语句(DQL

        PrepareStatement接口:执行预编译

        CallableStatement接口:用于执行存储过程的sql语句(call xxx

        ResultSet executeQuery()   调用存储过程的方法

  5)ResultSet接口

        boolean next()  将光标移动到下一行

        getXX() : 获取列的值

3.预编译:PreparedStatement执行sql语句

    执行sql语句会预编译,sql中有参数,可以之后再添加

//2.准备预编译的sql
            String sql = "INSERT INTO student(NAME,gender) VALUES(?,?)"; //?表示一个参数的占位符
            
            //3.执行预编译sql语句(检查语法)
            stmt = conn.prepareStatement(sql);
            
            //4.设置参数值
            /**
             * 参数一: 参数位置  从1开始
             */
            stmt.setString(1, "李四");
            stmt.setString(2, "");
View Code

4.CallableStatement执行存储过程

1.sql
    String sql=conn.prepareCall(sql);
    //预编译
    stmt=conn.prepareCall(sql);
    //设置输入参数
    stmt.setInt(1,6);
    //设置输出参数(注册输出参数)
    stmt.registerOutParameter(2,java.sql.Type.varchar);
    //发送参数,执行
    stmt.executeQuery();
    //得到结果
    String result=stmt.getString(2);//getXX方法专门用于获取存储过程中的输出参数

5.事务;

  事务特性:原子性,一致性,隔离性,持久性

    原子性,是一个最小逻辑操作单元 !

    一致性,事务过程中,数据处于一致状态。

    持久性, 事务一旦提交成功,对数据的更改会反映到数据库中。

    隔离性, 事务与事务之间是隔离的。

  技术:setAutoCommit();设置是否自动提交事务

      commit();手动提交事务

      rollback();代码需要回退到开始前的状态

  例子:转账,这里可以设置回滚的到莫一位置,在第一次转账结束位置设置一个回滚点,要是在哪里就发生错误就回滚到指定的代码段

// 3. 转账,使用事务, 回滚到指定的代码段
    public void trans() {
        // 定义个标记
        Savepoint sp = null;
        
        // 第一次转账
        String sql_zs1 = "UPDATE account SET money=money-1000 WHERE accountName='张三';";
        String sql_ls1 = "UPDATE account SET money=money+1000 WHERE accountName='李四';";
        
        // 第二次转账
        String sql_zs2 = "UPDATE account SET money=money-500 WHERE accountName='张三';";
        String sql_ls2 = "UPDATE1 account SET money=money+500 WHERE accountName='李四';";

        try {
            con = JdbcUtil.getConnection(); // 默认开启的隐士事务
            con.setAutoCommit(false);       // 设置事务手动提交

            /*** 第一次转账 ***/
            pstmt = con.prepareStatement(sql_zs1);
            pstmt.executeUpdate();
            pstmt = con.prepareStatement(sql_ls1);
            pstmt.executeUpdate();
            
            // 回滚到这个位置?
            sp = con.setSavepoint(); 
            
            
            /*** 第二次转账 ***/
            pstmt = con.prepareStatement(sql_zs2);
            pstmt.executeUpdate();
            pstmt = con.prepareStatement(sql_ls2);
            pstmt.executeUpdate();
            

        } catch (Exception e) {
            try {
                // 回滚 (回滚到指定的代码段)
                con.rollback(sp);
            } catch (SQLException e1) {
            }
            e.printStackTrace();
        } finally {
            try {
                // 提交
                con.commit();
            } catch (SQLException e) {
            }
            JdbcUtil.closeAll(con, pstmt, null);
        }

    }
View Code

  

原文地址:https://www.cnblogs.com/xiaoping1993/p/6861123.html