• JDBC操作Oracle数据库


    背景知识

    含义:JDBC是一种java数据库连接技术,能实现java程序对各种数据库的访问。由一组使用java语言编写的类和接口组成,这些类和接口称为JDBC API,他们位于java.sql 以及javax.sql(扩展内容,x就是扩展的意思) 中。

    作用:JDBC就相当于java和数据库之间的一座桥梁。可以建立和数据库之间的访问连接;将编写好的SQL语句发送到数据库中执行;对数据库返回的执行结果进行处理。

    JDBC API : DriverManager类,管理jdbc的驱动;Connection 接口,连接数据库并担任传送数据的任务;Statement接口,由Connection产生负责执行SQL语句;ResultSet接口,保存Statement执行后所产生的查询结果。

    java官方提供接口,数据库厂商提供接口实现类(驱动)。

    得把数据库服务启动才能连接,别忘了哦~

    1、创建Java项目,导入JDBC驱动JAR包
    (1)在项目下创建lib目录

    (2)将ORACLE主目录jdbclibojdbc6.jar复制到lib目录下
    (3)在ojdbc6.jar上右键-->Build Path-->Add To Build Path

    2、在myeclipse 10下建立数据库的连接

    作用:加载驱动和获得连接时容易把URL写错,在这里配置好了,等到写时会有一个提示功能

    Window-->Open Perspective(打开视图)-->Myeclipse DataBase Explorer-->Myeclipse Derby (右键 new)-->Driver Template(模板,样板,范本) 下拉列表选择Oracle (Thin Driver)-->Driver Name 写ORCL -->剩下的就是获得数据库连接的url name password 正常填写就可以了。-->添加JARS ,去目录下找到ojdbc6.jar-->save password --> Test Driver 测试连接是否建立成功.

    3、JDBC访问数据库的步骤

    1. 加载驱动类:Class.forName("JDBC驱动类的名称"),如果不存在给定的类,则抛出异常,ClassNotFoundException——重复操作项
    2. Connection conn=DriverManager.getConnection(url,userName,password),会搜索整个驱动程序列表,寻找匹配的驱动程序,用户名和密码是可选的——重复操作
    3. Statement stmt=conn.createStatement();连接成功后,用该连接创建Statement接口的实例
    4. int rows=stmt.executeUpdate(sql); //insert、update、delete 都用executeUpdate()方法,且返回受影响行数
    5. ResultSet res=stmt.executeQuery(sql);     //查询用 executeQuery()方法,返回结果集,next()判断结果集是否为空,如果不为空,调用getXxx()方法,得到记录中字段对应的值
    6. while(res.next()){
                      /**从当前行中提取各列的值
                      将第1列的数据以int类型取出
                      int id=res.getInt(1);
                      将第2列的数据以String类型取出
                      String name=res.getString(2);
                      将第3列的数据以String类型取出
                      String sex=res.getString(3);*/
                      //这两种写法都可以,建议采取第二种写法
                      //将id列的值以int类型取出
                      int id=res.getInt("编号");   //括号中可写别名
                      //将name列的值以String类型取出
                      String name=res.getString("姓名");
                      //将sex列的值以String类型取出
                      String sex=res.getString("性别");
                      
                      System.out.println(id+" "+name+" "+sex);
                  }
    7. 关闭对象时,按照与创建时相反的顺序,先关闭ResultSet,再关闭Statement,最后关闭Connection——重复操作项

    四、PreparedStatement对象

    “以上为基本连接方式,但有不完善的地方,比如插入SQL语句时,极易发生SQL注入,用户修改sql语句,为了防止,特使用PreparedStatement对象”。

    PreparedStatement对象接口implements 自Statement,使用更加灵活,更有效率。SQL语句中写占位符?,预处理(预编译)SQL语句,一旦完成预编译,SQL语句的结构就确定下来,不会因为用户输入的数据改变SQL语句的执行结构,从而避免SQL注入攻击。

    pstmt=conn.prepareStatement(sql);

    pstmt.setXxx(1,value值);//绑定参数

    五、数据库辅助类

     作用:将重复操作项封装成一个jar文件放在项目下,以后遇到加载驱动类,获得连接,关闭对象的操作,直接调用即可。修改数据库配置时,只需修改修改配置文件即可。
    配置文件-->ConfigManager-->DBHelper-->程序
    1. 配置文件:jdbc.properties,用键值对的方式保存数据库连接参数。在项目src下新建file,add   key-value   key为名字可随便取,value则不可
    2. ConfigManager类,在讲ConfigManager类之间先大致说下懒汉和
      //饿汉单例模式
      public class EagerSingleton {
          //使用private修饰构造函数,禁止外部代码直接通过构造函数创建对象
          private EagerSingleton(){
              
          }
          //声明私有静态成员,保存唯一的实例,立即创建唯一实例
          private static EagerSingleton instance=new EagerSingleton();
          //定义公共方法,获取唯一实例
          public static EagerSingleton getInstance(){
              return instance;
          }
      
      }
      //懒汉单例模式
      public class LazySingleton {
      	//私有构造方法
      	private LazySingleton(){
      		
      	}
      	//声明私有静态实例
      	private static LazySingleton instance=null;
      	//定义公共的获取实例的方法
      	public static LazySingleton getIstance(){
      		//在准备获取实例时进行判断,如果还未实例化,则创建唯一实例
      		if(instance!=null){
      			instance=new LazySingleton();
      		}
      		return instance;
      	}
      }

       下面开始写:

      //用来加载配置文件的单例类
      public class ConfigManager {
          //加载进来的配置参数
          private Properties props=null;
          //唯一实例
          private static ConfigManager instance=null;
          //私有构造方法,负责加载配置文件
          private ConfigManager(){
              try {
                  InputStream is=ConfigManager.class.getResourceAsStream("/jdbc.properties");
                  props.load(is);
                  is.close();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
          //获得ConfigManager的唯一实例                                               
          public static ConfigManager getInstance(){
              if(instance==null){
                  instance=new ConfigManager();
              }
              return instance; 
          }
          //获得参数
          public String getProperty(String name) {
              return props.getProperty(name);
          }
      
      }
      public class DBHelper {
              //静态块在类加载时执行一次
              static{
                  String driverClass=ConfigManager.getInstance().getProperty("jdbc.driver_class");
                  try {
                      Class.forName(driverClass);
                  } catch (ClassNotFoundException e) {
                      //在静态块中发生异常时,需要抛出ExceptionInInitializerError类型的异常
                      throw new ExceptionInInitializerError(e);
                  }
              }
              //获得连接
              public static Connection getConnection()throws SQLException {
                  String url=ConfigManager.getInstance().getProperty("jdbc.url");
                  String userName=ConfigManager.getInstance().getProperty("jdbc.username");
                  String password=ConfigManager.getInstance().getProperty("jdbc.password");
                  return DriverManager.getConnection(url, userName, password);
              }
              //关闭资源
              public void closeAll(Connection conn,Statement stmt,ResultSet res) {
                  try {
                      if(res!=null){
                          res.close();
                      }
                      if(stmt!=null){
                          stmt.close();
                      }
                      if(conn!=null){
                          conn.close();
                      }
                  } catch (SQLException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
              }
              
              
          
      
      }

      最后把上边两个类导成JAR包,将jar包和配置文件一起安在需要的项目下。终于完事啦,断断续续写了好几天。噜啦啦~~~

  • 相关阅读:
    go基础系列:结构struct
    梯度下降法解决线性回归
    梯度下降法解决线性回归
    梯度下降法解决线性回归
    【 Linux 】单台服务器上并发TCP连接数(转)
    【 Linux 】单台服务器上并发TCP连接数(转)
    【 Linux 】单台服务器上并发TCP连接数(转)
    axios在vue项目中的一种封装方法
    快速排序算法(C#实现)
    你必须知道的261个Java语言问题
  • 原文地址:https://www.cnblogs.com/Angelinas/p/5310087.html
Copyright © 2020-2023  润新知