新JDBC黑马程序员详解

Posted 做一枚简单快乐的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新JDBC黑马程序员详解相关的知识,希望对你有一定的参考价值。


01-JDBC简介&快速入门

  • JDBC简介
  1. JDBC概念:
    • JDBC就是使用Java语言操作关系型数据库的一套API
    • 全称:(Java DataBase Connectivity)Java数据库连接
  2. JDBC本质:
    • 官方定义的一套操作所有关系型数据库的规则,接口
    • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
    • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
  3. JDBC好处:
    • 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
    • 可随时替换底层数据库,访问数据库的Java代码基本不变
  • JDBC的快速入门
    0. 创建工程,导入驱动jar包

    mysql-connectior-java-5.1.48.jar

    1. 注册驱动

    Class.forName(“com.mysql.jdbc.Driver”);
    2. 获取连接

    Connection conn = DriverManger.getConnection(url,usename,password);
    3. 定义SQL语句

    String sql =“update…”;
    4. 获取执行SQL对象

    Statement stmt=conn.createStatement();
    5. 执行SQL

    stmt.executeUpdate(sql);
    6. 处理返回结果
    7. 释放资源

package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/*
JDBC快速入门
 */
public class JDBCDemo 
    public static void main(String[] args) throws ClassNotFoundException, SQLException 
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/class";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义语句
        String sql = "UPDATE score set grade =50 where id=1";
        //4.获取执行sql的对象statement
        Statement stmt = conn.createStatement();
        //5.执行sql
        int count = stmt.executeUpdate(sql);
        //6.处理结果
        System.out.println(count);
        //7.释放资源
        stmt.close();
        conn.close();
    


  • JDBC API详解

    1. DriverManager
    2. Connection
    3. Statement
    4. ResultSet
    5. PreparedStatement
  • DriverManager (驱动管理类)作用:

    1. 注册驱动
    Class.forName("com.mysql.jdbc.Driver");
    

    查看源码

    Static
        try
        DriverManger.registerDriver(new Driver());
        catch(SQLException var1)
            throw new RuntimeException("can't register driver!");
        
    
    

    提示:

    • Mysql 5 之后的驱动包,可以省略注册驱动的步骤
    • 自动加载jar包中的驱动类
    1. 获取数据库连接
     static Connection getConnerction(String url,String user,String password)
    
    • 参数
    1. url:连接路径
    语法:jdbc:mysql://ip地址域名:端口号/数据库名称?参数键值对1&参数键值对2...
    实例:jdbc:mysql:///127.0.0.1:3306/db1
    细节:1.如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
     2.配置useSSL=false参数,禁止用安全连接方式,解决警告提示
    
    1. user:用户名
    2. password:密码
    • Connection(数据库连接对象)作用:
    1. 获取执行SQL的对象
  • 普通执行SQL对象

     Statement createStatement()
    
    • 预编译SQL的执行SQL对象:防止SQL注入
    PreparedStatement prepareStatement(sql)
    
    • 执行存储过程的对象
     CallableStatement prepareCall(sql)
    
  1. 管理事务
* Mysql事务管理

开启事务:BEGIN;/START TRANSACTION;

提交事务:COMMIT;

回滚事务:ROLLBACK;

MySQL默认自动提交事务

* JDBC事务管理:Connection接口中定义了3个对应的方法

开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动提交事务,即为开启事务

提交事务:commit()

回滚事务:rollback()
package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/*
事务
 */
public class JDBCDemo3_Connection 
    public static void main(String[] args) throws ClassNotFoundException, SQLException 
        //1.注册驱动
       // Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/class?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义语句
        String sql1 = "UPDATE score set grade =50 where id=1";
        String sql2 = "UPDATE score set grade =50 where id=2";
        //4.获取执行sql的对象statement
        Statement stmt = conn.createStatement();

        try 
            //开启事务
            conn.setAutoCommit(false);
            //执行sql
            int count1 = stmt.executeUpdate(sql1);
            //处理结果
            System.out.println(count1);
            int i=3/0;
            //执行sql
            int count2 = stmt.executeUpdate(sql2);
            //处理结果
            System.out.println(count2);
            //提交事务
            conn.commit();
         catch (Exception throwable) 
            //滚动事务
            conn.rollback();
            throwable.printStackTrace();
        
        //7.释放资源
        stmt.close();
        conn.close();
    


JDBC API详解

  • Statement
    1. 执行SQL语句
  • 执行SQL语句
int executeUpdate(sql): 执行DDL(主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。常用的语句关键字有 CREATE、DROP、ALTER 等),DML语句(主要是对数据进行查询操作。常用关键字有 SELECT、FROM、WHERE 等)
返回值:1.DML语句影响的行数 2.DDL语句执行后,执行成功也可能返回0

DDL语句

/*
JDBC API详解:Statement  执行DML语句
 */
public class JDBCDemo4_Statement 
    @Test
    public  void testDML() throws Exception 
        //1.注册驱动
        // Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql:///class?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义语句
        String sql = "UPDATE score set grade =80 where id=20";
        //4.获取执行sql的对象statement
        Statement stmt = conn.createStatement();
        //5.执行sql
        int count = stmt.executeUpdate(sql);//执行DML语句,受影响的行数
        //6.处理结果
     //   System.out.println(count);
        if(count>0)
            System.out.println("修改成功");

        
        else
            System.out.println("修改失败");
        
        //7.释放资源
        stmt.close();
        conn.close();
    

DML语句

 /*
    DML语句
     */

    @Test
    public  void testDDL() throws Exception 
        //1.注册驱动
        // Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url = "jdbc:mysql:///class?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3.定义语句
        String sql = "drop database class2";
        //4.获取执行sql的对象statement
        Statement stmt = conn.createStatement();
        //5.执行sql
        int count = stmt.executeUpdate(sql);//执行DDL语句,受影响的行数,可能返回0
        //6.处理结果
          System.out.println(count);
//        if(count>0)
//            System.out.println("修改成功");
//
//        
//        else
//            System.out.println("修改失败");
//        
        //7.释放资源
        stmt.close();
        conn.close();
    
ResultSet executeQuery(sql): 执行DQL语句
返回值:ResultSet结果集对象
  • ResultSet(就是Statment执行executeQuery返回值)

    1. Result(结果集对象)作用:

    封装DQL查询语句的结果

    ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
    
    1. 获取查询结果
    boolean next():1.将光标从当前位置向前移动一行 2.判断当前行是否为有效行
    返回值:
        true:有效行,当前行有效数据
        false:无效行,当前行没有数据
    
    xxx getXxx(参数):获取数据
    xxx:数据类型;int getInt(参数); String getString(参数)
    参数:
        int:列的编号,从1开始
        String:列的名字
    
    1. 使用步骤:

      1. 游标向下移动一行,并判断该行是否有数据:next()
      2. 获取数据:getXxx(参数)
      //循环判断游标是否是最后一行末尾
      while(rs.next())
          //获取数据
          rs.getXxx(参数);
      
    
     package com.itheima.jdbc;
     
     import org.junit.Test;
     
     import java.sql.Connection;
     import java.sql.DriverManager;
     import java.sql.ResultSet;
     import java.sql.Statement;
     
     /*
     执行DQL语句
     
      */
     public class JDBCDemo4_Result 
         @Test
         public void testResultSet() throws Exception 
             //1.注册驱动
             // Class.forName("com.mysql.jdbc.Driver");
             //2.获取连接
             String url = "jdbc:mysql:///class?useSSL=false";
             String username = "root";
             String password = "123456";
             //3.定义sql语句
             String sql = "select * from score";
             Connection conn = DriverManager.getConnection(url, username, password);
             //4.获取statement对象
             Statement stmt = conn.createStatement();
             //5.执行sql
             ResultSet rs = stmt.executeQuery(sql);
             //6.处理结果,遍历rs中所有数据
             //6.1光标向下移动一行,并且判断当前行是否有数据
             //行输出
             while(rs.next()) 
                 //6.2获取数据  getXxx()
                 int  id = rs.getInt(1);
                 String name = rs.getString(2);
                 int number = rs.getInt(3);
                 int grade =rs.getInt(4);
                 System.out.println(id);
                 System.out.println(name);
                 System.out.println(number);
                 System.out.println(grade);
                 System.out.println("-------------------");
     //        
             //列输出
             while(rs.next()) 
                 //6.2获取数据  getXxx()
                 int  id = rs.getInt("id");
                 String name = rs.getString("c_name");
                 int number = rs.getInt("stu_id");
                 int grade =rs.getInt("grade");
                 System.out.println(id);
                 System.out.println(name);
                 System.out.println(number);
                 System.out.println(grade);
                 System.out.println("-------------------");
             
             //7.释放资源
             rs.close();
             conn.close();
             stmt.close();
         
     
     
    
    • 案例分析:ResultSet案例

    需求:查询account账户表数据,封装Account对象中,并且存储ArrayList集合中

    表中数据->java对象->ArrayList

    package com.itheima.jdbc;
    
    import com.itheima.pojo.Account;
    import org.junit.Test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    /*
    *需求:查询account账户表数据,封装Account对象中,并且存储ArrayList集合中
    *1.定义实体类Account
    *2.查询数据,封装Account对象中
    *3.将Account对象存入ArrayList集合中
     */
    public class JDBCDemo4_Result 
        @Test
        public void testResultSet2() throws Exception 
            //1.注册驱动
            // Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接
            String url = "jdbc:mysql:///class?useSSL=false";
            String username = "root";
            String password = "123456";
            //3.定义sql语句
            String sql = "select * from account";
            Connection conn = DriverManager.getConnection(url, username, password);
            //4.获取statement对象
            Statement stmt = conn.createStatement();
            //5.执行sql
            ResultSet rs = stmt.executeQuery(sql);
            //创建一个集合
            List<Account> list = new ArrayList<Account>();
            while (rs.next()) 
                Account account = new Account();
                //6.2获取数据  getXxx()
                int id = rs.getInt("id");
                String name = rs.getString("name");
                double money = rs.getDouble("money");
                //赋值
                account.setId(id);
                account.setName(name);
                account.setMoney(money);
                //存入集合
                list.add(account);
            
            System.out.println(list);
            //7.释放资源
            rs.close();
            conn.close();
            stmt.close();
        
    
    

    • PreparedStatement

      • 利用密码登入sql 演示SQL注入 需求:完成用户登入
      package com.itheima.jdbc;
      
      import org.junit.Test;
      
      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.ResultSet;
      import java.sql.Statement;
      
      /*
      *
       */
      public class JDBCDemo5_UserLogin 
        //2. 获取连接
          @Test
          public void testResultSet2() throws Exception 
              //1.注册驱动
              // Class.forName("com.mysql.jdbc.Driver");
              //2.获取连接
              String url = "jdbc:mysql:///class?useSSL=false";
              String username = "root";
              String password = "123456";
              Connection conn = DriverManager.getConnection(url,username,password);
              String name ="zhangsan";
              String pwd ="123";
              String sql ="select * from tb_user where username =' "+name+" ' and passward =' "+pwd+" ' ";
              //获取stmt对象
              Statement stmt = conn.createStatement();
              //执行sql语句
              ResultSet rs = stmt.executeQuery(sql);
              //判断登录是否成功
              if(rs.next())
                  System.out.println("登入成功");
              
              else
                  System.out.println("登入失败");
              
              //释放资源
              stmt.close();
              rs.close();
              conn.close();
          
          
          
          
          /*
          SQL注入
           */
          @Test
          public void testLogin_Inject() throws Exception 以上是关于新JDBC黑马程序员详解的主要内容,如果未能解决你的问题,请参考以下文章

    Java基础黑马程序员教材 案例3-2银行存取款,3-4学生投票代码详解

    黑马程序员-MyBatis 框架-最全入门笔记阿伟看了都得说真大真细真全!!!

    黑马jdbc

    Java教程JDK14新特性详解 有哪些值得关注的?

    iOS10通知及通知拓展Extension使用详解(附Demo)

    JDBC常用接口详解