《java与数据库的连接精品资料.doc》由会员分享,可在线阅读,更多相关《java与数据库的连接精品资料.doc(69页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 :java 数据库通常情况下,Java调用数据库包含了如下几部分:使用不带参数的存储过程使用带有输入参数的存储过程使用带有输出参数的存储过程使用带有返回状态的存储过程使用带有更新计数的存储过程1使用不带参数的存储过程使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列。不带参数的 call 转义序列的语法如下所示:call procedure-name作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程:SQL codeCREATE PROCEDURE GetContactFormalNamesASBEGI
2、NSELECT TOP 10 Title + + FirstName + + LastName AS FormalNameFROM Person.ContactEND此存储过程返回单个结果集,其中包含一列数据(由 Person.Contact 表中前十个联系人的称呼、名称和姓氏组成)。在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,然后使用 executeQuery 方法调用 GetContactFormalNames 存储过程。Java codepublic static void executeSprocNoParams(Connection con)
3、.try .Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(call dbo.GetContactFormalNames);while (rs.next() .System.out.println(rs.getString(FormalName);rs.close();stmt.close();catch (Exception e) .e.printStackTrace();2使用带有输入参数的存储过程使用 JDBC 驱动程序调用带参数的存储过程时,必须结合 SQLServerConnection
4、类的 prepareCall 方法使用 call SQL 转义序列。带有 IN 参数的 call 转义序列的语法如下所示:call procedure-name(parameter,parameter.)构造 call 转义序列时,请使用 ?(问号)字符来指定 IN 参数。此字符充当要传递给该存储过程的参数值的占位符。可以使用 SQLServerPreparedStatement 类的 setter 方法之一为参数指定值。可使用的 setter 方法由 IN 参数的数据类型决定。向 setter 方法传递值时,不仅需要指定要在参数中使用的实际值,还必须指定参数在存储过程中的序数位置。例如,如果
5、存储过程包含单个 IN 参数,则其序数值为 1。如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。作为如何调用包含 IN 参数的存储过程的实例,使用 SQL Server 2005 AdventureWorks 示例数据库中的 uspGetEmployeeManagers 存储过程。此存储过程接受名为 EmployeeID 的单个输入参数(它是一个整数值),然后基于指定的 EmployeeID 返回雇员及其经理的递归列表。下面是调用此存储过程的 Java 代码:Java codepublic static void executeSprocInParams(Connectio
6、n con) .try .PreparedStatement pstmt = con.prepareStatement(call dbo.uspGetEmployeeManagers(?);pstmt.setInt(1, 50);ResultSet rs = pstmt.executeQuery();while (rs.next() .System.out.println(EMPLOYEE:);System.out.println(rs.getString(LastName) + , + rs.getString(FirstName);System.out.println(MANAGER:);
7、System.out.println(rs.getString(ManagerLastName) + , + rs.getString(ManagerFirstName);System.out.println();rs.close();pstmt.close();catch (Exception e) .e.printStackTrace();3使用带有输出参数的存储过程使用 JDBC 驱动程序调用此类存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。带有 OUT 参数的 call 转义序列的语法如下所示:call
8、 procedure-name(parameter,parameter.)构造 call 转义序列时,请使用 ?(问号)字符来指定 OUT 参数。此字符充当要从该存储过程返回的参数值的占位符。要为 OUT 参数指定值,必须在运行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定各参数的数据类型。使用 registerOutParameter 方法为 OUT 参数指定的值必须是 Java.sql.Types 所包含的 JDBC 数据类型之一,而它又被映射成本地 SQL Server 数据类型之一。有关 JDBC 和 SQ
9、L Server 数据类型的详细信息,请参阅了解 JDBC 驱动程序数据类型。当您对于 OUT 参数向 registerOutParameter 方法传递一个值时,不仅必须指定要用于此参数的数据类型,而且必须在存储过程中指定此参数的序号位置或此参数的名称。例如,如果存储过程包含单个 OUT 参数,则其序数值为 1;如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程: 根据指定的整数 IN 参数 (employeeID),该存储过程也返回单个整数 OUT 参数 (manage
10、rID)。根据 HumanResources.Employee 表中包含的 EmployeeID,OUT 参数中返回的值为 ManagerID。在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,然后使用 execute 方法调用 GetImmediateManager 存储过程:Java codepublic static void executeStoredProcedure(Connection con) .try .CallableStatement cstmt = con.prepareCall(call dbo.GetImmediateManager
11、(?, ?);cstmt.setInt(1, 5);cstmt.registerOutParameter(2, Java.sql.Types.INTEGER);cstmt.execute();System.out.println(MANAGER ID: + cstmt.getInt(2);catch (Exception e) .e.printStackTrace();本示例使用序号位置来标识参数。或者,也可以使用参数的名称(而非其序号位置)来标识此参数。下面的代码示例修改了上一个示例,以说明如何在 Java 应用程序中使用命名参数。请注意,这些参数名称对应于存储过程的定义中的参数名称:SQL
12、 code CREATE PROCEDURE GetImmediateManageremployeeID INT,managerID INT OUTPUTASBEGINSELECT managerID = ManagerIDFROM HumanResources.EmployeeWHERE EmployeeID = employeeIDEND存储过程可能返回更新计数和多个结果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 规范,此规范规定在检索 OUT 参数之前应检索多个结果集和更新计数。也就是说,应用程序应先检索所有 ResultSet
13、 对象和更新计数,然后使用 CallableStatement.getter 方法检索 OUT 参数。否则,当检索 OUT 参数时,尚未检索的 ResultSet 对象和更新计数将丢失。4 使用带有返回状态的存储过程使用 JDBC 驱动程序调用这种存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。返回状态参数的 call 转义序列的语法如下所示:?=call procedure-name(parameter,parameter.)构造 call 转义序列时,请使用 ?(问号)字符来指定返回状态参数。此字符充当要从该
14、存储过程返回的参数值的占位符。要为返回状态参数指定值,必须在执行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定参数的数据类型。此外,向 registerOutParameter 方法传递返回状态参数值时,不仅需要指定要使用的参数的数据类型,还必须指定参数在存储过程中的序数位置。对于返回状态参数,其序数位置始终为 1,这是因为它始终是调用存储过程时的第一个参数。尽管 SQLServerCallableStatement 类支持使用参数的名称来指示特定参数,但您只能对返回状态参数使用参数的序号位置编号。作为实例,在 S
15、QL Server 2005 AdventureWorks 示例数据库中创建以下存储过程:SQL codeCREATE PROCEDURE CheckContactCity(cityName CHAR(50)ASBEGINIF (SELECT COUNT(*)FROM Person.AddressWHERE City = cityName) 1)RETURN 1ELSERETURN 0END该存储过程返回状态值 1 或 0,这取决于是否能在表 Person.Address 中找到 cityName 参数指定的城市。在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连
16、接,然后使用 execute 方法调用 CheckContactCity 存储过程:Java codepublic static void executeStoredProcedure(Connection con) .try .CallableStatement cstmt = con.prepareCall(? = call dbo.CheckContactCity(?);cstmt.registerOutParameter(1, Java.sql.Types.INTEGER);cstmt.setString(2, Atlanta);cstmt.execute();System.out.p
17、rintln(RETURN STATUS: + cstmt.getInt(1);cstmt.close();catch (Exception e) .e.printStackTrace();5 使用带有更新计数的存储过程使用 SQLServerCallableStatement 类构建对存储过程的调用之后,可以使用 execute 或 executeUpdate 方法中的任意一个来调用此存储过程。executeUpdate 方法将返回一个 int 值,该值包含受此存储过程影响的行数,但 execute 方法不返回此值。如果使用 execute 方法,并且希望获得受影响的行数计数,则可以在运行存
18、储过程后调用 getUpdateCount 方法。作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下表和存储过程:SQL codeCREATE TABLE TestTable(Col1 int IDENTITY,Col2 varchar(50),Col3 int);CREATE PROCEDURE UpdateTestTableCol2 varchar(50),Col3 intASBEGINUPDATE TestTableSET Col2 = Col2, Col3 = Col3END;在下面的实例中,将向此函数传递 AdventureWorks 示
19、例数据库的打开连接,并使用 execute 方法调用 UpdateTestTable 存储过程,然后使用 getUpdateCount 方法返回受存储过程影响的行计数。Java code public static void executeUpdateStoredProcedure(Connection con) .try .CallableStatement cstmt = con.prepareCall(call dbo.UpdateTestTable(?, ?);cstmt.setString(1, A);cstmt.setInt(2, 100);cstmt.execute();int
20、count = cstmt.getUpdateCount();cstmt.close();System.out.println(ROWS AFFECTED: + count);catch (Exception e) .e.printStackTrace();本文来自: 朗沃Java培训( 详细出处参考: Java连接数据库一般都是六步(具体的操作步骤会不同): 连接数据库之前要导入数据库相应的驱动包。 以MySQL数据库为例: 1.加载数据库驱动 try Class.forName(com.mysql.jdbc.Driver); catch (Exception e) e.printStack
21、Trace();/打印异常 2.连接数据库 try conn=DriverManager.getConnection(jdbc:mysql:/localhost:3306/db, root,root);/获得数据库连接,用户名,密码,db:数据库名称 catch(Exception e) e.printStackTrace(); 3.创建执行语句 Statement stmt=conn.createStatement(); 4.返回结果。 ResultSet rs=stmt.createStatement(select * from db.table);5.处理结果 while(rs.next
22、() rs.getString(username); rs.getString(password); 6.关闭所有连接(先打开的连接后关闭) rs.close(); stmt.close(); conn.close(); 首先,使用JDBC技术获取数据库连接:public static Connection getConnection() try Class.forName(oracle.jdbc.driver.OracleDriver); Connection con=DriverManager.getConnection(jdbc:oracle:thin:127.0.0.1:1521:or
23、cl, root, root); return con; catch(Exception e) e.printStackTrace(); return null; Class.forName(数据库驱动);这是JVM在加载数据库驱动。DriverManager.getConnection(url,username,password);url是指连接数据库的地址。像上面我写的URL是这样的:jdbc:oracle:thin:127.0.0.1:1521:orcl127.0.0.1是指本机,也可以用localhost代替,1521是数据库端口号(本人用的是oracle10g),orcl是指orac
24、le_sid。username/password数据库的用户名和密码。有的数据库的url可能不是这样。当然可以去网上查一下就知道了。这种连接方法是一次请求一次连接,是比较浪费资源的。像tomcat,weblogic等服务器都带有连接池来避免资源的浪费,而且现在好象有规定,只要是服务器就必须带有连接池。至于连接池的连接方法,不同的服务器有不同的获得方法。建议你用哪个就去学哪个。有连接就有关闭数据库,获得数据库连接后一定要记得关闭资源。public static void close(Connection con) if(con!=null) trycon.close();catch(Except
25、ion e) 为了方便,不防写成一个方法。获取连接后,然后使用这个连接去创建相应的Statement来操作数据库。有Statement,PerparedStatement,CallableStatement这几种statement可以用来创建。我们先看看Statement的使用。public static void main(String args) Connection con=JDBCUtil.getConnection(); Statement stat=null; ResultSet rs=null; try String sql=select a_id,a_name,a_no fro
26、m a; stat=con.createStatement(); rs=stat.executeQuery(sql); while(rs.next() System.err.println(rs.getInt(1)+/+rs.getString(2)+/+rs.getInt(3); catch(Exception e) e.printStackTrace(); JDBCUtil.close(rs,stat,con); 注释:stat=con.createStatement();是用连接创建Statement对象。stat.executeQuery(sql);是执行查询语句。这个方法返回的是一个
27、结果集。即ResultSet。可以将查询出来的结果放入结果集中。rs.next()这个方法返回的一个boolean类型的值,即当指针能够往下走时,返回true,否则返回false。这样就可以保证能够遍历这个结果集了。当然这里出现了Statement,ResultSet,那么close()方法也得变化了。如下:public static void close(ResultSet rs,Statement stat,Connection con) if(rs!=null) tryrs.close();catch(Exception e) if(stat!=null) trystat.close()
28、;catch(Exception e) if(con!=null) trycon.close();catch(Exception e) 注意关闭顺序,一定是先ResultSet,后Statement,最后Connection.由于PerparedStatement和CallableStatement都是Statement的实现类,根据JAVA多态的用法,close()方法就算完全写完了,不用改了。现在来看看结果:2/all/21/hello/1=现在我们用PerparedStatement来查询:Connection con=JDBCUtil.getConnection(); Prepared
29、Statement stat=null; ResultSet rs=null; try String sql=select a_id,a_name,a_no from a where a_id=?; stat=con.prepareStatement(sql); stat.setInt(1, 1); rs=stat.executeQuery(); while(rs.next() System.err.println(rs.getInt(1)+/+rs.getString(2)+/+rs.getInt(3); catch(Exception e) e.printStackTrace(); JDB
30、CUtil.close(rs,stat,con);这里的sql语句里有一个值是未确定的。这样就可以实现预编译,大大提高了程序的运行效率。流程如下:stat=con.prepareStatement(sql);这个方法就将这个sql语句进行了一次编译,查看有没有什么明显的语法错误等。如果没错,再通过stat.setInt(1, 1);将缺失的值补回去然后再执行sql查询。PreparedStatement为批处理提供了一系统方法,让批查询、批更新等更加的效率。让我们看看结果:1/hello/1=CallableStatement是专门用于处理存储过程的。 java连接SQL Server2000
31、(现在企业最常用的数据库就是SQL Server2000,所以只说这个,别的都是大同小异,连接access,mysql,Oracle数据库遇到问题的可以和我联系)java连接数据库一般有两种方式,一是通过jdbc/odbc桥(需要配置数据源),二是通过jdbc驱动.这里强烈推荐使用后者,因为前者涉及到jdbc到odbc转换的问题,执行效率很低.首先下载jdbc驱动包(用搜索引擎搜下,多如牛毛),安装之后,打开那个文件夹,会看到三个jar包,只要把这三个jar包设置到环境变量(classpath)里就可以了假设驱动程序安装在d:sqldriver目录下,那么就在classpath中添加d:sql
32、drivermsbase.jar;d:sqldrivermssqlserver.jar;d:sqldrivermsutil.jar;注意:如果使用的是windows xp系统的sp2 版本,就需要给SQL Server2000打一个sp3a或者sp4的补丁.打完之补丁之后才可以使用测试代码(使用的是SQL Server自带的数据库,可以直接编译运行)import java.sql.*;public class SqlTesting public static void main(String args) String url = jdbc:microsoft:sqlserver:/localh
33、ost:1433;DatabaseName=Northwind; String user =sa; String password = sa; String sqlStr = select CustomerID, CompanyName, ContactName from Customers; try Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver); System.out.println( ); Connection con = DriverManager.getConnection( url, user, passwor
34、d ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( sqlStr ); while(rs.next() System.out.print(rs.getString(CustomerID) + ); System.out.print(rs.getString(CompanyName) + ); System.out.println(rs.getString(ContactName); rs.close(); st.close(); con.close(); catch(Exception err)
35、err.printStackTrace(System.out); Java数据库编程中sql server 2000的连接 悬赏分:10 | 解决时间:2009-10-22 08:19 | 提问者:勺头机器人 import java.sql.*;public class DBMainpublic static void main(String args) String dbdriver=sun.jdbc.odbc.JdbcOdbcDriver; String dburl=jdbc:odbc:student_SQLServer; String dbuser=liyang; String dbpa
36、ssword=wangxuegao; Connection con=null; Statement stmt=null; ResultSet rs=null; try Class.forName(dbdriver); con=DriverManager.getConnection(dburl,dbuser,dbpassword); stmt=con.createStatement(); rs=stmt.executeQuery(select * from qiang); while(rs.next() System.out.println(ID:+rs.getString(id); Syste
37、m.out.println(姓名+rs.getString(name); System.out.println(密码+rs.getString(password); System.out.println(年龄+rs.getInt(age); System.out.println(E-mail+rs.getString(email); System.out.println(n); rs.close(); stmt.close(); con.close(); catch(Exception e) System.out.print(e); ava连接数据库的代码 位于MVC中的M(模型层)中,主要负
38、责与数据库打交道。本人把我以前写的代码 加上注释 给你看看 希望对你有帮助。public class UserInfoDAO /验证登陆名/密码sql语句 /private -这个sql语句只在本类内部使用,没有必要public /static -sql语句仅仅一份就足够了 /final -sql语句一般在运行时不变,final修饰的变量相当于常量 /常量名所有字母大写 private static final String SQL_CHECK_USERINFO = SELECT LOGINNAME,USERNAME,PASSWORD,AGE,ADDRESS FROM USERINFO WHE
39、RE LOGINNAME=? AND PASSWORD = ?; public UserInfoDAO() /* * 验证登陆名/密码方法 * param u UserInfo * return boolean */ public boolean checkUser(UserInfo u) boolean b = false;/验证是否成功的标识 Connection conn = null;/数据库连接的引用 PreparedStatement pstmt = null;/PreparedStatement引用 ResultSet rs = null;/结果集引用 /调用ConnectionManager的方法,得到数据库里连接实例 conn = ConnectionManager.getConnection(); try /通过Connection的prepareStatement()方法构建PreparedStatement实例,参数为sql语句 pstmt = conn.prepareStatement(SQL_CHECK_USERINFO); /为sql
限制150内