Java JDBC学习
要连接数据库,可以向java.sql.DriverManager要求并获得java.sql.Connection对象,Connection是数据库连接的具体代表对象,一个Connection对象就代表一个数据库连接,可以使用DriverManager的getConnection方法,制定JDBC URL作为自变量并获得Connection对象:
String url ="jdbc:mysql://localhost:3306/demo?" +
"user=root&password=123";
Connection conn = DriverManager.getConnection(url);
可以将JDBC URL、用户名称与密码等设置信息编写在一个属性文件中,由程序读取这个属性文件中的信息,如果需要变更信息,则只需要修改属性文件,无需修改程序、重新编译。在 Java SE中,属性文件的读取可以交给java.util.Properties类。
在数据库应用程序中,数据库连接的获得是一个耗费时间与资源的操作,包括了建立 Socket connection 、交换数据(用户密码验证、相关参数)、会话(Session)、日志(Loggin)、分配进程(Process)等资源。
如果数据库的操作是很频繁的动作,则要考虑到重复使用连接的需求,以节省在获得连接时的时间与资源,通常会实现一个连接池,有需要连接时可以从池中获得,不需要连接时就将连接放回池中,而不是直接关闭连接。
使用JDBC进行数据操作
表数据操作的基本技术如下:
1. Statement类用于执行静态SQL语句并反悔它所生成结果的对象。一个Statement对象只能打开一个ResultSet对象。
2. Statement类的execute(String sql)方法执行给定的SQL语句,它的返回值类型为boolean。标志如果第一个结果为ResultSet对象,返回true,如果其为更新计数或不存在任何结果,返回false。
3. Statement类的executeQuery(String sql)方法用于执行查询SQL语句,返回查询的结果集,一个ResultSet对象。
4. ResultSet的next()方法的作用是将指针从当前位置向下移动一行。它的返回值类型为boolean,表示如果新的当前行不为Null,则返回true,负责返回false,此方法通常用于while语句并作为判断是否存在数据的依据。
5. ResultSet的getString(String columnName)方法的作用是以字符串的形式返回ResultSet对象的当前行中指定列名的值。
6. Statement类的executeUpdate(String sql)方法用于执行更新SQL语句,包括插入、修改和删除语句,返回一个int值,表示更新的行的计数。
7. ResultSetMetaData接口的作用是获取ResultSet对象中列的类型和属性信息。由于ResultSetMetaData是接口,所以没有构造函数,所以不能使用new创建ResultSetMetaData对象,但是可以通过ResultSet的getMetaData()创建,如
String sql = "select ...";
Statement sm = null;
sm = con.getStatement();
ResultSet= sm.executeQuery(sql);
ResultSetMetaData md = rs.getMetaData();
8.ResultSetMetaData的getColumnName(int column)可以获取指定列的名称,其中column指的是列数。
9. ResultSetMetaData的getColumnTypeName(int column)返回检索指定列的数据库特定的类型名称,其中column指的是列数。
10. ResultSetMetaData的isNullable(int column)的作用是说明指定列中的值是否可以为null,其中column指的是列数。
批处理:
1. DatabaseMetaData接口是描述有关数据库的整体综合信息,由于DatabaseMetaData是接口,所以没有构造方法,故不能用new来创建DatabaseMetaData对象,但是可以通过Connection 的getMetaData()方法来创建。例如:
DatabaseMetaData = con.getMetaData();
2. DataBaseMetaData类的supportsBatchUpdates方法用于判断此数据库是否支持批量更新。其返回值为boolean。
3. Statement的addBatch(String sql)方法将给定的SQL命令添加至此Statement对象的当前命令列表中,此方法可多次调用。
4. Statement的executeBatch()方法的作用是将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
public static int[] startBatch(Connection con ,String[] sqls) throws Exception
{
if(sqls == null) return null;
Statement sm = con.createStatement();
for(int i = 0 ; i<sqls.length; i++)
{
sm.addBatch(sqls[i]);
}
return sm.executeBatch();
}
函数调用结果:
int[] results = startBatch(con,sqls);
for(int i = 0;i<sqls.length ;i++)
{
if(results[i] >0 ) System.out.println("语句" + sqls[i] + "执行成功,影响了" +results[i] + "行数据");
else if(results[i] == Statement.SUCCESS_NO_INFO) System...影响的函数未知;
else if( results[i] == Statement.EXCUTE_FAILED) 执行失败;
}
事务处理:
1. DatabaseMetaData的supportsTransactions()方法可以判断数据库是否支持事物。它的返回值类型为boolean。
2. 数据库连接Connection对象默认是自动提交的。为了控制事务提交,则需在事务提交之前,调用Connection的setAutoCommit(boolean autoCommit)方法关闭数据库连接的自动提交模式,其中参数autoCommit为true,表示启用自动提交模式;为false,表示禁用该模式。以后只有调用Connection的commit方法,才会将所有的操作提交到数据库。
3. Connection的rollback方法,执行回滚操作,其作用是如果一同进行操作的语句,有一条出现了错误,那么其他的语句也会操作无效。使用此方法时,需要注意的是只能在setAutoCommit(false)的模式下使用。
try
{
System.out.println("事物开始");
con.setAutoCommit(false);
sm = con.createStatement();
for(int i = 0;i<sqls.length;i++)
{
sm.execute(sqls[i]); //执行sql语句,但没更新到数据库
}
System.out.println("事物提交");
con.commit();
System.out.println("事物结束");
}
catch(SQLException e)
{
con.rollback(); //出现异常时,进行回滚操作,取消前面执行的操作。
}