JDBC

来源:互联网 发布:raft算法 编辑:程序博客网 时间:2024/05/17 22:51
JDBC




  一。 JDBC 的介绍 


    JDBC : JAVA DATABASE CONNECTIVITY sun公司提供的一套操作数据库的标准!


    JDBC 一套接口!没有具体的实现!
    各个数据库厂商的jar包!


    JDBC 和  jar 包之间的关系!就是接口和实现的关系!!


  二。 JDBC 的四个核心对象
        
        java:


        DriverManager  用于注册各个厂商的驱动!


        Connection 连接(会话)  java和数据库的一个会话!


        Statement 可以具体的操作sql语句!


        ResultSet 结果集! 对应statement 查询操作






  三。 JDBC 的操作步骤


  1.注册驱动


  2.获取连接


  3.创建Statement


  4.执行sql语句


  5.处理结果集


  6.关闭资源


  //1.注册驱动
    //注意:驱动对象应该是各个数据库厂商的
    DriverManager.registerDriver(new Driver());
//2。获取连接
    //url jdbc:数据库厂商://ip地址:3306/具体操作的库 day2
    //jdbc:mysql://localhost:3306/day2
    //简写:jdbc:mysql:///day2
    //connection是java.sql
   Connection connection=  DriverManager.getConnection("jdbc:mysql://localhost:3306/day2", "root", "111");
    //3.创建statemant 创建操作sql语句的对象
    Statement statement = connection.createStatement();
    String sql = "select * from student";
    //4.执行sql语句
    ResultSet resultSet = statement.executeQuery(sql);
    
    //5.解析结果集
    while(resultSet.next()){
    //注意:列下标是从1开始!
    //具体的列的数据 2列
    String sid =  resultSet.getString(1);
    String sname =  resultSet.getString(2);
    System.out.println(sid+sname);
    LogUtils.LogOut(sid+sname);
    }
    
    
    //6.关闭资源
    resultSet.close();
    
    if (statement != null) {
statement.close();
}
    
    if(connection != null)
    {
    connection.close();
    }




  四。 查询单个对象API详细讲解对应的方法




  DriverManager  注册驱动 获取连接


  管理一组 JDBC 驱动程序的基本服务。


   1.public static void registerDriver(Driver driver)
                           throws SQLException注册与给定的驱动程序DriverManager 。 新加载的驱动程序类应该调用方法registerDriver使其自己已知的DriverManager 。 如果司机目前已注册,则不采取任何行动。


           注意:参数应该是对应数据库厂商的实现驱动!


           问题: DriverManager.registerDriver()会注册两次驱动!


           解决方案:
            Class.froName("com.mysql.jdbc.Driver");


           
         2.获取连接方法
         
          Connection getConnection(String url,
                                       String user,
                                       String password)
                                throws SQLException尝试建立与给定数据库URL的连接。 DriverManager尝试从一组已注册的JDBC驱动程序中选择适当的驱动程序。 




            参数介绍:
             url 连接数据库的路径 jdbc:数据库厂商://ip地址:端口号/数据库名
             user 连接数据库的用户名 root
             password 连接数据库的名字 111




          Connection getConnection(String url,
                                       Properties info)
                                throws SQLException尝试建立与给定数据库URL的连接。 DriverManager尝试从一组已注册的JDBC驱动程序中选择适当的驱动程序 
                                
            参数介绍:
             url 连接数据库的路径 jdbc:数据库厂商://ip地址:端口号/数据库名
             Properties  继承与HashTable key value存在的
                利用setProperty(String key, String value) 设置值!     


Properties info  = new Properties();
info.setProperty("","root");


用户名  key --> user
密码    key --> password


          Connection getConnection(String url


          url 连接数据库的路径 jdbc:数据库厂商://ip地址:端口号/数据库名?user=root&password=111


  Connection  创建连接 并获取操作数据库sql语言的Statement对象


  1.创建Statement对象


  Statement createStatement()
                   throws SQLException创建一个Statement对象,用于将SQL语句发送到数据库。 没有参数的SQL语句通常使用Statement对象执行。 如果相同的SQL语句执行了很多次,那么使用PreparedStatement对象可能会更有效。 




            2. 创建PreparedStatement对象
 
            
                PreparedStatement prepareStatement(String sql)
                            throws SQLException创建一个PreparedStatement对象,用于将参数化的SQL语句发送到数据库。 
具有或不具有IN参数的SQL语句可以预编译并存储在PreparedStatement对象中。 然后可以使用该对象多次有效地执行此语句。 


注意:此方法针对从预编译中受益的参数化SQL语句进行了优化。 如果驱动程序支持预编译,则方法prepareStatement将将该语句发送到数据库进行预编译。 有些驱动程序可能不支持预编译。 在这种情况下,在执行PreparedStatement对象之前,该语句可能不会发送到数据库。 这对用户没有直接影响; 然而,它确实影响了哪些方法抛出某些SQLException对象。 


     


  Statement 执行sql语句


  sql语句的分类:


   DDL CREATE ALTER DROP   
   DML INSERT UPDATE DELETE
   DQL SELECT 


  1.boolean execute(String sql)


  对应sql语句的范围: DDL DML DQL DCL
  返回值: boolean   true DQL  
  false DDL DML DCL


  2.int executeUpdate(String sql)
   
  对应sql语句的范围:DML DDL DCL
  返回值: 1.返回0  DDL DCL 
   2.返回的计数值 DML  


   insert 插入了几条数据!
   delete 删除了几条数据
   update 更新了几条数据!

3.ResultSet executeQuery(String sql)

对应sql语句范围:DQL 
返回值: ResultSet: 对象从不为null

ResultSet rt = new ResultSet();


  ResultSet 结果的封装类


  ResultSet一张虚拟的表!


  通过ResultSet只能获取表中的数据!不能说去表的表头信息!(有多少列 列名!)


  解决方案:


  ResultSetMetaData =  getMetaData()  可以获取当前ResultSet对象的表头信息!!


  ResultSetMetaData :  API 


      getColumnCount() 
返回此 ResultSet对象中的列数。


    String getColumnName(int column)
                    throws SQLException获取指定列的名称。 
参数 
  column - 第一列是1,第二列是2,... 




  1.操作光标


  了解:


  void afterLast()  没有数据
将光标移动到这个 ResultSet对象的末尾,就在最后一行之后。  
void beforeFirst()  没有数据
将光标移动到这个 ResultSet对象的正面,就在第一行之前 
first()  有数据
将光标移动到此 ResultSet对象中的第一行




absolute(int row)  定位到第几行
boolean previous() 
将光标移动到此 ResultSet对象中的上一行。  


boolean next() 
将光标从当前位置向前移动一行。


返回值: 返回值 boolean


true如果新的当前行有效; false如果没有更多的行 
 




  2.获取数据 


  getObject(String columnLabel) 


获取此的当前行中指定列的值 ResultSet作为对象 Object在Java编程语言


getString(int columnIndex);
getInt()
getShort();




获取对应列类型的数据!
参数:String columnLabel/int columnIndex

columnLabel:列的名字获取!或者是别名
columnIndex:列的下标获取  起始 1开始




  3.关闭资源


  result.close();




  五。 测试CRUD方法






  六。工具类的封装以及高级封装结果 ******


   1.封装工具类的目的!


     我们的目标:


           1.只进行一次驱动注册


            -单例模式  懒汉 饿汉


            -静态代码块


           2.方便获取连接!


            -创建一个获取连接的方法!


            static   -- > 静态代码块


           3.方便关闭资源!


              close() 


           ---------------


           4.方便处理结果集




             -List<Map> 
             -List<Bean>




  七。注入攻击是什么!以及怎么样解决注入攻击! *****
 


   回忆:




    1.什么是JDBC??


     java database connectivity 


     sun提供的一套操作数据库的标准规范!(一套接口!)


    2.谁真正操作了数据库??
   
     对应数据库的厂商! Jar 实现类!


     各个Jar都实现了JDBC的接口!




     Connection (java.sql) conn = Connecion mysql


       3.四个核心对象
       
        DriverManager  


        注册驱动
            registerDriver(new Driver()(mysql));
            注册两次
            Class.forName("com.mysql.jdbc.Driver");
        获取连接


        getConnection(1,2,3);


        url:jdbc:mysql://localhost:3306/数据库名


        Connection 


            与数据库的一次会话!


            创建数据库sql操作对象 Statement 


            1.createStatement


            2.preparedStatement


        Statement


        1.execute(sql);


          返回值: boolean 
          TRUE: DQL resultSet
             FALSE: DDL DMLDCL
          使用sql类型:DDL DML DQL DCL 


        2.executeUpdate(sql)


           返回值: int :  0:DDL DCL
            计数值: DML 操作影响的行数
           使用sql类型: DML DDL DCL




        3.executeQuery(sql)


            返回:resultSet  永远不为null 
            使用sql类型:DQL 


        ResultSet  


        1.操作光标


        .next()   
 
  返回值: boolean  true 下面还有行   移动到下一行
   false 没有更多行了


        2.获取列的数据


        get类型(index,label)


        index int: 列的下标:  1开始
        label String:列名 或者 别名 


        3.关闭资源


        close();
      




        4.执行步骤 


         1.注册驱动


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


         2.获取连接 
          java.sql


            Connection connection = DriverManager.getConnection(1,2,3);   


         3.获取Statament
            java.sql
            Statement statement =  connection.createStatement();   


         4.执行sql语句 
         
            statement.execute();
            statement.executeUpdate();
ResultSet result = statement.executeQuery();


 5.处理结果集  




 6.关闭资源 
 


5.处理结果集 

  目标保存查询到的结果数据! 




  ResultSet ---》 虚拟的表 


  表头(列的信息)  表的数据!


  表头:ResultSetMetaData metadata = resultSet.getMateData();


    表的数据: ResultSet中




    ResultSetMetaData: 


         1.获取有多少列
           getColumnCount(); 
         2.获取列的名字
           getColumnName(index);




    List<Map<String,String>>     
      手动


        每一行 装到一个map中! 最后map装到list中!


        while(resultSet.next())
        {
        //一行的数据  map对象
        HashMap<String,String> map = new HashMap<>();


        map.put(metaData.getColumnName(1),resultSet.getString(1));
        map.put(metaData.getColumnName(2),resultSet.getString(2));
map.put(metaData.getColumnName(3),resultSet.getString(3));


list.add(map)
        }






      全自动




        while(resultSet.next())
        {
        //一行的数据  map对象
        HashMap<String,String> map = new HashMap<>();


        for(int i= 1 ; i<= columnCount ; i++)
        {
        map.put(metaData.getColumnName(i),resultSet.getString(i));
        }
list.add(map)
        }


    List<Bean> 


    手动


    while(resultSet.next())
        {
        //一行的数据  map对象
        Student stu = new Student();
        //注意: Student  --》 student
        //Student类中变量的数量:大于或者等于 student列名
        //Student中变量的名字 跟列名一样!


        stu.setStuid(resultSet.getString(1));
        stu.setStuName(resultSet.getString(2);


list.add(map)
        }


    半自动






    while(resultSet.next())
        {
        //一行的数据  map对象
        Student stu = new Student();
         
        for(int i= 1 ; i<= columnCount ; i++)
        {
       
        //1.获取列名
           String columnName=metaData.getColumnName(i);
           String value = resultSet.getString(columnName);


           //参数1: 属性名
           //参数2: 哪个类
           PropertyDescriptor dp =  new PropertyDescriptor(columnName,Student.class);


           //获取set方法
           Method set = db.getWriteMethod();


           set.invoke(stu,value);


        }


list.add(stu)
        }


   复习:


    作业: 


       1.6步骤弄清!
       2.List<Map>
       3.List<Student>
原创粉丝点击