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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章