• 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();//并不是真正关闭,而是把该连接归还到连接池
            }
        }
    }
    
  • 相关阅读:
    open("","r")与open("","rb")的效率区别
    readline与readlines不能同时使用
    for i in xrange(0,5)使用过程中遇到的问题
    xrange()与range()
    Maven install 、 Maven package 与 Maven clean package 的区别
    Java--mv clean package命令
    Java----如何解决下载依赖包失败问题
    Jmeter工具学习(六)-- 逻辑控制器 While Controller(转载)
    Jmeter工具学习(五)--JDBC Request执行多条SQL语句
    Sqlmap POST注入 三种方法(转载)
  • 原文地址:https://www.cnblogs.com/fly-book/p/11531619.html
Copyright © 2020-2023  润新知