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(); } }
Nice to see you all!