Hibernate實現BaseDao

設計思路

  • BaseDao爲各個實體Dao類的接口,定義了各個增刪改查方法。
  • BaseDaoImpl實現BaseDao,子類可繼承該類,獲取dao層的基本方法。
  • UserDao爲一個具體的實體的dao接口,該接口繼承BaseDao,並可以再繼續寫入新的 方法。
  • UserDaoImpl爲UserDao的實現類,該類繼承BaseDaoImpl,實現UserDao。
  • UserDaoTest爲測試類

類圖如下:
這裏寫圖片描述

實現代碼


    • BaseDao實現代碼:
package dao;

import java.io.Serializable;
import java.util.List;

/**
 * dao層基類,實現增刪改查
 * @author PC-ASUS(zzs)
 *
 * @param <T>
 */
public interface BaseDao<T> {

    //添加一個對象
    void save(T entity);
    //更新一個對象,所有屬性
    void update(T entity);
    //更新一個對象,部分屬性
    void partUpdate(int id, String[] names, Object[] values);
    //刪除一個對象
    void delete(Serializable id);
    //根據id查找一個對象
    T findById(Serializable id);
    //根據HQL返回對象List
    List<T> findByHQL(String hql, Object... params);
    //分頁查詢
    List<T> queryPage(String hql, int pageNo, int pageSize);
}
  • BaseDaoImpl實現代碼:

package dao.impl;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import utils.HibernateSessionFactory;
import dao.BaseDao;

public class BaseDaoImpl<T> implements BaseDao<T>{

    private Class<T> clazz; //T的具體類

    /**
     * 通過構造方法指定DAO的具體實現類
     */
    @SuppressWarnings("unchecked")
    public BaseDaoImpl() {
        ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        clazz = (Class<T>) type.getActualTypeArguments()[0];
        //System.out.println("DAO的真實實現類是:"+this.clazz.getName());
    }

    /**
     * 獲取當前工作的Session
     */
    protected Session getSession(){
        return HibernateSessionFactory.getSession();
    }


    @Override
    public void save(Object entity) {
        Session session = null;
        Transaction tx = null;
        try{
            session = this.getSession();
            tx = session.beginTransaction();
            session.save(entity);
            tx.commit();
        }catch(Exception ex){
            System.out.println("保存對象出現錯誤!");
            ex.printStackTrace();
            if(tx != null){
                tx.rollback();
            }
        }finally{
            if(session != null){
                session.close();
            }
        }
    }

    @Override
    public void update(Object entity) {
        Session session = null;
        Transaction tx = null;
        try{
            session = this.getSession();
            tx = session.beginTransaction();
            session.update(entity);
            tx.commit();
        }catch(Exception ex){
            System.out.println("更新對象出現錯誤!");
            ex.printStackTrace();
            if(tx != null){
                tx.rollback();
            }
        }finally{
            if(session != null){
                session.close();
            }
        }
    }

    @Override
    public void partUpdate(int id, String[] names, Object... values) {
        Session session = null;
        Transaction tx = null;
        try{
            session = this.getSession();
            tx = session.beginTransaction();

            String tab = clazz.getSimpleName();
            String hql = "update "+tab+" t";
            for(int i = 0;i < names.length;i ++){
                hql += " set t."+names[i]+"=?";
            }
            hql += " where t.id="+id;
            Query query = session.createQuery(hql);
            for(int i = 0;i < values.length;i ++){
                query.setParameter(i, values[i]);
            }
            System.out.println("部分更新:"+hql);
            query.executeUpdate();
            tx.commit();
        }catch(Exception ex){
            System.out.println("更新對象部分屬性出現錯誤!");
            ex.printStackTrace();
            if(tx != null){
                tx.rollback();
            }
        }finally{
            if(session != null){
                session.close();
            }
        }
    }

    @Override
    public void delete(Serializable id) {

        T obj = findById(id);

        Session session = null;
        Transaction tx = null;
        try{
            session = this.getSession();
            tx = session.beginTransaction();
            session.delete(obj);
            tx.commit();
        }catch(Exception ex){
            System.out.println("刪除對象出現錯誤!");
            ex.printStackTrace();
            if(tx != null){
                tx.rollback();
            }
        }finally{
            if(session != null){
                session.close();
            }
        }
    }

    @Override
    public T findById(Serializable id) {
        Session session = null;
        Transaction tx = null;
        T obj = null;
        try{
            session = this.getSession();
            tx = session.beginTransaction();

            obj = (T) session.get(clazz, id);

            tx.commit();
        }catch(Exception ex){
            System.out.println("查找對象出現錯誤!");
            ex.printStackTrace();
            if(tx != null){
                tx.rollback();
            }
        }finally{
            if(session != null){
                session.close();
            }
        }
        return obj;
    }

    @Override
    public List<T> findByHQL(String hql, Object... params) {
        List<T> list = null;
        Session session = null;
        Transaction tx = null;
        try{
            session = this.getSession();
            tx = session.beginTransaction();

            Query query = session.createQuery(hql);
            for(int i = 0;params != null && i < params.length; i ++){
                query.setParameter(i, params[i]);
            }
            System.out.println("HQL查詢:"+hql);
            list = query.list();

            tx.commit();
        }catch(Exception ex){
            System.out.println("執行HQL查找對象出現錯誤!");
            ex.printStackTrace();
            if(tx != null){
                tx.rollback();
            }
        }finally{
            if(session != null){
                session.close();
            }
        }
        return list;
    }

    @SuppressWarnings("unchecked")
    public List<T> queryPage(String hql, int pageNo, int pageSize){
        List<T> list = null;
        Session session = null;
        Transaction tx = null;
        try{
            session = this.getSession();
            tx = session.beginTransaction();

            Query query = session.createQuery(hql);
            list = query.setFirstResult((pageNo - 1) * pageSize)
                        .setMaxResults(pageSize)
                        .list();

            tx.commit();
        }catch(Exception ex){
            System.out.println("分頁查詢出現錯誤出現錯誤!");
            ex.printStackTrace();
            if(tx != null){
                tx.rollback();
            }
        }finally{
            if(session != null){
                session.close();
            }
        }
        return list;
    }

}
  • UserDao實現代碼
package dao;

import model.User;

public interface UserDao extends BaseDao<User>{

}
  • UserDaoImpl實現代碼
package dao.impl;

import model.User;
import dao.UserDao;

public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{
}

測試:

package dao.impl;

import java.util.List;

import org.junit.Test;

import model.User;
import dao.UserDao;

public class UserDao_Test {
    //@Test
    public void saveTest(){
        User user = new User();
        user.setName("aaa");
        user.setPassword("123456");
        UserDao userDao = new UserDaoImpl();
        userDao.save(user);
    }

    //@Test
    public void deleteTest(){
        UserDao userDao = new UserDaoImpl();
        userDao.delete(2);
    }

    //@Test
    public void findByIdTest(){
        UserDao userDao = new UserDaoImpl();
        User user = userDao.findById(2);
        System.out.println(user.getName());
    }

    //@Test
    public void updateTest(){
        UserDao userDao = new UserDaoImpl();
        User user = new User();
        user.setId(1);
        user.setName("yyy");
        userDao.update(user);
    }

    //@Test
    public void partUpdateTest(){
        int id = 1;
        String[] names = {"password"};
        Object[] values = new Object[names.length];
        values[0] = "4645654";
        UserDao userDao = new UserDaoImpl();
        userDao.partUpdate(id, names, values);
    }

    //@Test
    public void findByHQLTest(){
        //String hql = "update User t set t.password=? where t.id=1";
        String hql = "from User u where u.id = ?";
        Object[] params = {1};
        UserDao userDao = new UserDaoImpl();
        User user = userDao.findByHQL(hql, params).get(0);
        System.out.println(user.toString());
    }


    @Test
    public void queryPageTest(){
        //插入數據
        /*for(int i = 1;i <= 40;i ++){
            this.saveTest();
        }*/
        String hql = "from User u";
        UserDao userDao = new UserDaoImpl();
        List<User> users = userDao.queryPage(hql, 2, 3);
        for(User user : users){
            System.out.println(user);
        }
    }
}

重點描述

  • 利用反射機制,獲取具體實現類
ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        clazz = (Class<T>) type.getActualTypeArguments()[0];
        //System.out.println("DAO的真實實現類是:"+this.clazz.getName());
  • 對應Hibernate中Session提供的update方法,或對實體的所有屬性進行更新,可能導致某些值變爲null。當我們只想更新對象部分屬性時,可以通過執行hql語句解決這個問題。
發佈了95 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章