??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩精品免费一区二区三区,在线观看网站免费入口在线观看国内,99精品在线直播http://www.aygfsteel.com/jorwen/category/7241.htmlzh-cnWed, 28 Feb 2007 11:51:45 GMTWed, 28 Feb 2007 11:51:45 GMT60JAVA操作数据库方式与设计模式应用http://www.aygfsteel.com/jorwen/articles/29429.html方佳?/dc:creator>方佳?/author>Wed, 01 Feb 2006 04:44:00 GMThttp://www.aygfsteel.com/jorwen/articles/29429.htmlhttp://www.aygfsteel.com/jorwen/comments/29429.htmlhttp://www.aygfsteel.com/jorwen/articles/29429.html#Feedback0http://www.aygfsteel.com/jorwen/comments/commentRss/29429.htmlhttp://www.aygfsteel.com/jorwen/services/trackbacks/29429.html1.   在业务层使用JDBC直接操作数据库-最单,最直接的操?/FONT>
 
1Q数据库url,username,password写死在代码中
    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 
    String url="jdbc:oracle:thin:@localhost:1521:orcl"; 
    String user="scott"; 
    String password="tiger"; 
    Connection conn= DriverManager.getConnection(url,user,password); 
    Statement stmt=conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
    String sql="select * from test"; 
    ResultSet rs=stmt.executeQuery(sql);
 
2Q采用Facade和Command模式Q用DBUtilcd装JDBC操作Q?/FONT>
      数据库url,username,password可以攑֜配置文g中(如xml,properties,ini{)?/FONT>
      q种Ҏ在小E序中应用较多?/FONT>
 
2.DAO(Data Accessor Object)模式Q松耦合的开?/FONT>
DAO = data + accessor + domain object
 
 例如Userc-domain object (javabean)
UserDAOc-accessor Q提供的ҎgetUser(int id)Qsave(User user)内包含了JDBC操作
在业务逻辑中用这两个cL完成数据操作?/FONT>
 
使用Factory模式可以方便不同数据库连接之间的UL?/FONT>
 
3.数据库资源管理模?/FONT>
3.1 数据库连接池技?/FONT>
资源重用Q避免频J创建,释放q接引v大大量性能开销Q?/FONT>
更快的系l响应速度Q?/FONT>
 
通过实现JDBC的部分资源对象接? Connection, Statement, ResultSet )Q可以用Decorator设计模式分别产生三种逻辑资源对象: PooledConnection, PooledStatement?PooledResultSet?/FONT>
 
 
一个最单地数据库连接池实现Q?/FONT>
public class ConnectionPool {
 
       private static Vector pools;
       private final int POOL_MAXSIZE = 25;
       /**
        * 获取数据库连?/SPAN>
        * 如果当前池中有可用连接,则将池中最后一个返回;若没有,则创Z个新的返?/SPAN>
        */
       public synchronized Connection getConnection() {
              Connection conn = null;
              if (pools == null) {
                     pools = new Vector();
              }
 
              if (pools.isEmpty()) {
                     conn = createConnection();
              } else {
                     int last_idx = pools.size() - 1;
                     conn = (Connection) pools.get(last_idx);
                     pools.remove(last_idx);
              }
 
              return conn;
       }
 
       /**
        * 用完毕的数据库连接放回池?/SPAN>
        * 若池中连接已l超q阈|则关闭该q接Q否则放回池中下ơ再使用
        */
       public synchronized void releaseConnection(Connection conn) {
              if (pools.size() >= POOL_MAXSIZE)
                     try {
                            conn.close();
                     } catch (SQLException e) {
                            // TODO自动生成 catch ?/SPAN>
                            e.printStackTrace();
                     } else
                     pools.add(conn);
       }
 
       public static Connection createConnection() {
              Connection conn = null;
              try {
                     Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
                     String url = "jdbc:oracle:thin:@localhost:1521:orcl";
                     String user = "scott";
                     String password = "tiger";
                     conn = DriverManager.getConnection(url, user, password);
              } catch (InstantiationException e) {
                     // TODO自动生成 catch ?/SPAN>
                     e.printStackTrace();
              } catch (IllegalAccessException e) {
                     // TODO自动生成 catch ?/SPAN>
                     e.printStackTrace();
              } catch (ClassNotFoundException e) {
                     // TODO自动生成 catch ?/SPAN>
                     e.printStackTrace();
              } catch (SQLException e) {
                     // TODO自动生成 catch ?/SPAN>
                     e.printStackTrace();
              }
              return conn;
       }
}
 
注意Q利用getConnection()Ҏ得到的ConnectionQ程序员很习惯地调用conn.close()Ҏ关闭了数据库q接Q那么上q的数据库连接机制便形同虚设?SPAN style="BACKGROUND-COLOR: #ffffff">在调用conn.close()ҎҎ时如何调用releaseConnection()ҎQ这是关键。这里,我们使用Proxy模式和java反射机制?/SPAN>
 
public synchronized Connection getConnection() {
              Connection conn = null;
              if (pools == null) {
                     pools = new Vector();
              }
 
              if (pools.isEmpty()) {
                     conn = createConnection();
              } else {
                     int last_idx = pools.size() - 1;
                     conn = (Connection) pools.get(last_idx);
                     pools.remove(last_idx);
              }
       
        ConnectionHandler handler=new ConnectionHandler(this);
              return handler.bind(con);
       }
 
public class ConnectionHandler implements InvocationHandler {
     private Connection conn;
     private ConnectionPool pool;
    
     public ConnectionHandler(ConnectionPool pool){
            this.pool=pool;
     }
    
     /**
      * 动态代理绑定到指定Connection
      * @param conn
      * @return
      */
     public Connection bind(Connection conn){
            this.conn=conn;
Connection proxyConn=(Connection)Proxy.newProxyInstance(
conn.getClass().getClassLoader(), conn.getClass().getInterfaces(),this);
          return proxyConn;
     }
    
       /* Q非 JavadocQ?/SPAN>
        * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
        */
       public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
              // TODO自动生成Ҏ存根
              Object obj=null;
              if("close".equals(method.getName())){
                     this.pool.releaseConnection(this.conn);
              }
              else{
                     obj=method.invoke(this.conn, args);
              }
             
              return obj;
       }
}
 
      在实际项目中Qƈ不需要你来从头开始来设计数据库连接池机制Q现在成熟的开源项目,如C3P0,dbcp,Proxool{提供了良好的实现。一般推荐用Apache dbcpQ基本用实例:
DataSource ds = null;
   try{
     Context initCtx = new InitialContext();
     Context envCtx = (Context) initCtx.lookup("java:comp/env");
     ds = (DataSource)envCtx.lookup("jdbc/myoracle");
        if(ds!=null){
                out.println("Connection is OK!");
                Connection cn=ds.getConnection();
                if(cn!=null){
                        out.println("cn is Ok!");
                Statement stmt = cn.createStatement();
                 ResultSet rst = stmt.executeQuery("select * from BOOK");
                out.println("<p>rst is Ok!" + rst.next());
                while(rst.next()){
                        out.println("<P>BOOK_CODE:" + rst.getString(1));
                  }
                        cn.close();
                }else{
                        out.println("rst Fail!");
                }
        }
        else
                out.println("Fail!");
           }catch(Exception ne){ out.println(ne);
         }

3.2 Statement Pool
普通预~译代码Q?/FONT>
String strSQL=”select name from items where id=??
PreparedStatement ps=conn.prepareStatement(strSQL);
ps.setString(1, ??;
ResultSet rs=ps.executeQuery();
 
但是PreparedStatement 是与特定的Connection兌的,一旦Connection关闭Q则相关的PreparedStatement 也会关闭?/FONT>
Z创徏PreparedStatement ~冲池,可以在invokeҎ中通过sql语句判断池中q有没有可用实例?/FONT>
 
4. 持久层设计与O/R mapping 技?/FONT>
1Q?nbsp;HernateQ适合Ҏ产品的开发,q行闭?SPAN style="BACKGROUND-COLOR: #ffffff">的设?
Hibernate 2003q被Jboss接管Q?SPAN style="FONT-SIZE: 10pt">通过?/SPAN>java pojo对象映射到数据库?/SPAN>table中,采用?/SPAN>xml/javareflection技术等?/SPAN>3.0提供了对存储q程和手?/SPAN>sql的支持,本n提供?/SPAN>hql语言?/SPAN>
开发所需要的文gQ?/FONT>
hibernate配置文gQ?/SPAN> hibernate.cfg.xml ?/SPAN> hibernate.properties
hibernate 映射文gQ?/SPAN> a.hbm.xml
pojocL文gQ?/SPAN> a.java  
 
导出表与表之间的关系Q?/FONT>
a. ?/SPAN>java对象?/SPAN>hbm文gQ?/SPAN>xdoclet
b. ?/SPAN>hbm文g?/SPAN>java对象Q?/SPAN>hibernate extension
c. 从数据库?/SPAN>hbm文gQ?/SPAN>middlegen
d. ?/SPAN>hbm文g到数据库Q?/SPAN>SchemaExport
 
2Q?SPAN style="BACKGROUND-COLOR: #ffffff">Iatis Q适合寚w留系l的攚w和Ҏ有数据库的复用,有很强的灉|?3Q?Apache OJBQ优势在于对标准的全面支?4QEJBQ适合集群服务器,其性能也不象某些h所诟病的那么差?5Q?JDO (java data object)
讄一个Properties对象Q从而获取一个JDO的PersistenceManagerFactoryQ相当于JDBCq接池中的DataSourceQ,q而获得一个PersistenceManager对象Q相当于JDBC中的Connection对象Q,之后Q你可以用这个PersistenceManager对象来增加、更新、删除、查询对象?/FONT>
JDOQL是JDO的查询语aQ它有点象SQLQ但却是依照Java的语法的?/FONT>
 
5. Z开源框架的Struts+Spring+Hibernate实现Ҏ
CZQ这是一?/SPAN>3层架构的web E序Q通过一?/SPAN>Action 来调用业务代理,再通过它来回调 DAOcR下面的程图表CZMyUsers是如何工作的。数字表明了程的先后顺序,?/SPAN>web?/SPAN>(UserAction)C间层(UserManager)Q再到数据层(UserDAO)Q然后返回?/SPAN>
Spring?/SPAN>AOP, UserManager?/SPAN>UserDAO都是接口.
1)       web?/SPAN>(UserAction) Q调用中间层的接口方法,?/SPAN>UserManager作ؓ属性注入?/SPAN>
             采用行的Struts框架Q虽然有很多Z屑一,但是q项技术在业界用的比较普遍Q能满基本的功能,可以减少培训学习成本?/FONT>
2)       中间?/SPAN>(UserManager)Q将UserDAO作ؓ属性注入,其实C要是调用数据层接口的一些方法;它处于事务控制中?/SPAN>
            采用Spring框架实现QIOC与AOP是它的代名词Q功能齐全,非常的一个架构?/FONT>
3)       数据?/SPAN>(UserDAO)Q实现类l承HibernateDaoSupportc,在该cM可以调用getHibernateTemplate()的一些方法执行具体的数据操作?/SPAN>
            采用Hibernate做O/R mappingQ从U种q象可以看出QHibernate是EJB3.0的beta版?/FONT>


]]>
大道至简-Java?3U模式一点就?/title><link>http://www.aygfsteel.com/jorwen/articles/29428.html</link><dc:creator>方佳?/dc:creator><author>方佳?/author><pubDate>Wed, 01 Feb 2006 04:42:00 GMT</pubDate><guid>http://www.aygfsteel.com/jorwen/articles/29428.html</guid><wfw:comment>http://www.aygfsteel.com/jorwen/comments/29428.html</wfw:comment><comments>http://www.aygfsteel.com/jorwen/articles/29428.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jorwen/comments/commentRss/29428.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jorwen/services/trackbacks/29428.html</trackback:ping><description><![CDATA[FACTORY—h才市场:以往是要哪个人才Q就扑֓个h才,效率低,现在有了人才市场Q我们只需 <BR>直接Mh才市场挑一个好了; <BR><BR>BUILDER—生产流水线Q以前是手工业作坊式的h工单个单个的生零g然后一步一步组装做Q好 <BR>比有了工业革命,现在都由生񔋹水U代替了。如要造丰田汽车,先制定汽车的构造如pR胎、方 <BR>向盘、发动机l成。再以此构造标准生产丰田汽车的车胎、方向盘、发动机。然后进行组装。最?<BR>得到丰田汽RQ?<BR><BR>PROTOTYPE—印h的发明:以前只能临脓才能保持和别人的字迹基本相同Q直从印h术发明, <BR>从而保证了复制得和原物一模一P <BR><BR>SINGLETON—唯一Q以前是商标满天飞,相同的商标难免造成侉|Q直从有商标保护法后Q就保证 <BR>了不会再产生W家企业使用相同的商标; <BR>l构型模?<BR><BR>ADAPTER—集众h之私Q成一׃公:武当zּ三丰会太极拳Q少林派智空大师会金刚般若掌Q如 <BR>果他们两个都成ؓ我的师傅Q我既会太极拳Q又会金刚般若掌了; <BR><BR>DECORATOR—青Z蓝而胜于蓝Q武当派张三C太极拻I是我师傅Q他教会了我太极拻I但我?<BR>p会点蒙古式摔交,张三丰却不会。于是我成了DECORATOR模式的实玎ͼ <BR><BR>BRIDGE—白马非马:马之颜色有黑白,马之性别有公母。我们说”这是马”太抽象Q说”这是黑?<BR>的公马”又太死板,只有颜色与性别和马动态组合,”这是(黑色的或白色的)Q公或母Q马?<BR>才显得灵z而飘逸,如此bridge模式_N得矣?<BR><BR>COMPOSITE—大家族Q子又生孙,孙又生子Q子子孙孙,无穷也Q将众多Uh的h口组l成一?<BR>按辈分排列的大家族即是此模式的实玎ͼ <BR><BR>FACADE—求同存异:高中毕业需d中和高中Q博士也需d中和高中Q因此国家将初中和高中普 <BR>及成九年制义务教Ԍ <BR><BR>FLYWEIGHT—一x逸:认识三千汉字Q可以应付日常读书与写字Q可见头脑中存在q个汉字库的 <BR>重要Q?<BR><BR>PROXY—垂帘听政:犹如清朝Lq间的四大府臣,很多权利不在皇帝手里Q必通过辅佐大臣?<BR>办; <BR><BR><BR>行ؓ模式 <BR><BR>CHAIN OF RESPONSIBLEITY—租房:以前Z找房到处打听Q效率低且找不到好的房源。现在有?<BR>房屋中介Q于是向房屋中介提出U房hQ中介提供一个合适的房源Q满意则不再hQ不满意 <BR>l箋看房Q直到满意ؓ止; <BR><BR>COMMAND—借刀杀人:以前是想杀谁就杀Q但一D|间后领悟刎ͼ长此以往必将l仇太多Q于是假 <BR>手他人,挑拨他h之间的关pM而达到自q目的Q?<BR><BR>INTERPRETER—文a文注释:一D|a文,它译成白话文Q?<BR><BR>ITERATOR—赶杀l:一个一个的搜烦Q绝不放掉一个; <BR><BR>MEDIATOR—三角债:本来千头万A的债务关系Q忽出来一中介Q包揽其一切,于是三角关系变成?<BR>独立的三ҎW四方中介的关系Q?<BR><BR>MEMENTO—有同享:我有多少Q你有多少Q?<BR><BR>OBSERVER—看守者:一旦被看守者有什么异常情况,定会及时做出反应Q?<BR><BR>STATE—进由:如一扇门Q能q能出,如果有很多h随时q进出出必定昑־杂ؕ而安全,如今 <BR>设一保安限制其进出,如此各hq出才显得规范; <BR><BR>STRATEGY—久病成良医Q如人生病可以有各种症状Q但l过长期摸烦Q就可以ȝ出感冒、肺病?<BR>肝炎{几U; <BR><BR><BR>TEMPLATE METHOD——理Z一定要实践Q教l的学生会游泛_行了Q至于教l会不会则无关紧要; <BR><BR>VISITOR—依法治|:因张三杀被处死,李四L要被|款。由此势必制定处|制度,故制?<BR>法律写明杀人、放火、偷H等|要受什么处|,l通过后须变动要小。今后有人犯|不是谁,?<BR>共条例处|即是,q就是访问者模式诞生的全过E;<img src ="http://www.aygfsteel.com/jorwen/aggbug/29428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jorwen/" target="_blank">方佳?/a> 2006-02-01 12:42 <a href="http://www.aygfsteel.com/jorwen/articles/29428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">μԴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͷ</a>| <a href="http://" target="_blank">ַ</a>| <a href="http://" target="_blank">Ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">뵺</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͳ</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank">е</a>| <a href="http://" target="_blank">ׯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̫</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ǧɽ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>