JDBC
一.JDBC概述
JDBC(java database connectivity)是SUN公司提供的一套操作数据库的标准规范。
JDBC与数据库驱动的关系:接口与实现类的关系。MySQL驱动就是遵守JDBC规范的一个数据库驱动。
二.JDBC的核心对象
1.DriverManager:用于注册数据库驱动的类。使用DriverManager对象可以创建用于连接数据库的Connection对象。DriverManager对象可以连接JDBC支持的所有数据库,连接之后依据不同的数据库选择不同的接口实现类进行数据库操作。
注册数据库驱动的代码如下
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
但是不建议使用此方式注册驱动,原因如下
1.此方式导致驱动被注册2次,造成DriverManager中产生两个一样的驱动
2.此方式强烈依赖数据库的驱动jar。
解决办法:利用反射技术通过完整类名将类加载到内存
Class.forName("com.mysql.jdbc.Driver");
2.Connection: 用于与数据库建立的连接的接口。使用Connection对象可以创建用于操作数据库的对象,例如Statement对象。
建立数据库连接的代码如下
static DriverManager.getConnection(String url, String user, String password);
Connection对象的常用方法如下
createStatement():创建向数据库发送sql的statement对象。
prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
setAutoCommit(boolean autoCommit):设置事务是否自动提交。默认为true。
commit() :在此连接上提交事务。
rollback() :在此连接上回滚事务。
void close();关闭Connection对象,释放资源。
3.Statement: 用于向数据库发送sql语句的接口。使用Statement对象可以让数据库执行SQL语句,并返回相应SQL语句的执行结果。如果执行SQL查询语句,会返回查询的结果集ResultSet对象。如果执行SQL增删改语句,会返回执行SQL后数据库受影响的行数的int类型对象。
Statement对象常用方法如下
ResultSet executeQuery(String sql) 根据查询语句返回ResultSet结果集。只能执行select语句。
int executeUpdate(String sql) 执行(insert update delete)语句,返回受影响的行数。
boolean execute(String sql) 此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false。
void close();关闭Statement对象,释放资源。
注意:在使用Statement对象书写SQL语句时,如果数据库是字符类型,传递的参数需要加上单引号。与使用命令行窗口书写的SQL语句相同。
4.ResultSet: 用于获得结果集的接口。使用Statement对象执行查询SQL语句后会得到ResultSet对象。ResultSet对象类似于一张表格,例如在命令行窗口(cmd)执行查询SQL语句后,命令行窗口会打印出一张表格,表格里显示SQL语句的查询结果,ResultSet对象和表格非常类似。我们可以把ResultSet对象的结果集叫做表格。
ResultSet对象提供一个游标,默认游标指向表格第一行之前。我们可以使用代码将游标切换到表格的任意一行上,然后使用代码取出这一行上任意一列的数据。
ResultSet对象切换游标到表格的任意一行的方法如下
boolean next();将光标从当前位置向下移动一行。
boolean previous();将光标从当前位置向上移动一行。
boolean absolute(int row);根据行的索引定位移动到指定索引行。行的索引从1开始。如果给定行编号为负,则将指针移动到相对于结果集末尾的绝对行位置。如果指针位于结果集上,则返回 true;否则返回 false。
void afterLast();将光标移动到末尾,正好位于最后一行之后。
void beforeFirst();将光标移动到开头,正好位于第一行之前。
ResultSet对象获取游标所在的行上的任意一列数据的方法如下。注意:要根据数据库字段的类型选择不同的方法获取数据,否则可能出现异常。
Object getObject(int ColumnIndex); 根据序号取值,索引从1开始。
Object getObject(String ColomnName); 根据列名取值。
int getInt(int colIndex);以int形式获取ResultSet结果集当前行指定列号的值。
int getInt(String colLabel);以int形式获取ResultSet结果集当前行指定列名的值。
float getFloat(int colIndex);以float形式获取ResultSet结果集当前行指定列号的值。
float getFloat(String colLabel);以float形式获取ResultSet结果集当前行指定列名的值。
String getString(int colIndex);以String 形式获取ResultSet结果集当前行指定列号的值。
String getString(String colLabel);以String形式获取ResultSet结果集当前行指定列名的值。
Date getDate(int columnIndex); 以Date 形式获取ResultSet结果集当前行指定列号的值。
Date getDate(String columnName);以Date形式获取ResultSet结果集当前行指定列名的值。
关闭ResultSet 对象的方法如下
void close();关闭ResultSet 对象,释放资源。
5.PreparedStatement:SQL语句预编译对象, 是Statement对象的子接口。除了拥有Statement对象的功能外,PreparedStatement对象还可以防止SQL注入。
PreparedStatement对象的特点:性能要高,执行SQL语句前会先编译SQL语句达到过滤掉用户输入的关键字的作用,SQL语句中的参数可以自定义。
PreparedStatement对象的常用方法如下
通过Connection对象获取PreparedStatement对象,在SQL语句中使用?代表需要设置的参数
PreparedStatement prestate = Connection.prepareStatement("select * from user where username=?");
为SQL语句设置参数,索引从1开始。注意:要根据数据库字段的类型选择不同的方法设置参数,否则可能出现异常。
prestate.setString(1, "ABC");
执行SQL语句操作
ResultSet result = prestate.executeQuery();
关闭PreparedStatement对象的方法如下
void close();关闭PreparedStatement对象,释放资源。
6.ResultSetMetaData:用于获得结果集表格基本数据的接口,是ResultSet对象的子接口。
获取ResultSetMetaData对象的方法如下
ResultSetMetaData rsmd = ResultSet.getMetaData();
ResultSetMetaData对象的常用方法如下
int getColumCount() throws SQLException;获得结果集字段的数目
String getColumName (int colum) throws SQLException;根据字段的索引值取得字段的名称
String getColumType (int colum) throws SQLException;根据字段的索引值取得字段的类型,返回值的定义在java.sql.Type类
boolean isReadOnly(int colum);获取指定字段是否为只读值
boolean isNullable(int colum);获取指定字段是否可以存储NULL