Java Hibernate 架构 Dao层的封装(自用) + Java 自己架构的浅谈(MVC篇)

其实在当今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");
	    }
	}
}

自己改进的别人方法,希望与大家一起多讨论一下,从而形成自己的风格。

你可能感兴趣的:(java)