第一篇:关于JDBC数据分页跨数据库小结
关于JDBC数据分页跨数据库小结
一、关于数据连接connection如何区分数据库类型
// 获取数据生产商名称
String databaseProductName = conn.getMetaData().getDatabaseProductName();// 获取数据库版本号
String productVersion = conn.getMetaData().getDatabaseProductVersion();
测试结果:
Oracle // // //
databaseProductName :Oracle
productVersion :Oracle Database 10g Enterprise Edition Release 10.2.0.1.01)* page.getPageSize();int endRow = startRow + page.getPageSize();String osql = “select * from(select t.*,rownum as rn from(”
+ sql+ “)t where rownum<=” + endRow + “)where rn>” + startRow;
} return osql;
三、MYSQL数据库分页方案采用 limit 关键字
1.SQL语句:
select trty.* from(select * from table)trty limit startrow ,endrow
2.生成分页SQL代码:
/**
* MySql数据库分页专用
* @param sql
* @param page
* @return String
* @see 未测试
*/
private static String wrapPage4MySql(String sql, Page page){
int startRow =(page.getPageNo()1)* page.getPageSize();int endRow = page.getPageNo()* page.getPageSize();Statement statement = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = statement.executeQuery(sql);
// 查询范围超过,返回空rows rs.last();int rownum = rs.getRow();if((startRow+1)> rownum){ }
// 判断分页总数是否超过实际数量 int startnum = startRow + 1;int endnum = endRow + 1;if(rownum < endnum){ } // 定位到当前页
rs.absolute(startnum);while(startnum <= endnum){ rows.add(buildOneRow(rs));startnum++;endnum = rownum;return rows;
} } return rows;
五、Microsoft SQL Server数据库分页方案探索
1.方案一 采用top关键字
SQL语句:
SELECT TOP 10 * FROM TestTable WHERE ID NOT IN
(SELECT TOP 20 id FROM TestTable ORDER BY ID)ORDER BY ID
2.方案二 用top关键字
SELECT TOP 10 * FROM TestTable WHERE ID >
(SELECT MAX(id)FROM(SELECT TOP 20 id FROM TestTable ORDER BY id)AS T)ORDER BY ID
3.方案一和二本质一样,但是方案二的效率比较高。对于复杂的SQL不能采用此中分页方式,除非有逻辑严谨的拆解SQL语句的程序。
4.方案三采用存储过程分页,在JAVA程序中调用存储过程。
1)存储过程代码如下
IF NOT EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Pr_QueryByPage]')AND OBJECTPROPERTY(id,N'IsProcedure')= 1)BEGIN
EXEC dbo.sp_executesql @statement = N'create procedure [dbo].[Pr_QueryByPage]
@sqlstr nvarchar(4000),--查询sql @currentpage int,--第页记录条数 @pagesize int--每页显示记录
as
set nocount on
declare @P1 int,--P1是游标的ID @rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize)as TotalPage,@rowcount as [RowCount]
set @currentpage=(@currentpage-1)*@pagesize+1 exec sp_cursorfetch @P1,16,@currentpage,@pagesize exec sp_cursorclose @P1 set nocount off ' END GO
2)代码调用
/**
List
*
* @param conn
* @param sql
* @param page
* @return
* @throws Exception
* @see 测试通过
*/
private static List
// 设置存储过程参数
cs.setString(1, sql);cs.setInt(2, pageno);cs.setInt(3, pagsize);cs.execute();boolean hasResultSet = cs.execute();if(hasResultSet){
} return rows;} ResultSet rs = null;/** 跳过第一个结果集 */ rs = cs.getResultSet();/** 第二个结果集为查询分页数据 */ if(cs.getMoreResults()){
} rs = cs.getResultSet();while(rs.next()){ } rows.add(buildOneRow(rs));// 调用存储过程分页
CallableStatement cs = conn.prepareCall(“{call Pr_QueryByPage(?,?,?)}”);int pageno = page.getPageNo();int pagsize = page.getPageSize();5.关于SQLSERVER2005分页方案的选择
1)2005分页方案可以采用存储过程,和2000的方案兼容。2)2005第二种分页方案采用RowNumber()函数可以实现。
SQL实例:
SELECT * FROM(SELECT
ROW_NUMBER()OVER(ORDER BY Namec)AS RowNumber, FROM
dbo.mem_member)_myResults WHERE
RowNumber between 10000 and 10020 缺点:此种方案关键函数 ROW_NUMBER()必须进行order by排序。如果采用此种方案必须拆分SQL语句。
第二篇:JDBC连接数据库经验总结
Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。
一、连接各种数据库方式速查表
下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用。
1、Oracle8/8i/9i数据库(thin模式)
Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();String url=“jdbc:oracle:thin:@localhost:1521:orcl”;//orcl为数据库的SID String user=“test”;String password=“test”;Connection conn= DriverManager.getConnection(url,user,password);
2、DB2数据库
Class.forName(“com.ibm.db2.jdbc.app.DB2Driver ”).newInstance();String url=“jdbc:db2://localhost:5000/sample”;//sample为你的数据库名 String user=“admin”;String password=“";Connection conn= DriverManager.getConnection(url,user,password);
3、Sql Server7.0/2000数据库
Class.forName(”com.microsoft.jdbc.sqlserver.SQLServerDriver“).newInstance();String url=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb“;//mydb为数据库 String user=”sa“;String password=”“;Connection conn= DriverManager.getConnection(url,user,password);
4、Sybase数据库
Class.forName(”com.sybase.jdbc.SybDriver“).newInstance();String url =” jdbc:sybase:Tds:localhost:5007/myDB“;//myDB为你的数据库名
Properties sysProps = System.getProperties();SysProps.put(”user“,”userid“);SysProps.put(”password“,”user_password“);Connection conn= DriverManager.getConnection(url, SysProps);
5、Informix数据库
Class.forName(”com.informix.jdbc.IfxDriver“).newInstance();String url = ”jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;user=testuser;password=testpassword“;//myDB为数据库名 Connection conn= DriverManager.getConnection(url);
6、MySQL数据库
Class.forName(”org.gjt.mm.mysql.Driver“).newInstance();String url =”jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1“ //myDB为数据库名
Connection conn= DriverManager.getConnection(url);
7、PostgreSQL数据库
Class.forName(”org.postgresql.Driver“).newInstance();String url =”jdbc:postgresql://localhost/myDB“ //myDB为数据库名 String user=”myuser“;String password=”mypassword“;Connection conn= DriverManager.getConnection(url,user,password);
8、access数据库直连用ODBC的
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);String url=”jdbc:odbc:Driver={MicroSoft Access Driver(*.mdb)};DBQ=“+application.getRealPath(”/Data/ReportDemo.mdb“);Connection conn = DriverManager.getConnection(url,”“,”“);Statement stmtNew=conn.createStatement();
二、JDBC连接MySql方式
下面是使用JDBC连接MySql的一个小的教程
1、查找驱动程序
MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动程序,不需做其他配置。
2、动态指定classpath 如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。
3、加载驱动程序
try{ Class.forName(com.mysql.jdbc.Driver);System.out.println(Success loading Mysql Driver!);}catch(Exception e){ System.out.println(Error loading Mysql Driver!);e.printStackTrace();}
4、设置连接的url
jdbc:mysql://localhost/databasename[?pa=va][&pa=va]
三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧
1、在客户端软件开发中使用Thin驱动程序
在开发Java软件方面,Oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口(JNI),通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯。为了获得最高的性能,Oracle建议在客户端软件的开发中使用OCI驱动程序,这似乎是正确的。但我建议使用Thin驱动程序,因为通过多次测试发现,在通常情况下,Thin驱动程序的性能都超过了OCI驱动程序。
2、关闭自动提交功能,提高系统性能
在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,如下所示:
conn.setAutoCommit(false);
值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。
3、在动态SQL或有时间限制的命令中使用Statement对象
在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。这可能会使你认为,使用PreparedStatement对象比使用Statement对象的速度更快。然而,我进行的测试表明,在客户端软件中,情况并非如此。因此,在有时间限制的SQL操作中,除非成批地处理SQL命令,我们应当考虑使用Statement对象。
此外,使用Statement对象也使得编写动态SQL命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的SQL命令。因此,我认为,Statement对象可以使动态SQL命令的创建和执行变得更加简单。
4、利用helper函数对动态SQL命令进行格式化
在创建使用Statement对象执行的动态SQL命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字O'Reilly插入表中的SQL命令,则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法,然后在连接字符串心服用公式表达一个SQL命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个Date型的值,然后让它输出基于Oracle的to_date()函数的字符串表达式。
5、利用PreparedStatement对象提高数据库的总体效率
在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。
6、在成批处理重复的插入或更新操作中使用PreparedStatement对象
如果成批地处理插入和更新操作,就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制,可以以如下所示的方式调用setExecuteBatch():
PreparedStatement pstmt3D null;try {((OraclePreparedStatement)pstmt).setExecuteBatch(30);...pstmt.executeUpdate();}
调用setExecuteBatch()时指定的值是一个上限,当达到该值时,就会自动地引发SQL命令执行,标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。
7、使用Oracle locator方法插入、更新大对象(LOB)
Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理,尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值,也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB,但需要使用locator才能获取LOB的值。由于存在这二个问题,因此,我建议使用locator的方法来插入、更新或获取LOB的值。
8、使用SQL92语法调用存储过程
在调用存储过程时,我们可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92。
9、使用Object SQL将对象模式转移到数据库中
既然可以将Oracle的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的,因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。
10、利用SQL完成数据库内的操作
我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求,而不是使用Java等过程化的编程语言。
如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务,何必要让数据在网上流来流去的?我建议用户认真学习如何最大限度地发挥SQL的功能。11 JNDI
try{
InitialContext ctx=new InitialContext();Object o = ctx.lookup(”java:comp/env/hibernate“);out.print(”class="+o.getClass().getName());DataSource ds=(javax.sql.DataSource)o;}catch(NamingException e){
e.printSatckTrace;}
第三篇:JDBC方式连接数据库心得体会
1、在新建好的数据库中建立一张名字为UserTable的数据表,定义好各个字段的数据类型和主键。表的设计结构如下:(仅作测试使用)UserTable:
其中UserId为主键。
2、在表中写入适当的数据以供测试使用。
3、配置数据源,使得java应用程序能够通过该数据源来访问数据库的内容。具体操作:打开控制面板---系统和安全---管理工具---数据源ODBC 窗口如下:
选择用户DSN或者系统DSN 并单击【添加】(注意:用户DSN只对当前用户有效。如需对多个用户使用,请选择系统DSN)
选择合适的数据源驱动程序。在这里选择SQL SERVER.单击【完成】进入到下一步。
在【名称】中输入合适的名称尽量用英文,方便在jdbd-odbc中使用。输入正确的数据库验证信息之后,便可以成功的配置数据源。
至此,数据源配置业已基本完成。
接下来将介绍如何在代码中连接数据库进行操作。
4、打开Myeclipse开发环境。新建一个“学生成绩管理系统”—然后新建一个自定义的包(也可不建立,习惯问题)。我建立一个名为com.dcy的包。然后在该包中新建一个class文件。把如下代码贴进来。用来测试是否连接成功。
package com.dcy;
import java.sql.*;
public class ConnectionTest {
} public ConnectionTest(){ //构造函数 } public static void Query(){
try {
} while(ret.next())
{
} System.out.println(ret.getString(1));} catch(ClassNotFoundException e){
} String url=“jdbc:odbc:StuManager”;String sql=“select * from UserTable”;Connection con=DriverManager.getConnection(url,“sa”,“sa”);Statement state=con.createStatement();ResultSet ret=state.executeQuery(sql);// TODO Auto-generated catch block e.printStackTrace();try { Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);} catch(SQLException e){ // TODO Auto-generated catch block e.printStackTrace();}
public static void main(String [] args){ } Query();运行程序的时候会出现以下错误。原因是确实第三方的jar包。这时需要导入微软的sqljdbc.jar包 选择工程---属性—java build path---libraries---add external jars 如下图
导入sqljdbc.jar 然后再工程中引用改包即可。
至此,就能对数据库进行操作了。
第四篇:数据库小结
数据库总结
1、数据库开课6天,到今天已全部结束
2、学习内容
一、数据库的安装与删除:已独立上机操作实现。
二、数据利器sql 1)用sql进行单表查询:
查询语句: select 所查内容 from 表 where 条件
排序: select 所查内容 from 表 where 条件order by排序的依据
分组:select 所查内容 from 表 where 条件 group by 分组依据 其他要显示的内容(having 条件)
字段运算查询:select 运算 from表
变换查询:select 原名 新名 from 表
2)多表查询:
无条件多表查询 select 所差内容 from 多个表
等值多表查询
select 所差内容 from 多个表 where 一个
表内容=另一个表内容
非等值多表查询select 所差内容 from 多个表 where 一个
条件 and(or)其他条件
3)嵌套查询
带in、any(some)、all、exist的嵌套查询:
select 所查内容 from 表 where 内容 in(select 所查
内容 from 表 where 条件)
注意:any(some)包括等于条件、all不包括
并(union)、交(intersect)、差操作(minus): 4)常用的函数查询
Ceil(n)取大于等于n的最小整数
Floor(n)取小于等于n的最大整数
Mod(m,n)取m整除n后的余数
Pow(m,n)取m的n次方
Round(m,n)取四舍五入,保留小数点后n位
Sign(n)n》0取1;n=0取0;n《0取-1
Avg(字段名)求平均值
Count(字段名)或者count(*)统计总数
Min(字段名)计算数值型字段最小数
Max(字段名)计算数值型字段最大数
Sum(字段名)计算总数 5)录入数据
单行录入:Insert into 数据表(字段1,2。。)values
(字段1的值,2的值。。)
多行录入:insert into 数据表(字段1,2。)(select
(字段1或运算,2或运算。。)from
数据表 where 条件)表间数据复制:create table 表名 as(select 字段from原
有的表where 条件)
6)删除记录
删除记录:Delete from 数据表 where 条件
整表数据删除:truncate table 数据表 7)更新数据
直接赋值更新:update 数据表 set 字段名1=新的赋值,字段名2=新的赋值。where条件
嵌套更新:update 数据表 set 字段名1=(select 字段列
表 from 数据表 where 条件),字段名(select字段列表 from 数据表 where条件)。。
三、编程进阶Pl/sql 1)程序结构
Delacre
定义语句段
Begin
执行语句段
Exception
异常处理语句段 End 2)基本语法
定义变量%type:获得字段的数据类型
定义变量%rowtype:获得整个记录的数据类型f 定义记录类型变量 :type 记录类型 is record()
定义一维表类型变量:type 表类型 is table of 类型 index by
binary_integer, 表变量名 表类型
定义多维表类型变量
3)表达式
数值表达式:加+,减-,乘*,除/,乘方**
字符表达式:连接符号||
关系表达式(9种): 4)事务处理
提交:Committee
回滚:rollback
保存点:savepoint 5)游标
定义、打开、提取、关闭 6)过程
创建、查询、修改、执行
·
第五篇:操作数据库小结
一.查询操作
对数据进行查询操作时,有两种情况:一是查询单个值,二是 查询若干条记录。
1、查询单个值
需要使用Command对象的ExecuteScalar()方法:步骤如下:(1)、创建Connection对象(数据库连接对象)。(2)、创建查询用的SQL语句。(3)、利用SQL语句和Connection对象创建Command对象。(4)、打开数据库连接,调用Connection对象的Open()方法。(5)、调用Command对象的ExecuteScalar()方法,返回一个标量值。(6)、操作完成后关闭数据库连接,调用Connection对象的Close()方法。
2、查询若干条记录
需要使用Command对象的ExecuteReader()方法:步骤如下:(1)、创建Connection对象(数据库连接对象)。(2)、创建查询用的SQL语句。(3)、利用SQL语句和Connection对象创建Command对象。(4)、打开数据库连接,调用Connection对象的Open()方法。(5)、调用Command对象的ExecuteReader()方法,返回一个DataReader对象。(6)、调用DataReader对象的Read()方法逐行读取记录,如果读到记录返回Ture,否则返回False.(7)、使用(type)dataReader[列名或索引]的方式读取这一行中某一列的值。(8)、关闭DataReader对象(9)、操作完成后关闭数据路连接,调用Connection对象的Close()方法。
二、非查询操作
对数据库执行非查询操作时,包括增加,修改,删除数据,都使用Command对象的ExecuteNonQuery()方法,步骤如下:
(1)、创建Connection对象(数据库连接对象)(2)、创建增删改用的SQL语句。(3)、利用SQL语句和Connection对象创建Command对象。(4)、打开数据库连接,调用Connection对象的Open()方法。(5)、调用Command对象的ExecuteNonQuery()方法执行命令,返回受影响的行数。(6)、操作完成后关闭数据库连接,调用Connection对象的Close()方法。
本章总结
1、使用DataReader查询数据记录,通过Command对象的ExecuteReader()方法返回一个DataReader对象。
2、使用DataReader读取数据室每次调用Read()方法读取一行数据。
3、DataReader使用完后要调用它的Close()方法关闭。
4、使用Command对象的ExecuteNonQuery()方法对数据进行增删改的操作。
5、ExecuteNonQuery()方法返回受影响的行数。
6、ListView(列表视图)控件有5种视图模式,重点是Details 列表视图的Items属性表示包含在空间中的所有项的结合,每一个项都是一个ListViewItem,使用Items.Add()方法向列表视图中添加一项 调用列表视图项的SubItems.AddRange()方法添加它的子项
ListViewItem lviStudent = new ListViewItem(loginID);创建一个ListView项 lviStudent.Tag=(int)dataReader[“StudentId”];lvStudent.Items.Add(lviStudent);//向ListView中添加一个新项 lviStudent.SubItems.AddRange(new string[] {studentName,studentNo,userState});//向当前项中添加子项
7、ContextMenuStrip(快捷菜单)控件可以与其他控件结合使用,通过设置控件的ContextMenuStrip属性来指定它的快捷菜单。
想鼠标右键单击文本框时出现快捷菜单,就选中文本框在属性窗口中找到它的ContextMenuStrip属性,选择已有的右键菜单控件 txtLoginId.Focus():
下拉列表:
创建Command对象调用Command对象的ExecuteReader()方法创建DataReader对象(sqlDataReader dataReader=command.ExecuteReader())使用DataReader的Reader()方法逐行读取数据(放回bool类型)读取当前行的某列的数据(cboGrade.Items.Add(dataReader[“列名”]))关闭DataReader对象,Close()方法
向数据库中添加数据:
创建Connection对象定义要执行的SQL语句创建Command对象执行ExecuteNonQuery()方法根据返回的结果进行后续的处理
双击显示出ID:
MessageBox.show(dataGridView1.SelectedRows[0].cells[“ColID”].value.ToString());
刷新:
1,BindStudentByLoginID(txtBox.Text)2,listView.Items.RemoveAt(Listview1.SelectedIndices[0])//只能删除选中的行(选中第几个)