JDBC对象介绍
JDBC中的主要类
- DriverManager;
- Connection;
- Statement;
- ResultSet;
DriverManager:
- Class.forName(“com.mysql.jdbc.Driver”);//注册驱动
- String url = “jdbc:mysql://localhost:3306/mydb1”;
- String username = “root”;
- String password = “123”;
- Connection con = DriverManager.getConnection(url, username, password);
上面5句代码容易出现的异常
ClassNotFountException:第一句容易出现,一般两个原因
- 没有导入对应的数据库驱动jar包
- 类名打错了
SQLException:这个异常出现在第5句,三个参数出错
Connection:
最为重要的方式 createStatement()
Statement st=Connection.createStatement();//无参方法获得statement对象
还有一个有参重载函数,来确定生成对应的结果集
Statement st=Connection.createStatement(int,int);//无参方法获得statement对象
两个参数具体含义,在后面ResultSet中说明
Statement:
语句发送器拥有两个最为重要的方法
- int executeUpdate(String sql):用来执行更新操作,包括DML(insert、update、delete)和DDL(create、drop、alter),返回影响的行数;
- ResultSet executeQuery(String sql):用来执行select查询,返回包含查询的结果集
除了上面两个常用的方法还有一个 boolean execute(String sql),可以执行executeUpdate(String sql)和executeQuery(String sql)两个方法的语句。但是返回是Boolean,表示是否有结果集。可以通过getUpateCount来获取增删改影响的行数;通过getResultSet()来获取查询结果集。
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//jdbc:mysql://ip:端口号/数据库名
String url="jdbc:mysql://localhost:3306/sql_test";
String username="root";
String password="123456";
//在try外引用定义,可以在finally中操作
Connection cn=null;
Statement statement=null;
ResultSet res=null;
boolean isRes=false;
try{
cn= DriverManager.getConnection(url,username,password);
statement=cn.createStatement();
//查询
String sql_select="select * from jsdbtest";
//查询返回的是结果集
isRes=statement.execute(sql_select);
if(isRes){
res=statement.getResultSet();
}
while(res.next()){
//可以通过属性名来获取值
String name=res.getString("name");
//也可以通过列标来获取
String sex=res.getString(3);
int age=res.getInt("age");
System.out.println(name+","+sex+","+age);
}
}catch(Exception e){
throw new RuntimeException(e);
}finally {
//先判断是否实例化,防止空指针异常
if(res!=null) res.close();
if(statement!=null)statement.close();
if(cn!=null) cn.close();
}
}
ResultSet
结果集特性:
- 是否可滚动
- 是否敏感
- 是否可更新
当使用Connection的createStatement时,可以确定结果集的特性
Connection.createStatement():生成的结果集:不滚动、不敏感、不可更新
Connection.createStatement(int resultSetType, int resultSetConcurrency):
第一个参数:
- ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;
- ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;
- ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据会跟随数据库而变化;
对于敏感这个感念可以参考 TYPE_SCROLL_SENSITIVE问题
第二个参数:
- CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;
- CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新可以反向影响数据库。
ResultSet是一个二维表,内部维护一个行光标,拥有以下方法
- void beforeFirst():把光标放到第一行的前面,这也是光标默认的位置;
- void afterLast():把光标放到最后一行的后面;
- boolean first():把光标放到第一行的位置上,返回值表示调控光标是否成功;
- boolean last():把光标放到最后一行的位置上;
- boolean isBeforeFirst():当前光标位置是否在第一行前面;
- boolean isAfterLast():当前光标位置是否在最后一行的后面;
- boolean isFirst():当前光标位置是否在第一行上;
- boolean isLast():当前光标位置是否在最后一行上;
- boolean previous():把光标向上挪一行;
- boolean next():把光标向下挪一行;
- boolean relative(int row):相对位移,当row为正数时,表示向下移动row行,为负数时表示向上移动row行;
- boolean absolute(int row):绝对位移,把光标移动到指定的行上;
- int getRow():返回当前光标所有行。
其中1-9是通用的,无参函数createStatement(),在10-13中可以使用next();其他的是滚动模式可以使用。
获取结果集元数据
- 得到元数据:rs.getMetaData(),返回值为ResultSetMetaData;
- 获取结果集列数:int getColumnCount()
- 获取指定列的列名:String getColumnName(int colIndex)
结果集元素据使用方法
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//jdbc:mysql://ip:端口号/数据库名
String url="jdbc:mysql://111.230.144.70:3306/sql_test";
String username="root";
String password="123456";
//在try外引用定义,可以在finally中操作
Connection cn=null;
Statement statement=null;
ResultSet res=null;
boolean isRes=false;
try{
cn= DriverManager.getConnection(url,username,password);
statement=cn.createStatement();
//查询
String sql_select="select * from jsdbtest";
//查询返回的是结果集
isRes=statement.execute(sql_select);
if(isRes){
res=statement.getResultSet();
}
while(res.next()){
//得到结果集元数据对象
ResultSetMetaData rm=res.getMetaData();
//得到结果集行数
int countNum=rm.getColumnCount();
//这里需要注意行标从1开始
for(int i=1;i<=countNum;i++){
//getString()和getObject()方法是通用的
System.out.print(res.getString(i)+" ");
}
System.out.println(",");
}
}catch(Exception e){
throw new RuntimeException(e);
}finally {
//先判断是否实例化,防止空指针异常
if(res!=null) res.close();
if(statement!=null)statement.close();
if(cn!=null) cn.close();
}
}
通过结果集元数据可以轻松遍历结果集所有数据