第15章 Java数据库连接(JDBC) 15.1 创建数据源 15.2 JDBC-ODBC桥接器 15.3 顺序查询 15.1 创建数据源 15.2 JDBC-ODBC桥接器 15.3 顺序查询 15.4 可滚动结果集 15.5 排序查询 15.6 模糊查询 15.7 随机查询 15.8 更新、添加、删除记录 15.9 预处理语句 15.10 数据库访问中的套接字技术
JDBC JDBC(Java DataBase Connection)是Java数据库连接API。简单地说,JDBC能完成3件事: 与一个数据库建立连接。 向数据库发送SQL语句。 处理数据库返回的结果。
15.1 创建数据源 为了同数据库建立连接,首先要创建一个ODBC数据源。打开Windows中的控制面板,对于WindowXP,选择“性能和维护”→“管理工具”→“数据源(ODBC)” ;对于Window2000,选择“管理工具”→“数据源(ODBC)”;对于Window9X,选择 “数据源(ODBC)”。也可以使用“资源管理器”双击c:\windows\system32下的可执行文件“odbcad32”打开“数据源(ODBC)”。
建立数据源的步骤 打开“数据源(ODBC)”将出现ODBC数据源管理器对话框。 在ODBC数据源管理器对话框中选择“用户DSN”,然后单击“添加”按钮,将出现安装数据源的驱动程序对话框,可以在选择列表中选择相应的驱动程序。 在选择驱动程序对话框选择好驱动程序后,单击“完成”按钮,将出现创建数据源对话框。在该对话框中,你需要为创建的数据源起一个名称,并为你创建的数据源选择一个数据库。
15.2 JDBC-ODBC桥接器 为了要连接到这个数据库,我们首先要建立一个JDBC-ODBC桥接器: try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException e){ }
try{ Statement sql=con.createStatement(); Catch(SQLException e){ } 连接到数据库 try{ Connection con=DriverManager.getConnection ("jdbc:odbc:数据源名字","login name"," password "); } catch(SQLException e){ } 发送SQL语句 try{ Statement sql=con.createStatement(); Catch(SQLException e){ }
ResultSet rs=sql.executeQuery(“SQL语句”); 处理查询结果 ResultSet rs=sql.executeQuery(“SQL语句”); 例如: ResultSet rs=sql.executeQuery(“SELECT * FROM CJ”); ResultSet对象是一个管式数据集,即它是以统一形式的列组织的数据行组成。 ResultSet对象一次只能看到一个数据行,使用next()方法走到下一数据行,获得一行数据后, ResultSet对象可以使用位置索引或使用列名称,以便使用getXxx()方法获得字段值。 ResultSet对象的方法见表15.1
15.3 顺序查询 使用结果集ResultSet的next()方法,可以顺序的查询。一个结果集将游标最初定位在第一行的前面,第一次调用next()方法使游标移动到第一行。next()方法返回一个boolean型数据,当游标移动到最后一行之后返回false。 例15.1 注意:当使用ResultSet的getXxx方法查看一行记录时,不可以颠倒字段的顺序。
15.4 可滚动结果集 为了得到一个可滚动的结果集,必须使用下述方法先获得一个Statement对象: Statement stmt=con.createStatement (int type ,int concurrency); 然后,根据参数的type、concurrency的取值情况,stmt返回相应类型的结果集: ResultSet re=stmt.executeQuery(SQL语句);
type的取值决定滚动方式,取值情况如下: ResultSet.TYPE_FORWORD_ONLY 结果集的游标只能向下滚动。 ResultSet.TYPE_SCROLL_INSENSITIVE 结果集的游标可以上下移动,当数据库变化时,当前结果集不变。 ResultSet.TYPE_SCROLL_SENSITIVE 返回可滚动的结果集,当数据库变化时,当前结果集同步改变。
Concurrency 取值决定是否可以用结果集更新数据库,Concurrency取值: ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表。 ResultSet.CONCUR_UPDATETABLE 能用结果集更新数据库中的表。
滚动查询经常用到ResultSet的方法: public boolean previous() 将游标向上移动,该方法返回boolean型数据,当移到结果集第一行之前时返回false。 public void beforeFirst() 将游标移动到结果集的初始位置,即在第一行之前。 public void afterLast() 将游标移到结果集最后一行之后。 public void first() 将游标移到结果集的第一行。 public void last() 将游标移到结果集的最后一行。
滚动查询经常用到ResultSet的方法: public boolean isAfterLast() 判断游标是否在最后一行之后。 public boolean isBeforeFirst() 判断游标是否在第一行之前。 public boolean ifFirst() 判断游标是否指向结果集的第一行。 public boolean isLast() 判断游标是否指向结果集的最后一行。 public int getRow() 得到当前游标所指行的行号,行号从1开始,如果结果集没有行,返回0。 public boolean absolute(int row) 将游标移到参数row指定的行号。
15.5 排序查询 可以在SQL语句中使用ORDER BY子语句,对记录排序 。 例如,按总成绩排序查询的SQL语句: SELECT * FROM student ORDER BY 数学成绩+英语成绩+物理成绩
15.6 模糊查询 可以用SQL语句操作符LIKE进行模式般配,使用“%”代替0个或多个字符,用一个下划线“_”代替一个字符。比如,下述语句查询姓氏是“王”的记录: rs=sql.executeQuery ("SELECT * FROM students WHERE 姓名 LIKE '王%' ");
15.7 随机查询 用Math类的静态方法random()可以产生一个大于0小于1的随机数,再用下述公式: int i=(int)(Math.random()*number); 产生一个0到number之间的随机数,根据这个随机数将游标移动到相应的行,并输出该行记录。
15.8 更新、添加、删除记录 使用SQL语句更新记录中字段的值。 Statement对象调用方法: public int executeUpdate(String sqlStatement); 通过参数sqlStatement指定的方式实现对数据库表中记录的字段值的更新、实现向数据库表中添加新记录以及以参数sqlStatement给出的删除条件实现对数据库表中记录的删除。 例如:
15.8 更新、添加、删除记录 executeUpdate(“UPDATE chengjibiao SET 数学 = 88 WHERE 姓名=‘王名’”); executeUpdate(“INSERT INTO chengjibiao VALUES( ’2005008’, ’1987-12-02 ’, ’刘明’, 70,95)”); executeUpdate("DELETE FROM chengjibiao WHERE 学号 = ‘2003003’ ");
15.9 预处理语句 当向数据库发送一个SQL语句,比如“Select * From chengjibiao”,数据库中的SQL解释器负责将把SQL语句生成底层的内部命令,然后执行该命令,完成有关的数据操作。如果不断地向数据库提交SQL语句势必增加数据库中SQL解释器的负担,影响执行的速度。如果应用程序能针对连接的数据库,事先就将SQL语句解释为数据库底层的内部命令,然后直接让数据库去执行这个命令,显然不仅减轻了数据库的负担,而且也提高了访问数据库的速度。
对于JDBC,如果使用Connection和某个数据库建立了连接对象con,那么 con就可以调用 prepareStatement(String sql) 方法对SQL语句进行预编译处理,生成该数据库底层的内部命令,并将该命令封装在PreparedStatement对象中,那么该对象调用下列方法都可以使得该底层的内部命令被数据库执行: ResultSet executeQuery() boolean execute() int executUpdate()
在对SQL进行预处理时可以使用通配符“?”来代替字段的值,只要在预处理语句执行之前再设置通配符所表示的具体值即可。例如: sql=con.prepareStatement(“SELECT * FROM chengjibiao WHERE math<?”); 那么在SQL对象执行之前,必须调用相应的方法设置通配符“?”代表的具体值,例如: sql.setInt(1,89); 通配符按着在预处理SQL语句中从左到右依次出现的顺序分别被称为第1个、第2个…通配符。
预处理语句设置通配符“?”的值的常用方法: void setDate(int parameterIndex,Date x) void setDouble(int parameterIndex,double x) void setFloat(int parameterIndex,float x) void setLong(int parameterIndex,long x) void setInt(int parameterIndex,int x) void setString(int parameterIndex,String x)
15.10 数据库访问中的套接字技术 利用套接字连接向服务器发送一个查询的条件,而服务器负责对数据库的查询,然后服务器再将查询的结果利用建立的套接字返回给客户端。