那些名词:
- JDBC API:应用程序开发者使用的api.
- JDBC驱动管理器:Sun公司为第三方驱动程序提供的驱动管理器.
- JDBC驱动程序:由第三方供应商提供的java与数据库连接的桥梁.
- JDBC驱动api:Sun公司为数据库开发人员提供的驱动开发api.
详情如下图所示:
JDBC配置:
- 下载驱动,如mysql-connector*.jar等,为一个jar文件
- 注册驱动器类:
/*从供应商下载的驱动器类名为com.mysql.jdbc.Driver,
解压jar包可以找到Driver.class其路径即是名字*/
//法一:
Class.forName("com.mysql.jdbc.Driver");
//法二:
System.SetProperty("jdbc.drivers","com.mysql.jdbc.Driver");
- 连接到数据库:
//mysql -->修改为你的数据库名字
//127.0.0.1:3306 --> 访问数据库的地址
//world访问的数据库的名字
String url = "jdbc:mysql://127.0.0.1:3306/world";
//数据库用户名,必须有权限访问world
String userName = "root";
//数据库用户密码
String password = "root";
Connection conn = DriverManager.getConnection(url,userName,password);
使用连接,以下详细讲解
关闭连接
if(conn != null){
conn.close();
}
使用数据库:
- Statement的使用
//一个连接可以创建多个Statement,但每个Statement只能打开一个结果集
Statement st1 = conn.createStatement();
//执行查询只能使用executeQuery
ResultSet rs1 = st1.executeQuery("SELECT * FROM myTable");
...
//Statement与ResultSet使用完应该及时关闭
rs1.close();
st1.close();
//执行其他操作使用executeUpdate,其不返回结果集
Statement st2 = conn.createStatement();
st2.executeUpdate("INSERT INTO myTable(name,age) values("haha",10)");
- PreparedStatement:用于批量查询或更新等操作,每次操作只需重新设置?的值,然后查询即可
String preparedSql = "SELECT FROM myTable where age = ?",name = ?)
PreparedStatement ps = conn.prepareStatement(preparedSql);
//将第一个?设为24
ps.setInt(1,24);
//将第二个?设为"haha"
ps.setObject(2,"haha");
//执行查询
ResultSet rs = ps.executeQuery();
/*也可以 ps.execute();
rs = ps.getResultSet();*/
- ResultSet:类似迭代器,但其初始位置指向第一行前,然后调用next()指向下一行(迭代器则是跨过下一行),若无下一行则next()方法返回false。所以第一行数据应该是rs.next()然后执行rs.getObject(index);而不是直接执行rs.getObject(index).index为查询行数据的列号,起始值为1。
注意事项:
- Statement执行语句时,对于String变量应该用单引号包含,否则语句无法执行。
String name = "BOB";
st.executeQuery("delete from message where name = '"+name+"')");
PreparedStatement采用预编译的形式,所以在多次执行的时候,效率明显高于Statement,但单条语句还是建议使用Statement。
可滚动的结果集:默认情况下结果集将一直调用next()方法直到该方法返回false,不能回滚到上一行。
Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = st.executeQuery();
PreparedStatement st1 = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs1 = st1.executeQuery();
/*则两个结果集均可调用previous()回滚到上一行,并可用relative(n),向下滚动|n|行(n>0)或回滚|n|行(n<0).
absolute(x),将直接定位至第x行*/
- 可更新的结果集:
Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = st.executeQuery();
/*
结果集可以调用rs.update("name","Bob");+rs.updateRow();更新行数据。可以调用rs.deleteRow()删除当前指针所指的行。
调用getConcurency()查看当前结果集是否可更新。
*/