1、 /加载驱动程序 /DriverManager.registerDriver(driver);this.connection = DriverManager.getConnection(this.url, this.userName, this.password);catch (SQLException e) throw e;return this.connection; /返回新建立的连接 public String getUserName() return userName;public void setUserName(String userName) this.userName = u
2、serName;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
3、url) this.url = url;public java.sql.Connection getConnection() if (connection != null) if (connection.isClosed() connection = null;getNewConnection();catch (SQLException ex) if (connection = null) /没有设置连接则创建一个连接 return connection;public Connection getConnection(String userName, String password) thro
4、ws SQLException this.setUserName(userName);this.setPassword(password);return getConnection();public PrintWriter getLogWriter() return null;public void setLogWriter(PrintWriter printWriter) public void setLoginTimeout(int int0) public int getLoginTimeout() return 0;实现连接SQLServer的连接工厂,这里因为我们的项目使用SQLSe
5、rver2000所以只实现了SqlServerConnectionFactory。public final class SqlServerConnectionFactory extends ConnectionFactory private final String dbDriver =com.microsoft.jdbc.sqlserver.SQLServerDriver;private String host;/主机 private int port;/端口 private String databaseName;/Sql数据库名称 public SqlServerConnectionFa
6、ctory() 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)
7、 this.setHost(host);this.setPort(port);this.setDatabaseName(databaseName);init();private void init() super.setUrl(jdbc:microsoft:sqlserver:/ + host.trim() + : + new Integer(port).toString() + DatabaseName=databaseName.trim();/super.setUrl(/localhost:1433;DatabaseName=demo);public void setHost(String
8、 host) /处理主机名称 if ( (host = null) | (host.equals() | (host.equals(.) | (host.equals(local) host = int index = host.indexOf(, 0);if (index = 0) host = host.substring(2); /去掉前面的index = host.indexOf(if (index = 0) throw new Exception(SQL Server主机名参数错误!catch (Exception ex) this.host = host;public void s
9、etPort(int port) * 缺省端口1433 if (port 0) port = 1433;this.port = port;public void setDatabaseName(String databaseName) this.databaseName = databaseName;使用sun.jdbc.odbc.JdbcOdbcDriver连接数据库的连接工厂 public class JdbcOdbcConnectionFactory extends ConnectionFactory private final static String driveName = pri
10、vate String odbcName;public JdbcOdbcConnectionFactory() super.setDriverName(driveName);*使用指定的Odbc数据源连接数据库服务器 * param odbcName public JdbcOdbcConnectionFactory(String odbcName) setOdbcName(odbcName);public void setOdbcName(String odbcName) this.odbcName = odbcName;this.setUrl(odbc: + odbcName);数据基本操作
11、类,使用连接工厂连接数据库。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 statemen
12、t=null;private javax.sql.DataSource dataSource;/=new Statement();public DatabaseObject() dataSource=null;connection=null;public DatabaseObject(ConnectionFactory connectionFactory) this.setConnectionFactory(connectionFactory);this.dataSource=connectionFactory;/ConnectionFactory实现了DataSource接口 * 执行查询
13、* param sql 要执行的Sql语句 * return返回查询的结果集 ,查询失败返回null public ResultSet getResultSet(String sql) this.resultSet = statement.executeQuery(sql); /保留内部指针 e.printStackTrace();this.resultSet = null;return this.resultSet;* 获取外部指定ResltSet的ResultSetMetaData数据 * param resultSet 要获取的ResultSet * return 失败返回null pu
14、blic ResultSetMetaData getResultSetMetaData(ResultSet resultSet) ResultSetMetaData resultSetMetaData = null;resultSetMetaData = resultSet.getMetaData();resultSetMetaData = null;return resultSetMetaData;* 获取最近一次设置或者返回的ResultSet的ResultMetaData数据, * 比方说调用了:getResultSet(sql)方法,然后调用getResultSetMetaData方法
15、 * 可以获得相应的ResultSetMetaData数据。public ResultSetMetaData getResultSetMetaData() return this.getResultSetMetaData(this.resultSet);* 执行存储过程 * param spName 存储过程名称 public ResultSet Execute(String spName) /对此数据库执行一个 SQL 查询 ResultSet resultSet = null;/ PreparedStatement stmt = (PreparedStatement) connection
16、.createStatement();resultSet = statement.executeQuery(spName);catch (Exception e) System.out.println(execute error + e.getMessage();return resultSet;* 设置数据库连接工厂,对此类的所有操作之前,必须调用该方法, * 设置数据库连接工厂。* param connectionFactory 数据库连接工厂ConnectionFactory 类对象以及 * 派生类对象。public void setConnectionFactory(Connectio
17、nFactory connectionFactory) this.connectionFactory = connectionFactory;connection = connectionFactory.getConnection();statement = connection.createStatement();System.err.println(ex);public Connection getConnection() public java.sql.Statement getStatement() return statement;public javax.sql.DataSourc
18、e getDataSource() return dataSource;具体项目的数据库访问基类 public class DbObject extends DatabaseObject / private final static String driveName = sun.jdbc.obdc.JdbcOdbcDriverpublic DbObject() super(new SqlServerConnectionFactory(, 1433, TheSchool, sa,);public DbObject(ConnectionFactory connectionFactory) supe
19、r(connectionFactory);在项目中的数据库层中的数据库访问类都从DatabaseObject类派生,这样只需要在一个地方设置数据连接,其他地方都不需要涉及数据库访问的具体连接代码。如:User类专门负责Users组的权限控制等,只需要简单的代码就可以连接并访问数据库了。这里具体实 现与此文章无关,只举一两个模块做例子。public class User extends DbObject public User() /子类也可以覆盖基类的访问方式,在单机调式时有用。/ super(new SqlServerConnectionFactory(super();/调用基类的数据库访问
20、代码。/* 在做信息系统时为了提高客维护性,我们一般使用存储过程返回和修改数据,在数据库层代码不使用 Select语句直接检索数据,做到数据库层代码的最大的灵活性和可维护性。一旦发现需要修改数据库中的 代码,只需要修改村年初过程即可以。下面介绍Java使用SqlServer StoreProcedure的方法。存储过程的参数使用“?”代替,下面的代码有一定的代表性,存储过程有输入参数,输出参数。存储过程的基本功能为:检测userID和encPassword是否和数据库存储的一致,返回UserID,如果不一 致返回-1。/测试数据库中存储的已经加密的密码和用户传入的加密的密码是否一致。publi
21、c boolean testPassword(int userID, byte encPassword) Connection con = this.getConnection();CallableStatement cs = null;cs = con.prepareCall(?=call sp_Accounts_TestPassword(?,?)cs.setInt(2, userID);cs.setBytes(3, encPassword);cs.registerOutParameter(1, Types.INTEGER); /UserID cs.execute();if (cs.getInt(1) = 1) /密码合格 return true;else return false;以上只是我在学习和工作中的一点体会,写出来的目的使为了和大家交流,错误之处希望大家提出宝贵的意见,以便把该模块的功能做得更完善一点。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1