我们在做信息系统的时候,都要访问数据库,我最近接手一个项目,项目组决定使用Java编写,我负责数据层的设计和编码,为了提高代码的重用性和提高项目的开发效率。我们开发了一个通用的数据库连接和完成基本操作的类库,个人认为这个类在做MIS系统时还是有一定的价值,所以总结出来,介绍给大家。
连接工厂,实现了DataSource接口
package skydev.modules.data; import java.sql.*; import javax.sql.DataSource; import java.io.PrintWriter; public class ConnectionFactory implements DataSource { private String userName; private String password; private String driverName; private String url; private java.sql.Connection connection;
/** * 根据设置的连接参数创建一个新的连接实例 * @return */ private Connection getNewConnection() { try { this.connection.close(); //试图关闭连接 } finally { this.connection = null; //释放连接 try { Class.forName(this.driverName); //加载驱动程序 //DriverManager.registerDriver(driver); 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; }
public Connection getConnection(String userName, String password) throws 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的连接工厂,这里因为我们的项目使用SQLServer2000所以只实现了SqlServerConnectionFactory。
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;//Sql数据库名称
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; } }
使用"sun.jdbc.odbc.JdbcOdbcDriver"连接数据库的连接工厂 package skydev.modules.data; public class JdbcOdbcConnectionFactory extends ConnectionFactory { private final static String driveName = "sun.jdbc.odbc.JdbcOdbcDriver"; private String odbcName;
public JdbcOdbcConnectionFactory() { super.setDriverName(driveName); }
/** *使用指定的Odbc数据源连接数据库服务器 * @param odbcName */ public JdbcOdbcConnectionFactory(String odbcName) { super.setDriverName(driveName); setOdbcName(odbcName); }
public void setOdbcName(String odbcName) { this.odbcName = odbcName; this.setUrl("jdbc:odbc:" + odbcName); } } |
package skydev.modules.data; import java.sql.*; import java.sql.PreparedStatement; import javax.sql.DataSource;
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; 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接口 }
/** * 执行查询 * @param sql 要执行的Sql语句 * @return 返回查询的结果集 ,查询失败返回null */ public ResultSet getResultSet(String sql) { try { 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; } public javax.sql.DataSource getDataSource() { return dataSource; } } |
具体项目的数据库访问基类
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); } } |
在项目中的数据库层中的数据库访问类都从DatabaseObject类派生,这样只需要在一个地方设置数据连接,其他地方都不需要涉及数据库访问的具体连接代码。
如:User类专门负责Users组的权限控制等,只需要简单的代码就可以连接并访问数据库了。这里具体实 现与此文章无关,只举一两个模块做例子。
public class User extends DbObject { public User() { //子类也可以覆盖基类的访问方式,在单机调式时有用。 // super(new SqlServerConnectionFactory("localhost", 1433, "TheSchool", "sa","")); super();//调用基类的数据库访问代码。 } /* 在做信息系统时为了提高客维护性,我们一般使用存储过程返回和修改数据,在数据库层代码不使用
Select语句直接检索数据,做到数据库层代码的最大的灵活性和可维护性。一旦发现需要修改数据库中的
代码,只需要修改村年初过程即可以。 下面介绍Java使用SqlServer StoreProcedure的方法。 存储过程的参数使用“?”代替,下面的代码有一定的代表性,存储过程有输入参数,输出参数。 存储过程的基本功能为:检测userID和encPassword是否和数据库存储的一致,返回UserID,如果不一
致返回-1。 */ //测试数据库中存储的已经加密的密码和用户传入的加密的密码是否一致。 public boolean testPassword(int userID, byte[] encPassword) { Connection con = this.getConnection(); CallableStatement cs = null; try { 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; } } catch (SQLException ex) { return false; } catch (Exception e) { return false; } } } |
以上只是我在学习和工作中的一点体会,写出来的目的使为了和大家交流,错误之处希望大家提出宝贵的意见,以便把该模块的功能做得更完善一点。
分享到:
相关推荐
在本压缩包“S2北大青鸟 使用Java实现数据库编程(包含项目).zip”中,主要涵盖的是S2学期的学习内容,重点在于讲解如何使用Java语言进行数据库编程。这一主题对于计算机科学的学生和开发者至关重要,因为Java是广泛...
在“Accp8.0\S2\使用Java实现数据库编程 第二章”这一主题中,我们聚焦于如何利用Java语言进行数据库编程。这通常涉及到Java的JDBC(Java Database Connectivity)技术,它是Java平台的标准接口,允许Java应用程序...
结合提供的标题"java实现数据库容灾备份"和描述"可以集成定时任务去实时备份或者定期备份,欢迎一起讨论",我们将详细介绍如何利用Java编写程序来自动化数据库的备份过程,并讨论相关技术要点。 首先,数据库备份是...
在“Accp8.0\S2\使用Java实现数据库编程 第四章”这一主题中,我们聚焦于如何利用Java这门强大的开发语言进行数据库交互。Java数据库编程是后端开发中的核心技能,尤其是在大型分布式系统中,数据管理与操作至关重要...
总的来说,使用Java实现数据库迁移同步需要对数据库操作、JDBC以及ETL流程有深入的理解。合理的设计和实现可以确保迁移过程的高效、稳定和可靠。在实践中,你还需要考虑到数据安全、性能监控和异常处理等方面,确保...
通过这些资源,读者可以更直观地学习Java数据库连接(JDBC)API的使用,以及如何设计和实现数据库驱动的Java应用程序。 首先,我们要理解Java数据库应用程序的基础,这通常涉及到JDBC(Java Database Connectivity...
当我们谈论“用Java实现的SQL数据库系统”,我们指的是使用Java编程语言开发的、支持SQL查询语言的数据库管理系统。这样的系统通常包括数据模型、查询解析器、事务管理器和存储引擎等核心组件。 1. **数据模型**:...
在"Accp8.0\S2\使用Java实现数据库编程 第五章"的学习资源中,我们聚焦于使用Java语言进行数据库编程的关键技术和实践。这一章节的内容涵盖了Java与数据库交互的基础,是成为一名合格的后端开发者必备的知识。标签...
【数据库加Java实现的超市管理系统】是一个典型的软件开发项目,主要涵盖了两个核心技术领域:数据库管理和Java编程。在这个系统中,数据库用于存储超市的各种数据,如商品信息、库存、销售记录等,而Java作为后端...
【标题】:“学生课程管理系统(JAVA实现、SOL数据库)” 这个系统是为教育机构或教师设计的一个简单但实用的工具,主要用于管理学生的课程和成绩。通过JAVA编程语言实现,它具备了添加、查询学生成绩以及教师信息...
本教程将基于Java连接Oracle数据库,以实现一个简单的用户登录系统,这对于初学者来说是一个很好的实践项目。 首先,你需要了解Java中的JDBC(Java Database Connectivity),它是Java语言访问数据库的标准API。...
本资源“Java Web数据库系统应用开发与实例”聚焦于使用MySQL数据库,结合jsp、servlet和javabean技术,提供了一个可以直接运行的案例,旨在帮助开发者深入理解和实践这些技术。 MySQL是一个广泛使用的开源关系型...
在本项目中,“数据库课程设计-JAVA实现学生信息管理系统”是一个用Java编程语言开发的教育实践项目,旨在帮助学习者理解和应用数据库管理系统的概念。这个系统主要目标是管理和操作学生的信息,提供一个用户友好的...
Java Web数据库系统应用开发是构建基于互联网的交互式应用程序的关键技术,主要涉及到Web服务器、数据库服务器和编程语言的集成。本资源"Java Web数据库系统应用开发与实例源代码"提供了实际操作中的源代码,帮助...
综上所述,Java实现多数据库数据同步是一个涉及多种技术和策略的复杂问题,需要根据具体业务需求和系统架构来选择合适的方法。在实践中,应注重设计的灵活性、可扩展性和容错性,以保证系统的稳定运行。
【标题】:“基于Java的数据库应用框架的研究设计” 【描述】:本文主要探讨了Java数据库技术与框架技术的关系,以及如何构建基于Java的数据库应用框架。作者通过实验设计和实现,旨在为相关研究者提供指导,促进...
在Java Web数据库系统应用开发中,我们通常会涉及到多个关键技术和概念,这些技术和概念构成了一个实际的开发案例,比如电子商城系统的实现。本篇将详细阐述这个领域中的核心知识点。 首先,Java Web开发离不开...
本篇文章将深入探讨如何使用Java实现一个包含基本功能如`select`、`insert`(插入后排序)、`create`和`delete`的数据库系统。 首先,我们需要理解数据库系统的基本架构。一个简单的数据库系统通常包括以下组件: ...