使用MyEclipse连接Oracle数据库,通过的是JDBC,JDBC为J2EE标准之一,下面通过一个实例来说明连接的过程,并对比使用ADO.NET连接SQLServer。
PreparedStatement
PreparedStatement对象被预编译,且包含已经编译的SQL语句,所以执行效率较高,并且提供了一整套参数设置方法,结合Connection和带占位符的SQL语句,即可完成常用的数据库操作。PreparedStatement继承于Statement这二者的异同和优劣稍后会讨论。
以下以一个添加用户实例,说明操作数据库过程。
配置文件
为了灵活配置,数据库连接内容必定要与持久层类解耦合。
<?xml version="1.0" encoding="UTF-8"?> <config> <db-info> <driver-name>oracle.jdbc.driver.OracleDriver</driver-name> <url>jdbc:oracle:thin:@localhost:1521:bjpowern</url> <user-name>drp1</user-name> <password>drp1</password> </db-info> </config>
实体
将数据库字段进行封装,方便调用传递。
/** * jdbc配置信息 * @author Administrator * */ public class JdbcConfig { private String driverName; private String url; private String userName; private String 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 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; } @Override public String toString() { return this.getClass().getName() + "{driverName:" + driverName + ", url:" + url + ", userName:" + userName + "}"; } }
读取配置
专门写一个类,用于读取配置文件,此处以数据库连接信息为例。
/** * 采用单例模式解析sys-config.xml文件 * @author Administrator * */ public class XmlConfigReader { //懒汉式(延迟加载lazy) private static XmlConfigReader instance = null; //保存jdbc相关配置信息 private JdbcConfig jdbcConfig = new JdbcConfig(); private XmlConfigReader() { SAXReader reader = new SAXReader(); InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml"); try { Document doc = reader.read(in); //取得jdbc相关配置信息 Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name"); Element urlElt = (Element)doc.selectObject("/config/db-info/url"); Element userNameElt = (Element)doc.selectObject("/config/db-info/user-name"); Element passwordElt = (Element)doc.selectObject("/config/db-info/password"); //设置jdbc相关的配置 jdbcConfig.setDriverName(driverNameElt.getStringValue()); jdbcConfig.setUrl(urlElt.getStringValue()); jdbcConfig.setUserName(userNameElt.getStringValue()); jdbcConfig.setPassword(passwordElt.getStringValue()); } catch (DocumentException e) { e.printStackTrace(); } } public static synchronized XmlConfigReader getInstance() { if (instance == null) { instance = new XmlConfigReader(); } return instance; } /** * 返回jdbc相关配置 * @return */ public JdbcConfig getJdbcConfig() { return jdbcConfig; } //服务端测试数据 public static void main(String[] args) { JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig(); System.out.println(jdbcConfig); } }
封装数据库常用操作
这个和SQLHelper类似,抽离出持久层常用的函数。
/** * 封装数据常用操作 * @author Administrator * */ public class DbUtil { /** * 取得Connection * @return */ public static Connection getConnection() { Connection conn = null; try { JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig(); Class.forName(jdbcConfig.getDriverName()); conn = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUserName(), jdbcConfig.getPassword()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } //关闭数据库连接 public static void close(Connection conn) { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } //关闭Statement public static void close(PreparedStatement pstmt) { if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } } //关闭结果集 public static void close(ResultSet rs ) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } //服务端测试 public static void main(String[] args) { System.out.println(DbUtil.getConnection()); } }
添加用户
使用PreparedStatement对参数赋值。
/** * 添加用户 * @param user */ public void addUser(User user) { String sql = "insert into t_user (user_id, user_name, password, contact_tel, email, create_date) " + " values (?, ?, ?, ?, ?, ?)"; Connection conn = null; PreparedStatement pstmt = null; try { conn = DbUtil.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, user.getUserId()); pstmt.setString(2, user.getUserName()); pstmt.setString(3, user.getPassword()); pstmt.setString(4, user.getContactTel()); pstmt.setString(5, user.getEmail()); pstmt.setTimestamp(6, new Timestamp(new Date().getTime())); pstmt.executeUpdate(); }catch(SQLException e) { e.printStackTrace(); }finally { DbUtil.close(pstmt); DbUtil.close(conn); } }
总结
JDBC内容丰富,此处仅以基本的操作为例说明,结合上面,其实JDBC、ADO.NET、ADO,操作数据库过程相似:根据数据库连接字符串及账户、密码,获取数据库连接;输入待操作的SQL命名语句;补充所需要的参数;执行。
对比学习,构建知识网。
更多DRP系列博客,其访问《DRP项目总结》。