JDBC为java访问数据库提供通用的API,可以为多种关系数据库提供统一访问。因为SQL是关系式数据库管理系统的标准语言,只要我们遵循SQL规范,那么我们写的代码既可以访问MySQL又可以访问SQL Server.
简单的说,JDBC可以做三件事:
java.sql.DriverManager:用来加载不同的JDBC驱动程序并且为创建的新的数据库连接提供支持;
java.sql.Connection:完成对某一指定数据库的连接功能;java.sql.Statement:在一个已经创建的连接(java.sql.Connection)中作为执行SQL语句的容器;它包含了两个重要的子类:
java.sql.PreparedStatement:用于执行预编译的SQL语句;
java.sql.CallableStatement:用于执行数据库中已经创建好的存储过程(Stored Procedure)。
java.sql.ResultSet:代表特定SQL语句执行后的数据库结果集。
这些类我们可以参考JDK API,里面有非常详细的说明。并且是中文的^_^
1.URL
JDBC URL的标准语法如下下所示。他们之间由冒号分隔:
<协议jdbc>:<子协议>:<子名称>
<协议>:JDBC URL中的协议总是jdbc。
<子协议>:驱动程序名或数据库连接机制的名称。例如:mysql
<数据源>:包含要连接数据库的主机、端口、名称、用户名、密码等信息。
例如mysql连接的URL格式为:
jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][¶m2=value2]….
有一点说明,mysql端口号(port)可以通过如下方式查询:
mysql>show global variables like 'port';
2.使用DriverManager管理驱动类
Class.forName("com.mysql.jdbc.Driver");
3.连接管理
设置不自动提交:conn.setAutoCommit(false);
提交数据:conn.commit();
回滚数据:conn.rollback();
设置自动提交:conn.setAutoCommit(true)。
关闭连接:conn.close();
下面是一个测试连接SQL的例子:
发送SQL"show databases",并显示结果。
public static void testConn() throws SQLException {
Connection conn = getConn("root", "", "");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("show databases");
while (rs.next()) {
System.out.println(rs.getString(""));
}
stmt.close();//显示关闭Statement对象,释放资源
conn.close();
//关闭数据库连接,这是个好习惯。尽管在程序运行结束会自动关闭。但web应用是不会结束运行的。
}
与数据库建立连接
public static Connection getConn(String username, String password,
String DBname) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/" + DBname;
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
创建一个DatabaseMetaData对象
DatabaseMetaData datameta=conn.getMetaData();
1.获取数据库中各个表的情况
ResultSet getTables(String catalog, String schemaPattern, String
tableNamePattern, String types[]);
catalog指的是数据库
schemaPattern是数据库的用户
tableNamePattern是表名
types指的是table、view等
getTables方法返回一个ResultSet对象,每一条记录是对一个表的描述。只有那些符合参数要求的表才被返回。结果集的每一行有8个字段,其中第三个为表名称。
获取数据库中的表名字
public static String[] getTableNames(String DBname, Connection conn) {
String[] tables = null;
try {
DatabaseMetaData DBmeta = conn.getMetaData();
String types[] = { "TABLE" };
ResultSet rs = DBmeta.getTables(DBname, null, null, types);
List<String> ls = new ArrayList<String>();
int i = 0;
while (rs.next()) {
ls.add(rs.getString(3));
i++;
}
tables = new String[i];
ls.toArray(tables);
} catch (SQLException e) {
e.printStackTrace();
}
return tables;
}
2. 获取表中各列的信息
ResultSet getColumns(String catalog, String schemaPattern, String
tableNamePattern, String types[]);
getColumns返回一个ResultSet类的对象,其中每一行是对一个字段的描述,只有符合参数要求的列才被返回。
每一行的字段信息为:数据库名、数据库扩展名、表名、字段名
获取表的所有字段名字
public static String[] getFieldsNames(String tableName, Connection conn) {
String[] fields = null;
try {
DatabaseMetaData DBmeta = conn.getMetaData();
ResultSet rs = DBmeta.getColumns(null, null, tableName, null);
List<String> ls = new ArrayList<String>();
int i = 0;
while (rs.next()) {
ls.add(rs.getString(4));
i++;
}
fields = new String[i];
ls.toArray(fields);
} catch (SQLException e) {
e.printStackTrace();
}
return fields;
}
3. 获取关于索引的信息
ResultSet getIndexInfo(String catalog, String schema, Boolean unique, boolean approximate);
getIndexInfo方法返回一个ResultSet类的对象,其中每一行是对一个索引的描述,只有符合参数要求的索引才被返回。
Statement对象发送SQL语句
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
Statement接口提供了三种执行SQL的语句的方法: