其实在当今Java开发中,无论是Java EE ,Java SE 亦或是Java Web 的底层架构也无非那么几种,比较有代表性的MVC架构和经典的三层架构。而今天,因为时间有限,所以我只想对MVC进行一个小结。
谈到MVC架构,当然从今天比较流行的Java MVC架构开始 ,现在最流行的也无非是 SSH(Spring4 + Spring MVC + Hibernate2), SSH(Struts2 + Spring4 + Hibernate2), SSM(Spring4 + Spring MVC + Mybatis), SST(Spring4 + Spring MVC +JDBCTemplate)等等,其他的比如ibatis等等不细讲了,因为没怎么接触过,所以不敢乱说。Java经过这么多年的发展,其实在MVC架构上,程序员之间已经形成了很多的共识,Spring 和Spring MVC在软件中表现出来的卓越已经深入人心,以至于今天每一个Java程序员。不管能力如何,都能说出Spring的1,2,3来。所以几乎每一个Java开发没有不用到Spring的,而Struts2因为近期的一个难以修复的Bug一夜之间被很多公司所抛弃,所以没有什么好细说的,然而在持久层的情况却很不相同,Hibernate,Mybatis,JDBCTemplate,以及JDBC一直相持不下。其实,他们能够共存就说明了,他们一定是各有利弊。比如Mybatis,Mybatis因为其易操作性,易维护性以及稳定性一直以来深受好评,Mybatis+Spring的开发模式也一直甚为流行,特别是一些外包项目中,但是Mybatis架构因为为了降低操作性而牺牲了,很多性能,所以当数据库里的数据爆棚到一定数量的时候,它本身是难以承受的,可以说是先天不足,但是在小型项目的开发中可以说是无可匹敌的。而Hibernate,很多用Hibernate的程序员都抱怨Hibernate在处理存储过程和SQL语句的时候极其吃力,以至于在维护时造成了很多麻烦,其实我想辩解的是其实是因为他们对Hibernate了解的不深。而JDBCTemplate和JDBC类似,前者是基于Spring 而后者是基于Java本身做的简单封装,其实所有持久层的架构都是基于JDBC,所有JDBC的灵活性最强,也最麻烦,因为如果能力不足,会封装出大量垃圾代码,但是如果能力足够却可以根据自己的需求进行独立的封装,当然他的效果自然要比Hibernate,Mybatis等要好很多。
其实,就架构而言。还是有其规则的,比如:A.不能简化代码量的,不用;B.难以上手的,不用;C.不稳定的,不用;D.自己造轮子的(缺乏可持续维护),不用。具体情况,具体而定。
比如淘宝用开源,微软用自己的东西,金山什么都用,Google、IBM和Oracle以及JBOSS则全力支持OpenSource,诸多公司,我也不细评了,从最终产品运行效率看,微软最差,Windows Live系列的产品慢的不成样(最近几个月才略有改观),反倒是用开源的一个比一个快;看看google和淘宝。所以说,没有什么快慢,只是用的人如何。
因为,我接触Java时间不长,所以贴出自己的Hibernate持久层封装,希望大家看看,给点意见
Admin.java
package com.kay.dao.action; public class Admin { private String id; private String account; private String password; public String getId(){ return id; } public void setId(String id){ this.id = id; } public String getAccount(){ return account; } public void setAccount(String account){ this.account = account; } public String getPassword(){ return password; } public void setPassword(String password){ this.password = password; } }
HibernateUtil.java
package com.kay.dao.basic; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; @SuppressWarnings("deprecation") public class HibernateUtil { private static SessionFactory factory; static{ try{ //默认读取的是hibernate.cfg.xml 文件. Configuration cfg = new Configuration().configure(); //建立SessionFactory. factory = cfg.buildSessionFactory(); }catch(Exception e ) { e.printStackTrace(); } } public static Session getSession(){ return factory.openSession(); } public static void closeSession(Session session){ if(session!=null){ if(session.isOpen()){ session.close(); } } } public static SessionFactory getSessionFactory(){ return factory; } }
Basic.java
package com.kay.dao.basic; import java.util.ArrayList; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import com.kay.dao.imp.BasicImp; /** * Title: Basic.java * Description: Dao层 基类 * @author kay */ public class Basic implements BasicImp{ public static BasicImp basic = new Basic(); /** * 查询多条记录 * @param sql SQL语句 * @param param 参数集 * @return <T> 返回数据集 */ @SuppressWarnings("unchecked") public <T> List<T> query(String sql, String[] param) { List<T> list = new ArrayList<T>(); Session session=null; try{ session = HibernateUtil.getSession(); Query query=session.createQuery(sql); if(param != null){ for(int i = 0;i < param.length;i++){ query.setString(i,param[i]); } } list = query.list(); } finally { if(session!=null){ session.close(); } } return list; } /** * 增添数据 * @param obj 对象 * @return 返回是否添加成功 */ public boolean add(Object obj) { Session session = null; Transaction tran = null; boolean result = false; try{ session = HibernateUtil.getSession(); tran = session.beginTransaction(); session.save(obj); tran.commit(); result = true; }catch (Exception e){ if(tran!=null){ tran.rollback(); } }finally{ if(session!=null){ session.close(); } } return result; } /** * 修改数据 * @param 对象 * @return 返回是否修改成功 */ public boolean update(Object object) { Session session = null; Transaction tran = null; boolean result = false; try{ session = HibernateUtil.getSession(); tran = session.beginTransaction(); session.update(object); tran.commit(); result = true; }catch (Exception e){ if(tran!=null){ tran.rollback(); } }finally{ if(session!=null){ session.close(); } } return result; } /** * 删除数据 * @param 对象 * @return 返回是否删除成功 */ public boolean delete(Object obj) { Session session = null; Transaction tran = null; boolean result = false; try{ session = HibernateUtil.getSession(); tran = session.beginTransaction(); session.delete(obj); tran.commit(); result = true; }catch (Exception e){ if(tran!=null){ tran.rollback(); } }finally{ if(session!=null){ session.close(); } } return result; } /** * 查询一条记录 * @param sql SQL语句 * @param param 参数集 * @return 返回查询对象 */ public Object queryOne(String sql, String[] param) { Session session = null; Object object = null; try{ session = HibernateUtil.getSession(); Query query = session.createQuery(sql); if(param != null){ for(int i = 0;i < param.length;i++){ query.setString(0,param[i]); } object = query.uniqueResult(); } }catch (Exception e){ e.printStackTrace(); }finally{ if(session!=null){ session.close(); } } return object; } /** * 查询一条数据根据主键的id号 * @param c 对象的Class * @param id ID * @return 返回查询的对象 */ public Object get(@SuppressWarnings("rawtypes") Class c, int id) { Session session = null; Object object = null; try{ session = HibernateUtil.getSession(); object = session.get(c,id); }catch (Exception e){ e.printStackTrace(); }finally{ if(session!=null){ session.close(); } } return object; } /** * 分页查询 * @param sql SQL语句 * @param param 参数集 * @param page 页号 * @return <T> 返回数据集 */ @SuppressWarnings("unchecked") public <T> List<T> queryByPage(String sql, String[] param, int page, int size) { Session session = null; List<T> list = null; try{ session = HibernateUtil.getSession(); Query query = session.createQuery(sql); if(param!=null){ for(int i=0;i<param.length;i++){ query.setString(i,param[i]); } } query.setFirstResult((page-1)*size); query.setMaxResults(size); list = query.list(); }catch (Exception e){ e.printStackTrace(); }finally{ if(session!=null){ session.close(); } } return list; } /** * 返回数据个数 * @param sql SQL语句 * @param param 参数集 * @return 返回数据个数 */ public int getCount(String sql, String[] param) { Session session = null; int result = 0; try { session = HibernateUtil.getSession(); Query q = session.createQuery(sql); if (param != null) { for (int i = 0; i < param.length; i++) { q.setString(i, param[i]); } } result = Integer.valueOf(q.iterate().next().toString()); } catch (Exception e) { e.printStackTrace(); } finally { if (session != null){ session.close(); } } return result; } }
BasicImp.java
package com.kay.dao.imp; import java.util.List; /** * Title: BasicImp interface * Description: Dao层 基类接口 * @author kay */ public interface BasicImp { public boolean add(Object obj); public boolean update(Object object); public boolean delete(Object obj); public <T> List<T> query(String sql,String[] param); public Object queryOne(String sql,String[] param); public Object get(@SuppressWarnings("rawtypes") Class c,int id); public <T> List<T> queryByPage(String sql,String[] param,int page,int size); public int getCount(String hql, String[] pras); }
Admin.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.kay.dao.action.Admin"> <id name="id"> <generator class="uuid"/> </id> <property name="account"/> <property name="password"/> </class> </hibernate-mapping>
hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.username">root</property> <property name="connection.password"></property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="myeclipse.connection.profile"></property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <mapping resource="com/kay/dao/action/Admin.hbm.xml" /> </session-factory> </hibernate-configuration>
Run.java
package com.kay.run; import java.util.Iterator; import java.util.List; import com.kay.dao.action.Admin; import com.kay.dao.basic.Basic; public class Test { @SuppressWarnings("null") public static void main(String[] args) { try { List<Admin> userList = Basic.basic.query("from Admin", null); Iterator<Admin> iter = userList.iterator(); Admin admin = null; while(iter.hasNext()){ admin = (Admin)iter.next(); System.out.println(admin.getAccount() + "_" + admin.getPassword()); } admin = null; admin.setAccount("1"); admin.setPassword("1"); if (Basic.basic.add(admin)){ int count = Basic.basic.getCount("select count(account) from Admin where account = ? and password = ?", new String[]{"1" ,"1"}); System.out.println(count); } } catch (Exception e) { System.out.println ("Error"); } } }
自己改进的别人方法,希望与大家一起多讨论一下,从而形成自己的风格。