JDBC简单总结

几种常用数据库的JDBC URL

  • 对于 Oracle 数据库连接,采用如下形式:
    jdbc:oracle:thin:@localhost:1521:sid
  • 对于 SQLServer 数据库连接,采用如下形式:
    jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid
  • 对于 MYSQL 数据库连接,采用如下形式:
    jdbc:mysql://localhost:3306/sid

JDBC API

  • java.sql.DriverManager用来装载驱动程序,获取数据库连接。
  • java.sql.Connection完成对某一指定数据库的联接
  • java.sql.Statement在一个给定的连接中作为SQL执行声明的容器,他包含了两个重要的子类型。
  • Java.sql.PreparedSatement 用于执行预编译的sql声明
  • Java.sql.CallableStatement用于执行数据库中存储过程的调用
  • java.sql.ResultSet对于给定声明取得结果的途径

PreparedStatement

  • 可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象
  • PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
  • PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值

PreparedStatement vs Statement

  • 代码的可读性和可维护性.
  • PreparedStatement 能最大可能提高性能:
    • DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
    • 在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次.
    • (语法检查,语义检查,翻译成二进制命令,缓存)
  • PreparedStatement 可以防止 SQL 注入

jdbc连接(Driver):

import oracle.jdbc.driver.OracleDriver;

import java.sql.*;
import java.util.Properties;

public class JdbcUtilsTest {
    public static void main(String[] args) throws SQLException {
        Driver driver = new OracleDriver();
  String url = "";
        String username = "";
        String password = "";
        Properties info = new Properties();
        info.put("user",username);
        info.put("password",password);
        Connection connect = driver.connect(url, info);
        System.out.println(connect);
        connect.close();
    }
}

jdbc连接(DriverManager):

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JdbcUtilsTest2 {
    public static void main(String[] args) throws SQLException {
        String url = "";
        String username = "";
        String password = "";
        Connection conn = DriverManager.getConnection(url, username, password);
        System.out.println(conn);
        conn.close();
    }
}

使用 JDBC 驱动程序处理元数据

  • Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息。根据这些信息,JDBC可以访问一个实现事先并不了解的数据库。
  • 获取这些信息的方法都是在DatabaseMetaData类的对象上实现的,而DataBaseMetaData对象是在Connection对象上获得的。

DatabaseMetaData databaseMetaData = connection.getMetaData();

DatabaseMetaData 类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息:
  • getURL():返回一个String类对象,代表数据库的URL。
  • getUserName():返回连接当前数据库管理系统的用户名。
  • isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
  • getDatabaseProductName():返回数据库的产品名称。
  • getDatabaseProductVersion():返回数据库的版本号。
  • getDriverName():返回驱动驱动程序的名称。
  • getDriverVersion():返回驱动程序的版本号。
ResultSetMetaData 类

可用于获取关于 ResultSet 对象中列的类型和属性信息的对象:

  • getColumnName(int column):获取指定列的名称
  • getColumnCount():返回当前 ResultSet 对象中的列数。
  • getColumnTypeName(int column):检索指定列的数据库特定的类型名称。
  • getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。
  • isNullable(int column):指示指定列中的值是否可以为 null。
  • isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的。

取得数据库自动生成的主键

Connection conn = JdbcUtil.getConnection();

String sql = "insert into user(name,password,email,birthday) 
			values('abc','123','abc@sina.com','1978-08-08')";
PreparedStatement st = conn.
			prepareStatement(sql,Statement.RETURN_GENERATED_KEYS );

st.executeUpdate();
ResultSet rs = st.getGeneratedKeys();  //得到插入行的主键
if(rs.next())
	System.out.println(rs.getObject(1));

批量处理JDBC语句提高处理速度

当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率

  • addBatch(String):添加需要批量处理的SQL语句或是参数;
  • executeBatch();执行批量处理语句;
            
            pstmt = conn.prepareStatement(sql);
            for (int j = 0; j < 10000; j++) {
                pstmt.setString(2,name);
                pstmt.setString(3,phone);
                pstmt.addBatch();
            }
            pstmt.executeBatch();
            pstmt.clearBatch();

c3p0连接池


import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

public class JdbcUtilsTest3 {
    public static void main(String[] args) throws SQLException, PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        String url = "jdbc:oracle:thin:@10.10.6.86:1521/LHUAT";
        String username = "FSP_EAS";
        String password = "123456";
        dataSource.setDriverClass("oracle.jdbc.driver.OracleDriver");
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);
        dataSource.setAcquireIncrement(3);//连接数不足时,一次向数据库服务器申请的连接数
        dataSource.setInitialPoolSize(3);//初始化数据库连接池连接的数量
        dataSource.setMinPoolSize(3);//最小的连接数
        dataSource.setMaxPoolSize(10);//最大连接数
        dataSource.setMaxStatements(0);//可以维护的Statement个数
        dataSource.setMaxStatementsPerConnection(5);//每个连接同时可以使用的Statement对象的个数
        Connection conn = dataSource.getConnection();
        System.out.println(conn);
        if (conn!=null){
            conn.close();//并不是真正关闭,而是把该连接归还到连接池
        }
    }
}
原文地址:https://www.cnblogs.com/fly-book/p/11531619.html