- 浏览: 897345 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (498)
- J2EE (52)
- 数据库 (17)
- java基础 (43)
- web技术 (19)
- 程序设计 (6)
- 操作系统 (18)
- IT资讯 (7)
- 我的IT生活 (12)
- 学习笔记 (9)
- Jquery (25)
- JavaScript (18)
- spring (40)
- Hibernate (12)
- Struts (10)
- YUI (2)
- Extjs (22)
- .net (0)
- Eclipse (10)
- 社会主义 (2)
- 服务器 (9)
- CSS (8)
- 网络安全 (16)
- 版本控制 (9)
- PHP (2)
- Oracle (42)
- SQL server (1)
- Mysql (11)
- 项目管理 (3)
- 开发工具使用 (10)
- SQL语句 (7)
- Perl (0)
- Shell (6)
- 漏洞 (4)
- ibatis (5)
- hacker (2)
- SQL注入 (6)
- Hacker工具 (2)
- 入侵和渗透 (7)
- 插件/组件 (2)
- 最爱开源 (5)
- 常用软件 (2)
- DOS (1)
- HTML (2)
- Android (9)
- CMS (1)
- portal (8)
- Linux (7)
- OSGI (1)
- Mina (5)
- maven (2)
- hadoop (7)
- twitter storm (2)
- sap hana (0)
- OAuth (0)
- RESTful (1)
- Nginx (4)
- flex (1)
- Dubbo (1)
- redis (1)
- springMVC (1)
- node.js (1)
- solr (2)
- Flume (1)
- MongoDB (2)
- ElasticSearch (1)
最新评论
-
M_drm:
请问要怎么设置浏览器才不报没权限呢?
用JS在页面调用本地可执行文件的方法(ACTIVEX) -
Alexniver:
官方文档。When importing data into I ...
mysql导入数据过慢 解决方法 -
camelwoo:
我记得 Criteria 可以做连接查询与子查询,也可以做分页 ...
Hibernate总结篇二 -
zhenglongfei:
楼主如果SubKeyName 这个节点不存在,怎么办??怎么用 ...
Java操作注册表 -
yxx676229549:
用log4j 2 了
logback
Connection的含义
Connection表示了一个和数据库的链接,底层需要有操作系统的Socket支持,所以Connection是一种资源,既然是一种资源,就需要按照建立,打开,使用,关闭的顺序合理的使用。
Connection是Java数据库操作的基础,是进行一系列操作的基础,所有的派生的操作,例如Statement,PreparedStatement,ResultSet等都由Connection直接或者间接的衍生。
如何获得Connection呢?
方法一,使用DriverManager类来获取,前提条件是数据库驱动程序需要在classpath下(即使用数据库链接的程序按照Java的方式可以访问到)。
Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.0.1:1521:ORCL", user, pwd );
方法二,使用数据库连接池来获取
什么是数据库连接池呢,数据库连接池是标准JavaEE容器的一种服务,例如Webspher,Weblogic,Tomcat等,容器预先建立一些数据 库链接,以便应用程序使用的时候从中借取,注意有借有还,当应用程序使用完了之后会将数据库链接还回连接池。(数据源配置请参考其他文档)
使用连接池的好处是,可以预先建立链接,减小在数据库获取上的相对时间。
使用连接池获取数据库链接的方式为:
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/DataSource");
Connection conn = ds.getConnection();
由于在配置数据库连接池的时候已经定义了URL,用户名,密码等信息,所以在程序中使用的时候不需要传入这些信息。
ConnectionManager定义
Connection用来专门管理数据库链接,通常情况下ConnectionManager只有一个方法,调用这个方法将返回一个Connection 的实例。通过ConnectionManager可以封装Connection的获取方式(例如开发的时候使用DriverManager,运用的时候使 用DataSource的方式,但是不需要修改ConnectionManager之外的其他代码)和追加Connection获取之前之后的操作(例如 针对Connection的属性的设置)。
下面的代码是一个ConnectionManager的代码示例:
如果需要从开发模式变为运用模式,只需要将上述代码修改为:
如果需要预先设定Connection的一些属性,也可以在上述代码中设定,例如:
CommonDao定义
属性和构造方法
通常情况下,CommonDao要有一个Connection的引用。所有一个CommonDao的实例的所有方法的调用都需要依赖于这个 Connection。需要一个Connection的另外一个原因是如果各个方法需要保证在一个事务环境中(上下文中),必须保证所有的操作都在一个 Connection上。
构造方法通常需要将类型为Connection的属性实例化,例如:
事务方法
begin()
开始一个事务,调用CommonDao的begin方法之后,所以的后续操作将会在一个事务环境内,要么全部提交,要么全部回滚。
commit()
提交一个事务,必须在begin调用之后调用。且和rollback方法互斥。
rollback()
回滚一个事务,必须在begin方法调用之后调用。且和commit方法互斥。
事务的实现有两种方法,一种是使用基于单一Connection的事务,另外一种方法是使用容器的JTA(Java Transaction API)。需要注意的是第一种方法可以在任何环境下使用,但是只能是针对单一的数据库链接。第二种方法智能在支持JTA的Java EE容器中使用(例如Websphere,Weblogic等,Tomcat默认不支持),但是支持多个Connection实例。
第一种方法代码为:
第二种我们在使用DAO的实例中介绍如何使用(@TODO)
新建两个DAO,做不同的操作,使用JTA保证事务完整。
查询方法
查询方法也许是CommonDao最常用的方法,查询方法需要将数据库的结果返回给画面。返回值我们一般不使用ResultSet,因为 ResultSet依赖于Connection,如果Connection关闭,ResultSet将不再有效,所以我们通常将ResultSet转变为 一个List之后返回。
在说明查询方法之前,我们先说说如何将数据库中的内容放在List中,我们使用一个List表示一个查询结果集合,使用一个Map表示集合中的一行,Map的key表示数据库表的字段名字,Value表示数据库字段的内容。代码为:
为了避免Sql注入的安全问题,我们通常使用PreparedStatement,在使用PreparedStatement的时候涉及到如何将传入参数设置到PreparedStatement上面,参看以下的共通方法:
接着我们继续说我们的查询方法,有了上述两个方法,我们的查询方法就非常简单了:
特殊的查询方法(返回单值)
有时候为了方便使用,我们需要返回单值的产寻方法,例如 select max(id) from table_a, select count(id) from table_b等。以下的代码使用了上述通用的查询方法,代码为:
更新,删除,插入方法
由于在JDBC中这三个方法都是用了一个execute完成,所以这里我们也使用一个方法来完成这些功能。代码为:
批处理方法(查询)
有些时候为了便于操作,需要一次查询多条SQL语句,我们称之为批处理,实现参看以下方法,其中为了和query方法做区分,将参数和返回值都改为了数组形式。
有些时候需要一次更新多条Sql语句,为了便于操作,添加了批处理更新操作,参看以下代码,为了和更新方法区分,将参数和返回值都改为了数组形式。
资源释放
由于CommonDao有一个Connection的属性,且Connection属于稀缺资源,所以在CommonDao不需要在使用的时候需要显示的关闭Connection。代码如下:
JDBC工具类(JDBCUtil Class)
在上述的代码中我们看到有很多的无用的处理,例如:
为什么要有这些处理呢?说先这些处理发生的位置都是在正常处理完成之后,这些处理(例如pstmt.close())即使失败也没有影响,这个时候我们需 要做上述的无用处理,这正是JDBC API的一个小小的瑕疵。我们通常使用一个特殊的静态工具来来做补充,例如:
也许细心的你已经发现了一个问题,为什么所有抛出异常的地方我们都是将SQLException包装在了DaoException之内抛出呢,为什么不直 接抛出SQLException呢?有两个原因,第一,可以细化,分类Exception抛出合适的异常,添加合适的消息,第二,隔离和Dao和业务逻辑 的耦合,可以方便的修改Dao层而不会影响到业务逻辑层。另外需要注意,DaoExcetion中可以包含SQLException,这个时候可以为客户 提供更详细的错误信息,例如ORA-12524等内容,但是很少见到。
http://persevere.iteye.com/blog/249882
Connection表示了一个和数据库的链接,底层需要有操作系统的Socket支持,所以Connection是一种资源,既然是一种资源,就需要按照建立,打开,使用,关闭的顺序合理的使用。
Connection是Java数据库操作的基础,是进行一系列操作的基础,所有的派生的操作,例如Statement,PreparedStatement,ResultSet等都由Connection直接或者间接的衍生。
如何获得Connection呢?
方法一,使用DriverManager类来获取,前提条件是数据库驱动程序需要在classpath下(即使用数据库链接的程序按照Java的方式可以访问到)。
Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.0.1:1521:ORCL", user, pwd );
方法二,使用数据库连接池来获取
什么是数据库连接池呢,数据库连接池是标准JavaEE容器的一种服务,例如Webspher,Weblogic,Tomcat等,容器预先建立一些数据 库链接,以便应用程序使用的时候从中借取,注意有借有还,当应用程序使用完了之后会将数据库链接还回连接池。(数据源配置请参考其他文档)
使用连接池的好处是,可以预先建立链接,减小在数据库获取上的相对时间。
使用连接池获取数据库链接的方式为:
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/DataSource");
Connection conn = ds.getConnection();
由于在配置数据库连接池的时候已经定义了URL,用户名,密码等信息,所以在程序中使用的时候不需要传入这些信息。
ConnectionManager定义
Connection用来专门管理数据库链接,通常情况下ConnectionManager只有一个方法,调用这个方法将返回一个Connection 的实例。通过ConnectionManager可以封装Connection的获取方式(例如开发的时候使用DriverManager,运用的时候使 用DataSource的方式,但是不需要修改ConnectionManager之外的其他代码)和追加Connection获取之前之后的操作(例如 针对Connection的属性的设置)。
下面的代码是一个ConnectionManager的代码示例:
package com.jpleasure.jdbc.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionManager { public static Connection getConnection() throws DaoException { Connection conn = null; try { conn = DriverManager.getConnection("", "", ""); } catch (SQLException e) { throw new DaoException("can not get database connection", e); } return conn; } }
如果需要从开发模式变为运用模式,只需要将上述代码修改为:
package com.jpleasure.jdbc.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionManager { public static Connection getConnection() throws DaoException { Connection conn = null; try { Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/dsname"); conn = ds.getConnection(); } catch(NamingException e) { throw new DaoException("can not find datasource", e); }catch (SQLException e) { throw new DaoException("can not get database connection", e); } return conn; } }
如果需要预先设定Connection的一些属性,也可以在上述代码中设定,例如:
package com.jpleasure.jdbc.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionManager { public static Connection getConnection() throws DaoException { Connection conn = null; try { Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/dsname"); conn = ds.getConnection(); conn.setAutoCommit(false); } catch(NamingException e) { throw new DaoException("can not find datasource", e); }catch (SQLException e) { throw new DaoException("can not get database connection", e); } return conn; } }
CommonDao定义
属性和构造方法
通常情况下,CommonDao要有一个Connection的引用。所有一个CommonDao的实例的所有方法的调用都需要依赖于这个 Connection。需要一个Connection的另外一个原因是如果各个方法需要保证在一个事务环境中(上下文中),必须保证所有的操作都在一个 Connection上。
构造方法通常需要将类型为Connection的属性实例化,例如:
package com.jpleasure.jdbc.dao; import java.sql.Connection; public class CommonDao { private Connection conn; public CommonDao() throws DaoException { this.conn = ConnectionManager.getConnection(); } }
事务方法
begin()
开始一个事务,调用CommonDao的begin方法之后,所以的后续操作将会在一个事务环境内,要么全部提交,要么全部回滚。
commit()
提交一个事务,必须在begin调用之后调用。且和rollback方法互斥。
rollback()
回滚一个事务,必须在begin方法调用之后调用。且和commit方法互斥。
事务的实现有两种方法,一种是使用基于单一Connection的事务,另外一种方法是使用容器的JTA(Java Transaction API)。需要注意的是第一种方法可以在任何环境下使用,但是只能是针对单一的数据库链接。第二种方法智能在支持JTA的Java EE容器中使用(例如Websphere,Weblogic等,Tomcat默认不支持),但是支持多个Connection实例。
第一种方法代码为:
package com.jpleasure.jdbc.dao; import java.sql.Connection; import java.sql.SQLException; public class CommonDao { private Connection conn; public CommonDao() throws DaoException { this.conn = ConnectionManager.getConnection(); } public void begin() throws DaoException{ if(conn != null) { try { conn.setAutoCommit(false); } catch (SQLException e) { throw new DaoException("can not begin transaction", e); } } else { throw new DaoException("connection not opened!"); } } public void commit() throws DaoException { try { if (conn != null && !conn.getAutoCommit()) { conn.commit(); conn.setAutoCommit(true); } else { if (conn == null) { throw new DaoException("connection not opened!"); } else { throw new DaoException("first begin then commit please!"); } } } catch (SQLException e) { throw new DaoException("can not commit transaction!", e); } } public void rollback() throws DaoException { try { if (conn != null && !conn.getAutoCommit()) { conn.rollback(); conn.setAutoCommit(true); } else { if (conn == null) { throw new DaoException("connection not opened!"); } else { throw new DaoException("first begin then rollback please!"); } } } catch (SQLException e) { throw new DaoException("can not rollback transaction!", e); } } }
第二种我们在使用DAO的实例中介绍如何使用(@TODO)
新建两个DAO,做不同的操作,使用JTA保证事务完整。
查询方法
查询方法也许是CommonDao最常用的方法,查询方法需要将数据库的结果返回给画面。返回值我们一般不使用ResultSet,因为 ResultSet依赖于Connection,如果Connection关闭,ResultSet将不再有效,所以我们通常将ResultSet转变为 一个List之后返回。
在说明查询方法之前,我们先说说如何将数据库中的内容放在List中,我们使用一个List表示一个查询结果集合,使用一个Map表示集合中的一行,Map的key表示数据库表的字段名字,Value表示数据库字段的内容。代码为:
private List convert(ResultSet rs) throws DaoException { // record list List retList = new ArrayList(); try { ResultSetMetaData meta = rs.getMetaData(); // column count int colCount = meta.getColumnCount(); // each record while (rs.next()) { Map recordMap = new HashMap(); // each column for (int i = 1; i <= colCount; i++) { // column name String name = meta.getColumnName(i); // column value Object value = rs.getObject(i); // add column to record recordMap.put(name, value); } // ad record to list retList.add(recordMap); } } catch (SQLException ex) { throw new DaoException("can not convert result set to list of map", ex); } return retList; }
为了避免Sql注入的安全问题,我们通常使用PreparedStatement,在使用PreparedStatement的时候涉及到如何将传入参数设置到PreparedStatement上面,参看以下的共通方法:
private void apply(PreparedStatement pstmt, List params) throws DaoException { try { // if params exist if (params != null && params.size() > 0) { // parameters iterator Iterator it = params.iterator(); // parameter index int index = 1; while(it.hasNext()) { Object obj = it.next(); // if null set "" if (obj == null) { pstmt.setObject(index, ""); } else { // else set object pstmt.setObject(index, obj); } //next index index++; } } } catch (SQLException ex) { throw new DaoException("can not apply parameter", ex); } }
接着我们继续说我们的查询方法,有了上述两个方法,我们的查询方法就非常简单了:
public List query(String sql, List params) throws DaoException { List result = null; PreparedStatement pstmt = null; ResultSet rs = null; try { pstmt = conn.prepareStatement(sql); this.apply(pstmt, params); rs = pstmt.executeQuery(); result = this.convert(rs); } catch (SQLException ex) { throw new DaoException("can not execute query", ex); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { // nothing } } if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { // nothing } } } return result; }
特殊的查询方法(返回单值)
有时候为了方便使用,我们需要返回单值的产寻方法,例如 select max(id) from table_a, select count(id) from table_b等。以下的代码使用了上述通用的查询方法,代码为:
public Object queryOne(String sql, List params) throws DaoException { List list = this.query(sql, params); if(list == null || list.size() == 0) { throw new DaoException("data not exist"); } else { Map record = (Map)list.get(0); if(record == null || record.size() == 0 ) { throw new DaoException("data not exist"); } else { return record.values().toArray()[0]; } } }
更新,删除,插入方法
由于在JDBC中这三个方法都是用了一个execute完成,所以这里我们也使用一个方法来完成这些功能。代码为:
public int execute(String sql, List params) throws DaoException { int ret = 0; PreparedStatement pstmt = null; try { pstmt = conn.prepareStatement(sql); this.apply(pstmt, params); ret = pstmt.executeUpdate(); }catch(SQLException ex) { throw new DaoException("", ex); } finally { if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { // nothing. } } } return ret; }
批处理方法(查询)
有些时候为了便于操作,需要一次查询多条SQL语句,我们称之为批处理,实现参看以下方法,其中为了和query方法做区分,将参数和返回值都改为了数组形式。
public List[] queryBatch(String[] sqlArray, List[] paramArray) throws DaoException { List rets = new ArrayList(); if(sqlArray.length != paramArray.length) { throw new DaoException("sql size not equal parameter size"); } else { for(int i = 0; i < sqlArray.length; i++) { String sql = sqlArray[i]; List param = paramArray[i]; List ret = this.query(sql, param); rets.add(ret); } return (List[])rets.toArray(); } }
批处理方法(更新)
有些时候需要一次更新多条Sql语句,为了便于操作,添加了批处理更新操作,参看以下代码,为了和更新方法区分,将参数和返回值都改为了数组形式。
public int[] executeBatch(String[] sqlArray, List[] paramArray) throws DaoException { List rets = new ArrayList(); if(sqlArray.length != paramArray.length) { throw new DaoException("sql size not equal parameter size"); } else { for(int i = 0; i < sqlArray.length; i++) { int ret = this.execute(sqlArray[i], paramArray[i]); rets.add(new Integer(ret)); } int[] retArray = new int[rets.size()]; for(int i = 0; i < retArray.length; i++) { retArray[i] = ((Integer)rets.get(i)).intValue(); } return retArray; } }
资源释放
由于CommonDao有一个Connection的属性,且Connection属于稀缺资源,所以在CommonDao不需要在使用的时候需要显示的关闭Connection。代码如下:
public void close() throws DaoException{ try { if (conn != null && conn.getAutoCommit()) { conn.close(); } else { if(conn == null) { throw new DaoException("can not close null connection, first new then close"); } else { throw new DaoException("transaction is running, rollbakc or commit befor close please."); } } } catch (SQLException ex) { throw new DaoException("Can not close common dao"); } }
JDBC工具类(JDBCUtil Class)
在上述的代码中我们看到有很多的无用的处理,例如:
if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { // nothing. } }
为什么要有这些处理呢?说先这些处理发生的位置都是在正常处理完成之后,这些处理(例如pstmt.close())即使失败也没有影响,这个时候我们需 要做上述的无用处理,这正是JDBC API的一个小小的瑕疵。我们通常使用一个特殊的静态工具来来做补充,例如:
package com.jpleasure.jdbc.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class JDBCUtil { public void safelyClose(Connection conn) { if(conn != null) { try { conn.close(); } catch (SQLException e) { // } } } public void safelyClose(PreparedStatement pstmt) { if(pstmt != null) { try { pstmt.close(); } catch (SQLException e) { // } } } public void safelyClose(ResultSet rs) { if(rs != null) { try { rs.close(); } catch (SQLException e) { // } } } }
异常处理
也许细心的你已经发现了一个问题,为什么所有抛出异常的地方我们都是将SQLException包装在了DaoException之内抛出呢,为什么不直 接抛出SQLException呢?有两个原因,第一,可以细化,分类Exception抛出合适的异常,添加合适的消息,第二,隔离和Dao和业务逻辑 的耦合,可以方便的修改Dao层而不会影响到业务逻辑层。另外需要注意,DaoExcetion中可以包含SQLException,这个时候可以为客户 提供更详细的错误信息,例如ORA-12524等内容,但是很少见到。
package com.jpleasure.jdbc.dao; public class DaoException extends Exception { public DaoException() { super(); } public DaoException(String message, Throwable cause) { super(message, cause); } public DaoException(String message) { super(message); } public DaoException(Throwable cause) { super(cause); } }
http://persevere.iteye.com/blog/249882
发表评论
-
HTTP文件断点上传
2013-05-14 00:10 990HTTP文件断点上传 http://www.cnblogs.c ... -
使用 Eclipse Memory Analyzer 检测内存泄漏问题
2013-05-05 19:01 820转:http://blog.csdn.net/moneyice ... -
Java字符编码根本原理
2013-04-03 16:33 828Java开发中,常常会遇到乱码的问题,一旦遇到这种问题,常常就 ... -
StringUtils常用方法说明
2013-01-28 09:21 966http://www.iteye.com/topic/1128 ... -
中文排序要注意的问题
2012-12-08 10:10 1113遇到了中文排序问题,比如想用拼音排序, String[] ... -
位运算
2012-11-21 17:50 921程序中的所有数在计算 ... -
HashMap的2中遍历方式比较
2012-11-20 11:47 961http://smallnetvisitor.iteye.co ... -
java计算校验和:对“消息头+会话头+事务头+操作信息”按32位异或,对异或结果取反后的值为校验和。
2012-08-14 17:41 3503java计算校验和:对“消 ... -
java中对Byte字符数组定长截取的方法
2012-08-14 16:33 2069今天在在处理从网络上接收到的字符串,因为是从后台C语言过来的一 ... -
用java流方式判断文件类型
2012-06-28 09:50 1687原文:http://rainsilence.iteye.com ... -
ConcurrentHashMap分析
2012-02-07 16:36 1003ConcurrentHashMap分析 http://w ... -
Webservice调用方式:axis,soap详解
2011-11-29 12:41 1507转自:[url] http://blog.csdn.net/b ... -
java使用相对路径读取xml文件
2011-11-24 20:16 2789java使用相对路径读取xml文件: 一、xml文件一般的存放 ... -
Java 加载配置文件的方式
2011-11-24 20:15 910Java 加载配置文件的方式 http://liuzidon ... -
如何获得request response session 对象
2011-10-10 18:39 1278如何获得request response se ... -
通过分析JDK源代码研究 Hash 存储机制
2011-07-01 15:53 1224HashMap 和 HashSet 是 Java Collec ... -
java判断数组内有无重复元素
2011-03-23 16:50 5254/** * 判断数组内有无重复元素 * @param ... -
java监听组合键
2011-03-18 15:13 1098监听普通ctrl+c的代码 public void keyP ... -
jdbc中执行一系列sql语句时一个简单事务的实现
2011-01-23 22:35 1619以下代码并没有用到第三方的东西,完全是在java jdk的接口 ... -
设计模式大集合
2010-12-31 14:50 9031、装饰者模式 http://www.iteye.com/t ...
相关推荐
Spring作为现在最优秀的框架之一已被广泛的使用51CTO也曾经针对Spring框架中的JDBC应用做过 报道。本文将从另外一个视角试图剖析出Spring框架的作者设计Spring框架的骨骼架构的设计理念。 Rod Johson在2002年...
设计到了java相关的好多部分,包括xml,sql,jdbc等部分,总共200道题。
目录 前 言 1 一、 系统描述: 2 1、设计目的 2 2、需求分析 2 3、设计任务要求 3 4、系统主要包括以下几项功能: 3 5、界面构建 3 二、课程设计内容: 3 1、 数据库系统简介 3 2 、JDBC数据库连接 4 3 、建立JDBC...
(2)HTML&CSS&JavaScriptHTML,用于对网页的前端进行设计,建立能与后端交互的通道 (3)JDBCJDBC(Java DataBase Co
数据库课程设计 -简单学生信息管理系统 学院:计算机科学学院 专业:软件工程02 学号: :欢欢 目录 1设计目的 3 2设计任务 3 2.1任务说明 3 2.2系统目标 4 2.2使用围 4 2.3功能要求 4 3 设计容 4 3.1界面构建 4 3.2...
之道 》,其中很多观点我看了很受启发,以前我也将"设计模式" 看成一个简单的解决方案,没有从一种高度来看待"设计模式"在软 件中地位,下面是我自己的一些想法: 建筑和软件某些地方是可以来比喻的 特别是中国传统建筑...
这篇文章总结了77道Spring面试题及答案,涵盖了Spring的多个核心主题,包括Spring概述、Spring控制反转(IoC)、Spring Bean、Spring注解、Spring数据访问和Spring面向切面编程(AOP)等。文章对每个主题下的重点问题都给...
大工 15 春《Java 程序设计》在线作业 3 单选题 判断题 一、单选题(共 10 道试题,共 50 分。 ) 1. 下列协议中不属于应用层协议的是( ) 。 A. DNS B. ICMP C. Telnet D. SMTP ----------------- 选择:B 2. 下列...
JAVA+MySQL的图书管理课程设计用于毕业设计, 懒得做毕业设计的童鞋,快来下载吧!
本书是国人原创的第一本涉及框架、组件构件等重用概念的Java畅销书,该书通过8个系统,指出了一个成熟Java/J2EE系统设计开发的正确之道:Model(建模)、Patterns(模式)和Framework(框架)。 需求UML分析与域...
本书是国人原创的第一本涉及框架、组件构件等重用概念的Java畅销书,该书通过8个系统,指出了一个成熟Java/J2EE系统设计开发的正确之道:Model(建模)、Patterns(模式)和Framework(框架)。 需求UML分析与域...
本书是国人原创的第一本涉及框架、组件构件等重用概念的Java畅销书,该书通过8个系统,指出了一个成熟Java/J2EE系统设计开发的正确之道:Model(建模)、Patterns(模式)和Framework(框架)。 需求UML分析与域...
在传统的绩效考核信息管理中,其过程往往是很复杂的,繁琐的,绩效考核信息管理以绩效考核信息管理为核心,在此过程中又需要经过若干道手续,因为整个过程都需要手工操作,效率十分低下,且由于他们之间关联复杂,...
数据库相关:包括关系型数据库和非关系型数据库的使用,以及JDBC、MyBatis等与数据库交互的技术。 实战项目经验:分享了几个经典的Java项目,解析了项目的架构设计和核心技术点。 面试经验和技巧:整理了常见的Java...
1. 写出JDBC的连接(oracle,sql2000,mysql)。 2. 用java语言写出堆栈的代码 3. 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少 4. 用java代码对XML进行解释。 5. 用java语言实现文件上传操作,并...
《Oracle 从入门到精通》中的视频教程和PPT资料。 Oracle 11G从入门到精通视频的PPT 第1章-Oracle 11g数据库简介 认识Oracle 11g 回忆Oracle的产品版本 学习Oracle 11g的新特性 ...JDBC-ODBC桥连接Oracle
8.1.3 JDBC 与 JDBC 4.0 191 8.1.4 用Java让数据库动起来 192 8.1.5 事务处理简介 194 8.2 练习 195 8.2.1 数据库操作 195 8.2.2 我的联系手册 199 8.2.3 事务处理 221 8.3 小结 222 第9章 还想再见到你——...
8.1.3 JDBC 与 JDBC 4.0 191 8.1.4 用Java让数据库动起来 192 8.1.5 事务处理简介 194 8.2 练习 195 8.2.1 数据库操作 195 8.2.2 我的联系手册 199 8.2.3 事务处理 221 8.3 小结 222 第9章 还想再见到你——...
JDBC 演示6 任务6-DL 25.9。 道 示范7 任务7-DL 25.9。 准备好的声明 示范8 任务8-DL 25.9。 4.版本控制 平台 白板 吉特 克隆,拉取,添加,提交,推送 5.软件设计 建筑设计 三层架构 在白板上 MVC ...