• JDBC入门


    JDBC
    Java DataBase Connective
    java操作数据库的接口规范
    两个不同程序之间如果想要通信,必须有一套接口规范,接口规范通常由主导一方定义。
    java要操作数据库需要面向JDBC接口进行开发,数据库提供了对接口的实现即数据库的驱动。
    进行JDBC开发
    1,学习JDBC接口规范,学习组成JDBC的两个包javax.sql.*与java.sql.*
    2,在工程中导入响应数据库驱动(JDBC实现)
    核心JDBC接口规范
    DriverManager驱动管理器
    Connection连接
    Statement操作状态(子接口PreparedStatement,CallableStatement)
    ResultSet结果集

    搭建数据库环境
    进入MySQL官网http://dev.mysql.com/downloads/connector/j/下载最新的MySQL驱动程序,我这里下载的是:mysql-connector-java-gpl-5.1.35.msi。这是镜像文件,双击就会自动安装,并在C:Program FilesMySQL文件夹下生成一个MySQL Connector J文件夹。进入该文件夹找到一个名叫mysql-connector-java-5.1.35-bin.jar的文件。
    我的java程序安装在D:Javajdk1.7.0_15文件夹中,找到该文件夹下的lib文件夹,并将mysql-connector-java-5.1.35-bin.jar复制到lib中。由于安装java程序时,会默认在C:Program FilesJavajre中产生一个lib文件夹,进入该文件夹找到ext,双击进入文件夹,同时将mysql-connector-java-5.1.35-bin.jar复制一份放入其中。
    在Eclipse中,鼠标选中项目工程,右键点击Build Path,选择Configure Build Path,会跳出一个属性框图。选择Java Build Path下的Libraries,点击Add External JARs,浏览到JDBC的MySQL驱动的jar包,点击确定,将其导入到项目中。

    在工程中对数据库进行操作的步骤

    // 步骤1,加载数据库驱动
    DriverManager.registerDriver(new Driver());
    //Class.forNmae("com.sql.jdbc.Driver");一般使用这种方法,第一种会重复加载驱动
    // 步骤2,建立数据库连接
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "ss561");
    // 步骤3,将SQL发送给数据库
    Statement statement = conn.createStatement();
    ResultSet rs = statement.executeQuery("select * from users");
    // 遍历结果集
    while (rs.next()) {
      System.out.println(rs.getString("name"));
    }
    // 步骤四,断开连接释放资源
    rs.close();
    statement.close();
    conn.close();

    JDBC API详解
    DriverManager
    驱动管理器类
    用于加载驱动创建与数据库的连接
    DriverMabager.registerDriver(Driver driver);加载数据库驱动的方法
    DriverManager.getConnection(url,use,password);建立数据库连接
    DriverManager.getDrivers(url);加载多个数据库驱动,根据url的协议标识判断具体使用哪个驱动,在实际开发中并不会直接的使用DriverManager.registerDriver(),所有的数据库厂商默认在类被加载时驱动加载即被执行,即驱动加载是以静态代码块的形式存在于源码里的,所以只需要使用Class.forName("com.sql.jdbc.Driver")加载该Driver驱动类字节码文件对象即可;而且这样也可以避免在程序中实例化具体驱动对象,降低了数据库驱动的依赖性,在驱动类内部通过getDrivers来判断具体使用哪个数据库。

    数据库URL
    jdbc:mysql://ip:port/database?param
    jdbc:oracle:thin:@localhost:1521:sid
    在参数部分经常使用的属性useUnicode=true&characterEncoding=UTF-8;参数指定客户端与服务器连接使用的字符集,当客户端编码与服务器端编码不同,通过参数设置编码
    例如;客户端gbk 服务器utf-8,参数设置为useUnicode=true&characterEncoding=gbk;这里字符集与客户端编码一致。

    Connection接口
    一个对象代表一个数据库连接
    作用两点
    1,获得操作数据库的statement对象
    createStatement()---获得普通操作状态对象statement
    prepareStatement()---预编译状态对象Statement子接口
    prepareCall(String sql)---CallableStatement是prepareStatement的子接口,操作数据库内部存储过程
    statement对象可以向数据库发送sql语句,获得ResultSet结果集
    2,进行事务控制
    setAutoCommit(boolean);开启一个事务
    commit();提交一个事务
    rollback();回滚一个事务

    Statement接口
    代表一个操作的状态,操作数据库SQL语句,调用存储过程
    excuteQuery(String sql);用于向数据库发送查询语句,select语句,返回值ResultSet结果集
    excuteUpdate(String sql);用于向数据库发送insert,update或delete语句,返回值为int,表示受到影响的行数
    excute(String sql);可以向数据库发送任何SQL语句,返回值为boolean类型,如果sql结果为ResultSet结果集返回true,否则会返回false
    addBatch(String sql);批处理,一次执行多条sql语句,把多条sql语句放到一个批处理中
    excuteBatch();向数据库发送一批sql语句执行

    ResultSet结果集
    用于代表sql语句的执行结果,ResultSet封装执行结果时,采用的类似于表格的方式,ResultSet对象维护了一个指向表格数据行的游标cursor,初始的时候,游标在第一行之前,调用ResultSet.next()方法之后,可以使游标指向具体的数据行,从而获取该行的数据。
    getObject(int index)//获取任意类型的数据
    getObject(String columnName)
    getString(int index)//获取指定类型的数据
    getString(String columnName)
    Connection还有个Statement createStatement(int resultSetType,int resultSetConcurrency)方法该方法产生Statement对象,该对象将生成具有给定操作类型和并发性的 ResultSet 对象。此方法与上述 createStatement 方法相同,但它允许重写默认结果集类型和并发性。resultSetType - 结果集类型,它是 ResultSet.TYPE_FORWARD_ONLY、 ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE 之一,resultSetConcurrency - 并发类型;它是 ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE 之一这些类型都是ResultSet内部封装的字段常量。
    absolute(int row);直接将游标指向结果集的具体行数
    updateString(int columnIndex, String x)用 String 值更新指定列。结果集可以更新修改数据不过在更新之后需要确认,即调用updateRow()方法

    // 释放资源 标准写法
    Class.forName("com.mysql.jdbc.Driver");
    
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    
    try {
      conn = DriverManager.getConnection("jdbc:mysql:///day13", "root",
        "123");
      stmt = conn.createStatement();
      rs = stmt.executeQuery("select * from users");
      while (rs.next()) {
        System.out.println(rs.getString("name"));
      }
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      if (rs != null) {
      try {
        rs.close();
      } catch (SQLException sqlEx) {
      }
      rs = null;
      }
    
      if (stmt != null) {
      try {
        stmt.close();
      } catch (SQLException sqlEx) {
      }
    
      stmt = null;
      }
    
      if (conn != null) {
      try {
        conn.close();
      } catch (SQLException e) {
      }
      conn = null;
      }
    }

    因为面向JDBC接口在编程过程中需要重复使用多次对数据库进行操作,所以会出现大量的重复代码,如驱动的加载,数据库的连接,资源的释放等,为了简化开发需要将这些共性重复出现的功能代码抽取出来定义为JDBCUtils工具类中的方法
    要熟练JDBC工具类的编写。

  • 相关阅读:
    Java 破解谷歌翻译api,可以实现程序自动化翻译文章
    如何搭建高可用redis架构?
    架构师带你玩转分布式锁
    Java8内存模型—永久代(PermGen)和元空间(Metaspace)
    【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南
    kafka为什么这么优秀!
    讲道理,为什么分布式一定要有Redis?
    Windows系统内存分析工具的介绍
    colspan width issue
    OpenGL ES3 非常好的系列文章
  • 原文地址:https://www.cnblogs.com/ss561/p/4639484.html
Copyright © 2020-2023  润新知