JDBC

JDBC的全程是Java Database Connectivity 即Java数据库连接。
JDBC的驱动通常有如下四种类型:
  • 第一种JDBC驱动:称为JDBC-ODBC桥,这种驱动是最早实现的JDBC驱动程序,主要目的是为了快速推广JDBC。这种驱动程序将JDBC API映射到ODBC API。 JDBC-ODBC也需要驱动,这种驱动由Sun公司提供实现。
  • 第二种JDBC驱动:直接将JDBC API映射成数据库特定的客户端API。这种驱动程序包含特定数据库的本地代码,用于访问特定数据库的客户端。
  • 第三种JDBC驱动:支持三层结构的JDBC访问方式。主要用于Applet阶段,通过Applet访问数据库。
  • 第四种JDBC驱动:是纯Java的,直接与数据库实例交互。这种驱动是只能的,它知道数据库使用的底层协议。这种驱动是目前最流行的JDBC驱动。
 
通常建议选择第四种JDBC驱动,这种驱动避开了本地代码,减少了应用开发的复杂性,也减少了产生冲突和出错的可能。但如果对性能有严格的要求,可以考虑使用第二种驱动,但使用这种驱动,则势必增加编码和维护的困难。
相对于ODBC而言,JDBC更加简单。总结起来,JDBC比ODBC多了几个优势:
  • ODBC更复杂,ODBC中有几个命令需要配置很多复杂的选项,而JDBC则采用简单、直观的方式来管理数据库连接。
  • JDBC比ODBC安全性更高,更易部署。
 
JDBC提供了独立于数据库的统一API,用于执行SQL命令。JDBC API由以下常用的接口和类组成:
  • DriverManager 用于管理JDBC驱动的服务类。程序中使用该类的主要功能是获取Connection对象,该类包含如下方法:
    • public static synchronized Connection getConnection( String url, String user, String pass) throws SQLException:该方法获得url 对应的数据库连接。
  • Connection 代表数据库连接对象,每个Connection 代表一个物理连接会话。该接口常用方法有:
    • Statement createStatement() throws SQLException: 该方法返回一个Statement对象。
    • PreparedStatement prepareStatement( String sql) throws SQLException : 该方法返回预编译的Statement对象,即将SQL豫剧提交到数据库进行预编译。
    • CallableStatement prepareCall( String sql ) throws SQLException : 该方法返回CallableStatement对象,该对象用于调用存储过程。
  • 以上三个方法都是返回用国语SQL豫剧的Statement对象,PreparedStatement、CallableStatement是Statement的子类。只有获得了Statement之后才可执行SQL语句。
  • 除此之外,Connection还有如下几个用于控制事务的方法:
    • Savepoint setSavepoint() : 创建一个保存点。
    • Savepoint setSavepoint(String name): 以指定名字来创建一个保存点。
    • void setTransactionlsolation( int level) : 设置事务的隔离级别。
    • void rollback() : 回滚事务。
    • void rollback( Savepotion savepoint) :将事务回滚到指定的保存点。
    • void setAutoCommit(boolean autoCommit): 关闭自动提交,打开事务。
    • void commit() : 提交事务。
 
Statement 用于执行SQL语句的工具接口。该对象即可以用于执行DDL、DCL语句,也可以用于执行DML语句,还可适用于执行SQL查询。当执行SQL查询时,返回查询到的结果集。它的常用方法如下:
  • ResultSet executeQuery(String sql )throws SQLException:该方法用于执行查询语句,并返回查询结果对应的ResultSet对象。该方法只能用于执行查询语句。
  • int executeUpdate (String sql) throws SQLExcetion: 该方法用于执行DML语句,并返回受影响的行数;该方法也可用于执行DDL,执行DDL将返回0。
  • boolean execute(String sql) throws SQLExcepton : 该方法可执行后第一个结果为受影响的行数或没有任何结果,则返回false。
 
PreparedStatement。预编译的Statement对象。PreparedStatement是Statement的子接口,它允许数据库预定义SQL,以后每次只改变SQL命令的参数,避免数据库每次都需要编译SQL语句,因此性能更好。相对于Statement而言,使用PreparedStatement执行SQL语句传入参数值,所以它比Statement多了如下方法:
void setXxx( int parameterIndex,Xxx value) : 该方法根据传入参数值的类型不同、需要使用不同的方法。传入的值根据索引传给SQL语句中的指定位置的参数。
 
PreparedStatement 同样有executeUpdate、executeQuery 和 execute 三个方法,只是这三个方法无需接收SQL字符串,因为PreparedStatement对象已经预编译了SQL命令,只要为这些命令传入参数即可。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "root";
Connection conn = null;
            
//2.获取与数据库的链接
conn = DriverManager.getConnection(url, username, password);

Statement st = null;
//3.获取用于向数据库发送sql语句的statement
st = conn.createStatement();

//4.向数据库发sql
String sql = "select id,name,password,email,birthday from users";
st.executeQuery(sql);


PreperedStatement st = null;
String sql = "select * from users where name=? and password=?";
 
//3.获取用于向数据库发送sql语句的Preperedstatement
st = conn.preparedStatement(sql);//在此次传入,进行预编译
st.setString(1, username);
st.setString(2, password);
//4.向数据库发sql
st.executeQuery();//在这里不需要传入sql



ResultSet rs = null;
//4.向数据库发sql,并获取代表结果集的resultset
String sql = "select id,name,password,email,birthday from users";
rs = st.executeQuery(sql);
            
//5.取出结果集的数据
rs.afterLast();
rs.previous();
System.out.println("id=" + rs.getObject("id"));
System.out.println("name=" + rs.getObject("name"));
System.out.println("password=" + rs.getObject("password"));
System.out.println("email=" + rs.getObject("email"));
System.out.println("birthday=" + rs.getObject("birthday"));


//循环取出(id)
while(rs.next())
{
    String id=rs.getString(1);//1代表数据库中表的列数,id在第一列也可以("id")!!!
    System.out.println(id+" ");
}


if(rs!=null){
        try{
            rs.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
        rs = null;
    
    }
    if(st!=null){
        try{
            st.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
                
    }    
    if(conn!=null){
        try{
            conn.close();
        }catch (Exception e) {
            e.printStackTrace();
        }

}

 

 
 
 
 
 
 
 
 
 
 
 
 
 

posted @ 2021-03-03 19:34  year12  阅读(63)  评论(0)    收藏  举报