zoukankan      html  css  js  c++  java
  • JavaEE系列之(三)JDBC操作MySQL数据库

    一、JDBC简介

           JDBC(Java Data Base Connectivity)java数据库连接
           SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC。这套接口由数据库厂商去实现,这样,开发人员只需要学习JDBC接口,并通过JDBC加载具体的驱动,就可以操作数据库。
           可以为多种数据库提供统一的访问,如Oracle,Mysql,SQL Server
           体现了java“一次编译,到处运行”的思想
           MVC结构: View ,Control, Model, DB
     
    二、代码步骤
           需要的包java.sql.*,    
                     javax.sql.*
                     以及相应的数据库驱动的支持
            1、加载数据库驱动:
               SUN公司只是定义了JDBC的一些接口,如果想要操作数据库,需要先把数据库的驱动,也就是JDBC的实现类拿到程序里来,这个操作称之为注册驱动,使用DriverManager类
               DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            2、创建数据库连接:
               JDBC提供了三种连接方式:一个参数,两个参数、三个参数
               方式一:
                    DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?username=root&password=aaa");
               方式二:
                     Properties p = new Properties();
                     p.setProperty("username", "root");
                     p.setProperty("password", "aaa");
                     DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", p);
               方式三:  
                     DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "aaa");
           3、创建用于向数据库发送sql的Statement对象
                     Statement st = connection.createStatement();
                     String sql = "select * from table users;";

                     ResultSet rs = st.executeQuery(sql);

           4、从代表结果集的ResultSet 中取出数据,进行操作
                     while(rs.next()){
                         rs.getString(columnIndex);
                     }
           5、释放资源
                    在finally中释放资源
    三、JDBC使用详解
             1、DriverManager类常用API:
                DriverManager.registerDriver(new Driver());
                DriverManager.getConnection(url,user,password);
                url的写法:
                        jdbc:mysql:[]//localhost:3306/test?参数名=参数值
                常用数据库URL地址的写法:
                        Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
                        SqlServer—jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
                        MySql—jdbc:mysql://localhost:3306/sid
                        Mysql的url地址的简写形式: jdbc:mysql:///sid
                        如果你的主机地址默认是localhost  端口是3306
              2、Connection类常用API:
                 Connection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过该对象完成的。
                 createStatement(): 创建向数据库放松sql的statement对象
                 prepareStatment(sql):创建向数据库发送预编译sql的PrepareStatement对象
                 setAutoCommit(boolean autoCommit):设置事务是否自动提交。
                 commit() :在链接上提交事务。
                 rollback() :在此链接上回滚事务。
              3、Statement类常用API
                 Jdbc程序中的Statement对象用于向数据库发送SQL语句。
                 executeQuery(String sql) :用于向数据发送查询语句。
                 executeUpdate(String sql):用于向数据库发送insert、update或delete语句
                 execute(String sql):用于向数据库发送任意sql语句
              4、ResultSet类常用API:
                 Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
                 获取任意类型的数据:(列号从 1 开始)
                     getObject(int index)
                     getObject(string columnName)
                 获取指定类型的数据,(封装数据时方便)例如:
                     getString(int index)
                     getString(String columnName)
                 ResultSet还提供了对结果集进行滚动的方法:
                      next():移动到下一行
                      Previous():移动到前一行
                      absolute(int row):移动到指定行
                      beforeFirst():移动resultSet的最前面。
                      afterLast() :移动到resultSet的最后面。
                 
              5、释放资源:
                 Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。
                 特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。
                 Connection的使用原则是尽量晚创建,尽量早的释放。
                 为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。
              6、使用JDBC对数据库进行CRUD:
                 Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
                 Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。          
     1    //查询操作
     2     Statement st = conn.createStatement();
     3     String sql = “select * from user where id=1; 
     4     ResultSet rs = st.executeQuery(sql);
     5     while(rs.next()){
     6         //根据获取列的数据类型,分别调用rs的相应方法
     7         //映射到java对象中
     8     }
     9  
    10    //插入操作
    11     String sql = "insert into user(….) values(…..) "; 
    12     int num = st.executeUpdate(sql);
    13     if(num>0){
    14         System.out.println("插入成功!!!");
    15     }
    16     //修改操作
    17      String sql = “update user set name=‘’ where name=‘’"; 
    18      int num = st.executeUpdate(sql);
    19      if(num>0){
    20         System.out.println("修改成功!!!");
    21       }
    22     //删除操作
    23      String sql = “delete from user where id=1; 
    24      int num = st.executeUpdate(sql);
    25      if(num>0){
    26         System.out.println("删除成功!!!");
    27      }

              7、PreparedSatement类详解

                PreperedStatement是Statement的孩子,它的实例对象可以通过调用Connection.preparedStatement()方法获得,相对于Statement对象而言:
                Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。     
                PreparedStatement 可对SQL进行预编译,从而提高数据库的执行效率。
                并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。          
    1         String insertString = "insert into users values(?,?,?,?);";
    2               //id, name, password, email
    3           
    4               PreparedStatement preparedStatement=  connection.prepareStatement(insertString);
    5               preparedStatement.setInt(1, 1);
    6               preparedStatement.setString(2, "zhangsan");
    7               preparedStatement.setString(3, "123456");
    8               preparedStatement.setString(4, "zhansan@sina.com");
    9               preparedStatement.execute();

               8、使用JDBC处理大文本和大二进制数据

                  在实际开发中,程序一般不需要把大文本或二进制数据保存到数据库。
                  mysql存储大文本采用的是Text,Text和blob分别又分为:
                         TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT
                         TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB          
    1.  1     //把一个文件里的内容保存到 text 列中
       2             File file = new File("1.txt");
       3             FileReader fileReader = new FileReader(file);             
       4             String insertsString ="insert into lobtest values(?,?)";
       5             PreparedStatement ps = connection.prepareStatement(insertsString);
       6         
       7              /* void setCharacterStream(int parameterIndex, Reader reader) 
       8                         将指定参数设置为给定 Reader 对象。 
       9                         //mysql 仅支持这个方法
      10                 void setCharacterStream(int parameterIndex, Reader reader, int length) 
      11                         将给定参数设置为给定 Reader 对象,该对象具有给定字符数长度。 
      12                 void setCharacterStream(int parameterIndex, Reader reader, long length) 
      13                         将指定参数设置为给定 Reader 对象,该对象具有给定字符数长度。    
      14               
      15          */
      16              ps.setInt(1, 1);
      17              ps.setCharacterStream(2,fileReader,(int)file.length());
      18              ps.execute();
      19             //把一个text列中的内容存储到一个文件中
      20             File file = new File("2.txt");
      21             FileWriter fileWriter = new FileWriter(file); 
      22             String queryString ="select content from lobtest where id = ?";
      23             PreparedStatement ps = connection.prepareStatement(queryString);
      24             ps.setInt(1, 1);
      25             ps.execute();
      26             rs=ps.getResultSet();
      27             rs.next();
      28             Reader reader = rs.getCharacterStream(1);
      29             
      30             char[] ch = new char[1024];
      31             int len = 0;
      32             while ((len=reader.read(ch, 0, 1024))!=-1) {
      33                 fileWriter.write(ch, 0, len);
      34             }
      35             reader.close();
      36             fileWriter.close();
           //先将一张图片放入到数据库中
                  String insertString = "insert into lobtest2 values(?,?);";
                  PreparedStatement prepareStatement = connection.prepareStatement(insertString)    
                  File file = new File("zixia.jpg");
                  FileInputStream fis= new FileInputStream(file);
                  prepareStatement.setInt(1, 2);
                  prepareStatement.setBinaryStream(2, fis,(int)file.length());
                  prepareStatement.execute();
                  //在从数据库中读出一张照片到文件中
                  String qureyString ="select context from lobtest2 where id = ?";
                  PreparedStatement prepareStatement = connection.prepareStatement(qureyString);        
                  prepareStatement.setInt(1, 2);       
                  prepareStatement.execute();         
                  ResultSet resultSet = prepareStatement.getResultSet();
                  resultSet.next();
                  InputStream stream = resultSet.getBinaryStream(1);          
                  FileOutputStream fos = new FileOutputStream("mm.jpg");    
                  byte[] b=new byte[1024];
                  int len=0;
                  while ((len=stream.read(b, 0, 1024))!=-1) {
                      fos.write(b, 0, len);
                  }
                  
                  fos.close();
                  stream.close();

                9、使用JDBC进行批处理

                  业务场景:当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。要注意内存溢出问题。      
     1 conn = JdbcUtil.getConnection();
     2 String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)";
     3 st = conn.prepareStatement(sql);
     4 for(int i=0;i<50000;i++){
     5     st.setString(1, "aaa" + i);
     6     st.setString(2, "123" + i);
     7     st.setString(3, "aaa" + i + "@sina.com");
     8     st.setDate(4,new Date(1980, 10, 10));
     9     st.addBatch();
    10     if(i%1000==0){
    11         st.executeBatch();
    12         st.clearBatch();
    13     }
    14 }
    15 st.executeBatch();

                   优点:发送的是预编译后的SQL语句,执行效率高。

                   缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据
               10、使用JDBC调用存储过程            
    1 CallableStatement cStmt = conn.prepareCall("{call demoSp(?, ?)}");
    2 cStmt.setString(1, "abcdefg");
    3 cStmt.registerOutParameter(2, Types.VARCHAR);
    4 cStmt.execute();
    5 System.out.println(cStmt.getString(2));
     
                 





  • 相关阅读:
    HDU 1800 Flying to the Mars 字典树,STL中的map ,哈希树
    字典树 HDU 1075 What Are You Talking About
    字典树 HDU 1251 统计难题
    最小生成树prim算法 POJ2031
    POJ 1287 Networking 最小生成树
    次小生成树 POJ 2728
    最短路N题Tram SPFA
    poj2236 并查集
    POJ 1611并查集
    Number Sequence
  • 原文地址:https://www.cnblogs.com/rocomp/p/4833766.html
Copyright © 2011-2022 走看看