JDBC主要功能如下:
- 建立与数据库或者其他数据源的连接。
- 向数据库发送SQL命令
- 处理数据库的返回结果。
JDBC中常用的类和接口
- Connection: 连接到数据库。
- Statement: 建立操作指令。
- executeQuery: 执行查询指令。
- ResultSet: 获得查询结果。
建立连接的操作:
public static Connection getConnection() {
Connection con = null;
try {
Class.forName(driverName); //建立JDBC-ODBC桥接器
con = DriverManager.getConnection(dbURL,userName,userPw); //建立连接。
}catch(Exception e) {
e.printStackTrace();
}
//返回建立的连接对象
return con;
}
查询操作
-
向数据库发送SQL查询语句
首先使用Satement声明一个SQL语句对象,然后让已创建的连接对象con调用方法createStatement()创建这个SQL语句对象:
Statement sql = con.createStatement();
-
处理查询结果
有了SQL语句对象后,就可以调用相应的方法实现对数据库中表的查询和修改,并将查询结果存放在一个Result类声明的对象中。也就是说SQL查询语句对数据库的查询操作将返回一个ResultSet对象,ResultSet对象是由统一形式的列组织的数据行组成。
ResultSet rs = sql.executeQuery(SQL查询语句);
ResultSet 对象一次只能看到一个数据行,实用next()方法移到下一行数据行,获得一行数据后,ResultSet对象可以实用getXxx方法获得字段值(列值),将位置索引或列名传递给getXxx方法即可。
无论字段是何种属性,总可以使用getString(int columnIndex)或getString(String columnName)方法返回字段值的串表示。
当使用ResultSet的getXxx方法查看一行记录时,不可以颠倒字段的顺序。
查询stu表中学生信息
Connection con = DBUtil.getConnection();
try {
Statement sql = con.createStatement();
ResultSet rs = sql.executeQuery("SELECT * FROM stu");
while(rs.next()) {
System.out.println(rs.getString("id") + " " + rs.getString("name") + " "+ rs.getString("phone"));
}
}catch(Exception e) {
e.printStackTrace();
}
}
顺序查询
查询表中字段信息:
当创建好连接对象con之后,那么该连接对象调用getMetaData()方法可以返回一个DatabaseMetaData对象:
DatabaseMetaData metadata = con.getMetaData();
Metadata对象再调用getColumns可以将表的字段信息以行列的形式存储在一个ResultSet对象:
ResultSet tableMessage = metadata.getColumns(null,null,"goods",null);
如果表中由n个字段,tableMessage就刚好有n行,每行4列,每行分别含有和相应字段有关的信息。信息的次序为:“数据库名”、“数据库扩展名”、“表名“、“字段名”。
tableMessage对象调用next方法使游标向下移动一行(游标的初始位置在第一行之前),然后tableMessage调用getXXX方法可以查看该行中列的信息,其中最重要的信息是第4列,该列上的信息为字段的名字。
获取表中字段信息
Connection con = DBUtil.getConnection();
try {
DatabaseMetaData metadata = con.getMetaData();
ResultSet tableMessage = metadata.getColumns(null, null, "stu", null);
while(tableMessage.next()) {
System.out.println(tableMessage.getString(1) + tableMessage.getString(2) + tableMessage.getString(3) + tableMessage.getString(4 ));
}
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("成功");
控制游标
有时候需要在结果集中前后移动、显示结果集中的某条记录或随机显示若干条记录时,必须要返回一个可滚动的结果集,为了得到一个可滚动的结果集,需使用下述方法获得一个Statement对象。
Statement stmt = con.createStatement(int type, int concurrency);
然后根据参数type、concurrency的取值情况,stmt返回相应类型的结果集。
Result re = stmt.executeQuery(SQL语句);
type的取值决定滚动方式,取值可以是:
取值 | 含义 |
---|---|
ResultSet.TYPE_FORWORD_ONLY | 结果集的游标只能向下滚动。 |
ResultSet.TYPE_SCROLL | 结果集的游标可以上下移动,当数据库变化时,当前结果集不变。 |
ResultSet.TYPE_SCROLL_SENSITIVE | 返回可滚动的结果集,当数据库变化时,当前结果集同步改变 |
取值 | 含义 |
---|---|
ResultSet.CONCUR_READ_ONLY | 不能用结果集更新数据库中的表 |
ResultSet.CONCUR_UPDATABLE | 能用结果集更新数据库中的表 |
Concurrency取值决定是否可以用结果集更新数据库,Concurrenct取值:
取值 | 含义 |
---|---|
ResultSet.CONCUR_READ_ONLY | 不能用结果集更新数据库中的表 |
ResultSet.CONCUR_UPDATABLE | 能用结果集更新数据库中的表 |
方法名 | 含义 |
---|---|
public boolean previous() | 将游标向上移动,该方法返回boolean型数据,当移动结果集第一行之前时返回false。 |
public void beforeFirst | 将游标移动到结果集的初始位置,即在第一行之前。 |
public void afterLast() | 将游标移动到结果集最后一行之后。 |
public void first() | 将游标移动到结果集的第一行 |
public void last() | 将游标移动到结果集的最后一行 |
public boolean isAfterLast() | 判断游标是否在最后一行之后。 |
public boolean isBeforeFirst() | 判断游标是否在第一行之前。 |
public boolean isFirst() | 判断游标是否指向结果集的第一行。 |
public boolean isLast() | 判断游标是否指向结果集的最后一行 |
public int getRow() | 得到当前游标所指行的行号,行号从1开始,如果结果集没有行,返回0 |
public boolean absolute(int row) | 将游标移到参数row指定的行 |
滚动查询经常用到ResultSet的下述方法。
方法名 | 含义 |
---|---|
public boolean previous() | 将游标向上移动,该方法返回boolean型数据,当移动结果集第一行之前时返回false。 |
public void beforeFirst | 将游标移动到结果集的初始位置,即在第一行之前。 |
public void afterLast() | 将游标移动到结果集最后一行之后。 |
public void first() | 将游标移动到结果集的第一行 |
public void last() | 将游标移动到结果集的最后一行 |
public boolean isAfterLast() | 判断游标是否在最后一行之后。 |
public boolean isBeforeFirst() | 判断游标是否在第一行之前。 |
public boolean isFirst() | 判断游标是否指向结果集的第一行。 |
public boolean isLast() | 判断游标是否指向结果集的最后一行 |
public int getRow() | 得到当前游标所指行的行号,行号从1开始,如果结果集没有行,返回0 |
public boolean absolute(int row) | 将游标移到参数row指定的行 |
条件查询
更新、添加与删除操作
Statement对象调用方法:
public int executeUpdate(String sqlStatement);
通过参数sqlStatement指定的方式实现对数据库表中记录的更新、添加和删除操作。更新、添加和删除记录的SQL语法分别是:
UPDATE <表名> SET <字段名> = 新增 WHERE <条件子句>
INSERT INTO 表(字段列表) VALUES(对应的具体的记录)或INSETE INTO表(VALUES (对应的具体的记录)
DELETE FROM <表名> WHER <条件子句>
public class ModifyTable {
String datasourceName = "";
String SQL,message="";
public ModifyTable() {
}
public void setSQL(String SQL) {
this.SQL = SQL;
}
public String modifyRecord() {
Connection con = DBUtil.getConnection();
Statement sql = null;
try {
sql = con.createStatement();
sql.execute(SQL);
message = "操作成功";
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return message;
}
public class Main {
public static void main(String[] args) {
ModifyTable modify = new ModifyTable();
modify.setSQL("INSERT INTO stu(name,phone) VALUES ('KKK','17852179777')");
String backMess = modify.modifyRecord();
System.out.println(backMess);
}
}