import
java.sql.
*
;


/** */
/**
* 使用ODBC的方法:<br>
* sun.jdbc.odbc.JdbcOdbcDriver<br>
* jdbc:odbc: + odbcName<br>
*
* oracle.thin.Driver<br>
* qwe.sql.qweMySqlDriver<br>
* symantec.dbanywhere.Driver<br>
*
* 访问MS SQLServer的方法<br>
* driveName=com.microsoft.jdbc.sqlserver.SQLServerDriver;<br>
* url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo;<br>
* 访问MySQL的方法:<br>
* DBDriver=com.mysql.jdbc.Driver<br>
* URL=jdbc:mysql://localhost/demo<br>
*/
public
abstract
class
AbstractConnectionFactory
{

private
String userName;
private
String password;
private
String driverName;
private
String url;
private
java.sql.Connection connection;

/** */
/**
* 工厂方法,返回实际创建的连接对象
*
@return
*/
/** */
/**
* 根据设置的连接参数创建一个新的连接实例
*
@return
*/
private
Connection getNewConnection()
{

try
{
this
.connection.close();
//
试图关闭连接
}
finally
{
this
.connection
=
null
;
//
释放连接
try
{
Class.forName(
this
.driverName);
//
加载驱动程序
try
{
this
.connection
=
DriverManager.getConnection(
this
.url,
this
.userName,
this
.password);
}
catch
(SQLException e)
{
throw
e;
}
}
finally
{
return
this
.connection;
//
返回新建立的连接
}
}
}
public
String getUserName()
{
return
userName;
}
public
void
setUserName(String userName)
{
this
.userName
=
userName;
}
public
String getPassword()
{
return
password;
}
public
void
setPassword(String password)
{
this
.password
=
password;
}
public
String getDriverName()
{
return
driverName;
}
public
void
setDriverName(String driverName)
{
this
.driverName
=
driverName;
}
public
String getUrl()
{
return
url;
}
public
void
setUrl(String url)
{
this
.url
=
url;
}
public
java.sql.Connection getConnection()
{

if
(connection
!=
null
)
{

try
{

if
(connection.isClosed())
{
connection
=
null
;
getNewConnection();
}
}
catch
(SQLException ex)
{
}
}
if
(connection
==
null
)
{
//
没有设置连接则创建一个连接
getNewConnection();
}
return
connection;

}
}
package
skydev.modules.data;

public
class
ConnectionFactory

extends
AbstractConnectionFactory
{


public
ConnectionFactory()
{
}

}
package
skydev.modules.data;

import
java.sql.
*
;
import
java.sql.PreparedStatement;


public
abstract
class
DatabaseObject
{

protected
Connection connection
=
null
;
protected
ResultSet resultSet
=
null
;
protected
ResultSetMetaData resultSetMetaData
=
null
;
private
ConnectionFactory connectionFactory
=
null
;
private
java.sql.Statement statement
=
null
;
//
=new Statement();
public
DatabaseObject()
{
}
public
DatabaseObject(ConnectionFactory connectionFactory)
{
this
.setConnectionFactory(connectionFactory);
}
/** */
/**
* 执行查询
*
@param
sql 要执行的Sql语句
*
@return
返回查询的结果集 ,查询失败返回null
*/
public
ResultSet getResultSet(String sql)
{
//
Statement stmt = null;
try
{
//
stmt = connection.createStatement();
this
.resultSet
=
statement.executeQuery(sql);
//
保留内部指针
}
catch
(SQLException e)
{
e.printStackTrace();
this
.resultSet
=
null
;
}
finally
{
return
this
.resultSet;
}
}
/** */
/**
* 获取外部指定ResltSet的ResultSetMetaData数据
*
@param
resultSet 要获取的ResultSet
*
@return
失败返回null
*/
public
ResultSetMetaData getResultSetMetaData(ResultSet resultSet)
{
ResultSetMetaData resultSetMetaData
=
null
;

try
{
resultSetMetaData
=
resultSet.getMetaData();
}
catch
(SQLException e)
{
e.printStackTrace();
resultSetMetaData
=
null
;
}
finally
{
return
resultSetMetaData;
}
}
/** */
/**
* 获取最近一次设置或者返回的ResultSet的ResultMetaData数据,
* 比方说调用了:getResultSet(sql)方法,然后调用getResultSetMetaData方法
* 可以获得相应的ResultSetMetaData数据。
*
@return
*/
public
ResultSetMetaData getResultSetMetaData()
{
return
this
.getResultSetMetaData(
this
.resultSet);
}
/** */
/**
* 执行存储过程
*
@param
spName 存储过程名称
*
@return
*/
public
ResultSet Execute(String spName)
{
//
对此数据库执行一个 SQL 查询
ResultSet resultSet
=
null
;

try
{
//
PreparedStatement stmt = (PreparedStatement) connection.createStatement();
resultSet
=
statement.executeQuery(spName);
}
catch
(Exception e)
{
System.out.println(execute error
+
e.getMessage());
}
return
resultSet;
}
/** */
/**
* 设置数据库连接工厂,对此类的所有操作之前,必须调用该方法,
* 设置数据库连接工厂。
*
@param
connectionFactory 数据库连接工厂ConnectionFactory 类对象以及
* 派生类对象。
*/
public
void
setConnectionFactory(ConnectionFactory connectionFactory)
{
this
.connectionFactory
=
connectionFactory;
connection
=
connectionFactory.getConnection();

try
{
statement
=
connection.createStatement();
}
catch
(SQLException ex)
{
System.err.println(ex);
}
}
public
Connection getConnection()
{
return
connection;
}
public
java.sql.Statement getStatement()
{
return
statement;
}
}
package
skydev.modules.data;


public
class
DbObject

extends
DatabaseObject
{
//
private final static String driveName = sun.jdbc.obdc.JdbcOdbcDriver;
public
DbObject()
{
super
(
new
SqlServerConnectionFactory(localhost,
1433
, TheSchool, sa,
));
}
public
DbObject(ConnectionFactory connectionFactory)
{
super
(connectionFactory);
}
}
package
skydev.modules.data;

public
final
class
SqlServerConnectionFactory

extends
ConnectionFactory
{
private
final
String dbDriver
=
com.microsoft.jdbc.sqlserver.SQLServerDriver;
private
String host;
private
int
port;
private
String databaseName;


public
SqlServerConnectionFactory()
{
super
.setDriverName(dbDriver);
}
/** */
/**
*
*
@param
host 数据库所在的主机名:如localhost
*
@param
port SQL服务器运行的端口号,如果使用缺省值 1433,传入一个负数即可
*
@param
databaseName 数据库名称
*
@param
userName 用户名
*
@param
password 口令
*/
public
SqlServerConnectionFactory(String host,
int
port,
String databaseName,
String userName,
 String password)
{
this
.setHost(host);
this
.setPort(port);
this
.setDatabaseName(databaseName);
this
.setUserName(userName);
this
.setPassword(password);

init();
}
private
void
init()
{
super
.setDriverName(dbDriver);
super
.setUrl(jdbc:microsoft:sqlserver:
//
+ host.trim() + : +
new
Integer(port).toString()
+
;DatabaseName
=
+
databaseName.trim());
//
super.setUrl(jdbc:microsoft:sqlserver:
//
localhost:1433;DatabaseName=demo);
}
public
void
setHost(String host)
{
//
处理主机名称
if
( (host
==
null
)
||
(host.equals())
||
(host.equals(.))
||
(host.equals(local)))
{
host
=
localhost;
}
int
index
=
host.indexOf(
//
, 0);
if
(index
==
0
)
{
host
=
host.substring(
2
);
//
去掉前面的
//
}
index
=
host.indexOf(
//
, 0);
if
(index
>=
0
)
{

try
{
throw
new
Exception(SQL Server主机名参数错误!);
}
catch
(Exception ex)
{
}
}
this
.host
=
host;
}
public
void
setPort(
int
port)
{

/** */
/**
* 缺省端口1433
*/
if
(port
<
0
)
{
port
=
1433
;
}
this
.port
=
port;
}
public
void
setDatabaseName(String databaseName)
{
this
.databaseName
=
databaseName;
}
}

package
skydev.modules.data;

import
junit.framework.
*
;
import
java.sql.
*
;

public
class
TestSqlServerConnectionFactory

extends
TestCase
{
private
SqlServerConnectionFactory sqlServerConnectionFactory
=
null
;


protected
void
setUp()
throws
Exception
{
super
.setUp();

/** */
/**
@todo verify the constructors
*/
sqlServerConnectionFactory
=
new
SqlServerConnectionFactory();
}
protected
void
tearDown()
throws
Exception
{
sqlServerConnectionFactory
=
null
;
super
.tearDown();
}
public
void
testEmpty()
{
//
assertTrue(objCon.connectDatabase());
assertEquals(sqlServerConnectionFactory.getDriverName(),
com.microsoft.jdbc.sqlserver.SQLServerDriver);
}
public
void
testDB1()
{

DbObject DbO
=
new
DbObject(
new
SqlServerConnectionFactory(localhost,
1433
, demo, sa, ));
Connection con
=
DbO.getConnection();
CallableStatement pstmt
=
null
;
System.out.println(TestDB1()   );

/**/
/*
try {
pstmt = con.prepareCall({call sp_getStudentById(?)});
pstmt.setInt(1, 1);
}
*/
try
{
 pstmt
=
con.prepareCall(
{call sp_getStudentByName(
?
)}
);
pstmt.setString(
1
, Tom);
}
catch
(SQLException ex1)
{
System.out.println(ex1);
}
catch
(Exception ex)
{
System.out.println(ex);
}
ResultSet results
=
null
;
ResultSetMetaData resultMetaData
=
null
;

try
{
//
results = DbO.getResultSet(sp_getStudentByName);
results
=
pstmt.executeQuery();
resultMetaData
=
DbO.getResultSetMetaData(results);
int
cols
=
resultMetaData.getColumnCount();
String resultRow
=
\n字段\n;

for
(
int
i
=
1
; i
<=
cols; i
++
)
{
resultRow
+=
resultMetaData.getColumnName(i)
+
;;
}
System.out.println(resultRow);

while
(results.next())
{
resultRow
=
\n内容\n;

for
(
int
i
=
1
; i
<=
cols; i
++
)
{

try
{
resultRow
+=
results.getString(i)
+
;;
}
catch
(NullPointerException e)
{
System.out.println(e.getMessage());
}
}
System.out.println(resultRow);
}
}
catch
(SQLException ex)
{
}
}
public
void
testDB2()
{
DbObject DbO
=
new
DbObject(
new
SqlServerConnectionFactory(localhost,
1433
, demo, sa, ));
//
DbO.setConnectionFactory(new SqlServerConnectionFactory());
//
Connection con = DbO.getConnection();
System.out.println(TestDB2()  );
ResultSet results
=
null
;
ResultSetMetaData resultMetaData
=
null
;

try
{
results
=
DbO.getResultSet(select
*
from Persons;);
resultMetaData
=
DbO.getResultSetMetaData();
int
cols
=
resultMetaData.getColumnCount();
String resultRow
=
\n字段\n;

for
(
int
i
=
1
; i
<=
cols; i
++
)
{
resultRow
+=
resultMetaData.getColumnName(i)
+
;;
}
System.out.println(resultRow);

while
(results.next())
{
resultRow
=
\n内容\n;

for
(
int
i
=
1
; i
<=
cols; i
++
)
{

try
{
resultRow
+=
results.getString(i)
+
;;
}
catch
(NullPointerException e)
{
System.out.println(e.getMessage());
}
}
System.out.println(resultRow);
}
}
catch
(SQLException ex)
{
}
}
public
void
testDB3()
{

DbObject DbO
=
new
DbObject(
new
SqlServerConnectionFactory(localhost,
1433
, demo, sa, ));
Connection con
=
DbO.getConnection();
CallableStatement pstmt
=
null
;
System.out.println(TestDB3()   );

try
{
 pstmt
=
con.prepareCall(
{
?=
call sp_insertStudent(
?
,
?
,
?
)}
);
pstmt.setString(
2
, zengqingsong);
pstmt.setInt(
3
,
22
);

pstmt.registerOutParameter(
4
, Types.INTEGER);
pstmt.registerOutParameter(
1
, Types.INTEGER);
int
ret
=
pstmt.executeUpdate();
//
执行影响的行数
int
ret2
=
pstmt.getInt(
1
);
//
返回参数(输出参数)
int
id
=
pstmt.getInt(
4
);
//
输出参数
System.out.println(ret);
System.out.println(ret2);
System.out.println(id);
}
catch
(SQLException ex1)
{
System.out.println(ex1);
}
catch
(Exception ex)
{
System.out.println(ex);
}
}
}
|
|
|
导航
统计
- 随笔: 115
- 文章: 1
- 评论: 86
- 引用: 0
常用链接
留言簿(5)
随笔档案(115)
网址
搜索
积分与排名
最新评论

阅读排行榜
评论排行榜
|
|