zoukankan      html  css  js  c++  java
  • JDBC

    什么是JDBC

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
    JDBC使程序员能用Java语言连接各种各样不同的数据库,并且使用结构化查询语言来进而增删改查。下图是JDBC到数据库的通信路径:

    JDBC有四种形式的驱动,一种是将JDBC转化为ODBC,然后通过它来和数据库交流。第二种驱动部分用Java编写,部分用本地代码编写,并依赖数据库的客户端api来进行交流。第三种驱动是一个纯java库,它使用与具体数据库无关的协议向服务器组件发起请求,然后由服务器再转变成和数据库相关的协议。第四种就是纯java库,并且直接和与数据库相关的协议打交道。

    数据库的连接

    1. 首先需要的是一个驱动,即一个jar文件,然后放到classpath里面。
    2. 然后需要将JDBC的驱动文件进行注册,驱动的注册有两种方式:
      • Class.forName("com.mysql.jdbc.Driver");
      • java -Djdbc.drivers=org.postgresql.Driver或者在程序里设置系统属性:System.setProperty("jdbc.drivers","org.postgresql.Driver")
    3. 接着就是设置url:协议:子协议:数据源标识
      • 协议:在JDBC中总是以jdbc开始
      • 子协议:是桥连接的驱动程序或是数据库管理系统名称。
      • 数据源标识:标记找到数据库来源的地址与连接端口。

         如 jdbc:mysql://localhost:3306/testuseUnicode=true&characterEncoding=gbk ; 

    4. 连接时使用DriverManager.getConnection方法

        Connection conn=DriverManager.getConnection(url,username,password)

    SQL语句的执行

    执行SQL语句前需要一个Statement对象。

    • 如果执行静态SQL语句,使用Statement对象:Statement stmt=conn.createStatement
    • 如果执行动态SQL语句,使用PreparedStatement对象:PreparedStatement pstmt=conn.prepareStatement(sql)
    • 如果执行存储过程,使用CallableStatement对象:CallableStatement cstmt=conn.prepareCall()

    如果执行的是查询,使用 ResultSet executeQuery(String sqlString)
    如果执行的是INSERT,UPDATE,DELETE或DDL语句,使用 int executeUpdate(String sqlString)
    如果需要返回多个结果集或更新计数,使用 execute(sqlString)

    如果是查询,结果集ResultSet包含了所有符合条件的行,可以使用ResultSet的 Xxx getXxx(int columnNumber)或者Xxx getXxx(String columnLabel)来得到具体的值。迭代时使用ResultSet的next()方法。

    PreparedStatement可以设置参数:
    PreparedStatement stat = conn.prepareStatement("INSERT INTO Cover VALUES (?, ?)");
    stat.set(1, isbn);
    stat.set(2, coverBlob);

    完整的例子(来源CoreJava):

    import java.io.*;
    import java.util.*;
    import java.sql.*;
    
    /**
    * Executes all SQL statements in a file. Call this program as <br>
    * java -classpath driverPath:. ExecSQL commandFile
    * @version 1.30 2004-08-05
    * @author Cay Horstmann
    */
    class ExecSQL
    {
    public static void main(String args[])
    {
    try
    {
    Scanner in;
    if (args.length == 0) in = new Scanner(System.in);
    else in = new Scanner(new File(args[0]));
    
    Connection conn = getConnection();
    try
    {
    Statement stat = conn.createStatement();
    
    while (true)
    {
    if (args.length == 0) System.out.println("Enter command or EXIT to exit:");
    
    if (!in.hasNextLine()) return;
    
    String line = in.nextLine();
    if (line.equalsIgnoreCase("EXIT")) return;
    if (line.trim().endsWith(";")) // remove trailing semicolon
    {
    line = line.trim();
    line = line.substring(0, line.length() - 1);
    }
    try
    {
    boolean hasResultSet = stat.execute(line);
    if (hasResultSet) showResultSet(stat);
    }
    catch (SQLException ex)
    { 
    for (Throwable e : ex)
    e.printStackTrace();
    }
    }
    }
    finally
    {
    conn.close();
    }
    }
    catch (SQLException e)
    {
    for (Throwable t : e)
    t.printStackTrace();
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }
    
    /**
    * Gets a connection from the properties specified in the file database.properties
    * @return the database connection
    */
    public static Connection getConnection() throws SQLException, IOException
    {
    Properties props = new Properties();
    FileInputStream in = new FileInputStream("database.properties");
    props.load(in);
    in.close();
    
    String drivers = props.getProperty("jdbc.drivers");
    if (drivers != null) System.setProperty("jdbc.drivers", drivers);
    
    String url = props.getProperty("jdbc.url");
    String username = props.getProperty("jdbc.username");
    String password = props.getProperty("jdbc.password");
    
    return DriverManager.getConnection(url, username, password);
    }
    
    /**
    * Prints a result set.
    * @param stat the statement whose result set should be printed
    */
    public static void showResultSet(Statement stat) throws SQLException
    {
    ResultSet result = stat.getResultSet();
    ResultSetMetaData metaData = result.getMetaData();
    int columnCount = metaData.getColumnCount();
    
    for (int i = 1; i <= columnCount; i++)
    {
    if (i > 1) System.out.print(", ");
    System.out.print(metaData.getColumnLabel(i));
    }
    System.out.println();
    
    while (result.next())
    {
    for (int i = 1; i <= columnCount; i++)
    {
    if (i > 1) System.out.print(", ");
    System.out.print(result.getString(i));
    }
    System.out.println();
    }
    result.close();
    }
    }
  • 相关阅读:
    正则表达式
    字节流和字符流小练习
    File汇总
    java一不容易就容易错的知识点汇总
    a++和++a区别
    线程安全的3种方式
    bs4和css选择器的基本使用
    清点作业情况
    cookie和session的使用
    用post请求制作翻译
  • 原文地址:https://www.cnblogs.com/cubika/p/2808533.html
Copyright © 2011-2022 走看看