spring-boot集成jpa封装个通用的Dao

github项目地址:

https://github.com/yinbucheng/core-init

只需改成你数据库的账号和密码在domain写入你的实体对象然后执行

CoreCreateMain,eclipse需要手动刷新下包



先定义分页用的PageBean和反射用的ReflectUtils工具类

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class ReflectUtils {

    //缓存类的字段
    private static Map> cache = new HashMap<>();

    public static Map createMapForNotNull(Object bean){
        List fields = listAllFields(bean.getClass());
        try {
            Map map = new HashMap<>();
            if (fields != null) {
                for (Field field : fields) {
                     Object value = field.get(bean);
                     if(value!=null){
                         String name = field.getName();
                         map.put(name,value);
                     }
                }
            }
            return map;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }


    public static void reflectMapToBean(Map map,Object bean){
        Class clazz = bean.getClass();
        try {
            List fields = listAllFields(clazz);
            if (fields != null) {
                for (Field field : fields) {
                    String name = field.getName();
                    Object value = map.get(name);
                    Class type = field.getType();
                    if (value.getClass().equals(type)) {
                        field.set(bean, value);
                    }
                }
            }
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }

    /**
     * 浅层次将对象转变为map
     * @param bean
     * @return
     */
    public static Map simpleReflectBeanToMap(Object bean)throws Exception{
        List fields = listAllFields(bean.getClass());
        if (fields == null || fields.size() == 0)
            return null;
        Map map = new HashMap<>();
        for (Field field : fields) {
            String name = field.getName();
            Object value = field.get(bean);
            if (isEmpty(value))
                continue;
            map.put(name, value);
        }
        return map;
    }

    /**
     * 深层次将对象转变为Map递归下去
     *
     * @param bean
     * @return
     * @throws Exception
     */
    public static Map reflectBeanToMap(Object bean) throws Exception {
        List fields = listAllFields(bean.getClass());
        if (fields == null || fields.size() == 0)
            return null;
        Map map = new HashMap<>();
        for (Field field : fields) {
            String name = field.getName();
            Object value = field.get(bean);
            if (isEmpty(value))
                continue;
            if (isSimpleType(field.getType())) {// 如果为基本类型
                map.put(name, value);
            } else {
                Map tempMap = reflectBeanToMap(value);
                map.put(name, tempMap);
            }
        }
        return map;
    }

    /**
     * 是否为null1
     *
     * @param value
     * @return
     */
    public static boolean isEmpty(Object value) {
        if (value == null)
            return true;
        return false;
    }

    /**
     * 是否为基本类型
     *
     * @param clazz
     * @return
     */
    public static boolean isSimpleType(Class clazz) {
        if (clazz.equals(int.class) || clazz.equals(Integer.class))
            return true;
        if (clazz.equals(String.class))
            return true;
        if (clazz.equals(long.class) || clazz.equals(Long.class))
            return true;
        if (clazz.equals(float.class) || clazz.equals(Float.class))
            return true;
        if (clazz.equals(double.class) || clazz.equals(Double.class))
            return true;
        if (clazz.equals(short.class) || clazz.equals(Short.class))
            return true;
        if (clazz.equals(char.class) || clazz.equals(Character.class))
            return true;
        if (clazz.equals(boolean.class) || clazz.equals(Boolean.class))
            return true;
        if (clazz.equals(byte.class) || clazz.equals(Byte.class))
            return true;
        return false;

    }

    /**
     * 列出该类及其子类下面所以得非静态字段
     *
     * @param clazz
     * @return
     */
    public static List listAllFields(Class clazz) {
        List result = cache.get(clazz.getName());
        if(result!=null)
            return result;
        Field[] fields = clazz.getDeclaredFields();
        if (fields == null || fields.length == 0)
            return null;
        result = new LinkedList<>();
        for (Field field : fields) {
            if (Modifier.isStatic(field.getModifiers()))
                continue;
            field.setAccessible(true);
            result.add(field);
        }
        if (clazz.getSuperclass() != null) {
            List temps = listAllFields(clazz.getSuperclass());
            if(temps!=null)
                result.addAll(temps);
        }
        cache.put(clazz.getName(), result);
        return result;
    }

    /**
     * 将简单的map映射成bean对象
     * @param data
     * @param clazz
     * @return
     * @throws Exception
     */
    public static  T simpleChangeMapToBean(Map data,Class clazz)throws Exception{
        List fields = listAllFields(clazz);
        T bean = (T) clazz.newInstance();
        if(fields!=null&&fields.size()>0){
            for(Field field:fields){
                String name = field.getName();
                Object value = data.get(name);
                if(isEmpty(value))
                    continue;
                field.set(bean, value);
            }
        }
        return bean;
    }

    /**
     * 深层次将map中的数据映射到bean中递归下去
     * @param data
     * @param clazz
     * @return
     * @throws Exception
     */
    public static  T changeMapToBean(Map data,Class clazz)throws Exception{
        List fields = listAllFields(clazz);
        T bean = (T) clazz.newInstance();
        if(fields!=null&&fields.size()>0){
            for(Field field:fields){
                String name = field.getName();
                Object value = data.get(name);
                if(isEmpty(value))
                    continue;
                if(isSimpleType(field.getType())){
                    field.set(bean, value);
                }else{
                    Map tempMap = (Map) value;
                    Object resultValue = changeMapToBean(tempMap,field.getType());
                    field.set(bean, resultValue);
                }
            }
        }
        return bean;
    }
}


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

/**
 * 分页对象
 */
public class PageBean implements Serializable {
    //总共的数据条数
    private Long totalCount;
    //第几页
    private Integer pageNum;
    //每页显示多少
    private Integer pageSize;
    //查询出来的数据
    private List datas;

    public Long getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(Long totalCount) {
        this.totalCount = totalCount;
    }

    public Integer getPageNum() {
        return pageNum;
    }

    public void setPageNum(Integer pageNum) {
        this.pageNum = pageNum;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public List getDatas() {
        return datas;
    }

    public void setDatas(List datas) {
        this.datas = datas;
    }
}


首先我们要定义一个BaseDao

import java.util.List;
import java.util.Map;

/**
 *create by yinchong
 * @param  实体类
 * @param  主键
 */
public interface BaseDao {

    void save(T bean);

    void update(T bean);

    T findOne(L id);

    /**
     * 根据id删除制定数据
     * @param id
     * @return
     */
    int delete(L id);

    /**
     * 查询所有数据
     * @return
     */
    List findAll();

    /**
     * 批量保存
     * @param beans
     */
    void batchSave(List beans);

    /**
     * 批量更新所有字段
     * @param beans
     */
    void batchUpdate(List beans);

    /**
     * 批量删除
     * @param ids
     * @return
     */
    int batchDelete(List ids);

    /**
     * 批量更新非空字段
     * @param beans
     */
    void batchUpdateNotNull(List beans);

    /**
     * 这个用于执行删除和更新的sql语句
     *
     * @param sql
     * @param params
     */
    int executeSql(String sql, Object... params);

    /**
     * 这个用于执行删除和更新的hql语句
     * @param hql
     * @param params
     */
    int executeHql(String hql, Object... params);

    /**
     * 根据原始sql语句执行sql
     *
     * @param sql    原始sql语句
     * @param params 要传递的参数
     * @return map对象
     */
    List> findSql(String sql, Object... params);

    /**
     * @param sql    原始sql语句
     * @param clazz  要反射的Class对象
     * @param params 要传递的参数
     * @param 
     * @return
     */
     List findSql(String sql, Class clazz, Object... params);


    /**
     * 分页显示数据
     *
     * @param sql
     * @param pageNum  第几页
     * @param pageSize 每页显示多少个
     * @param params   需要传递的参数
     * @return
     */
    PageBean> pageSql(String sql, Integer pageNum, Integer pageSize, Object... params);

    /**
     * 执行hql查询语句
     * @param hql
     * @param params
     * @return
     */
    List findHql(String hql,Object ...params);

    /**
     * hql的分页操作
     * @param hql
     * @param pageNum
     * @param pageSize
     * @param params
     * @return
     */
    PageBean pageHql(String hql, Integer pageNum, Integer pageSize, Object ...params);

    /**
     *hql执行统计总数
     * @param hql
     * @param params
     * @return
     */
    Long countHql(String hql,Object ...params);

    /**
     * 执行统计总数
     * @param sql
     * @param params
     * @return
     */
    Long countSql(String sql,Object ...params);

    /**
     * 更新非空字段
     * @param bean
     * @return
     */
    int updateNotNull(T bean);

    /**
     * 根据字段删除数据
     * @param field
     * @param value
     * @return
     */
    int deleteEqualField(String field,Object value);

    /**
     * like匹配删除
     * @param field
     * @param value
     * @return
     */
    int deleteLikeField(String field,String value);

    /**
     * 根据对象的某个字段相同查找
     * @param field
     * @param value
     * @return
     */
    List findEqualField(String field,Object value);

    /**
     * 根据对象某个字段Like查找
     * @param field
     * @param value
     * @return
     */
    List findLikeField(String field,String value);
}

然后封装实现类

import com.example.demo.utils.ReflectUtils;
import org.hibernate.transform.Transformers;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.lang.reflect.ParameterizedType;
import java.math.BigInteger;
import java.util.*;

/***
 **create by yinchong
 */
public class BaseDaoImpl implements BaseDao {

    private Class clazz;

    public BaseDaoImpl() {
        ParameterizedType t = (ParameterizedType) this.getClass().getGenericSuperclass();
        //获取泛型参数的实际类型
        this.clazz = (Class) t.getActualTypeArguments()[0];
    }

    @PersistenceContext()
    protected EntityManager entityManager;


    @Transactional(propagation = Propagation.REQUIRED)
    public void save(T bean) {
        entityManager.persist(bean);
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void update(T bean) {
        entityManager.merge(bean);
    }

    public T findOne(L id) {
        return entityManager.find(clazz, id);
    }


    /**
     * @param id
     * @return 小于0 表示删除失败 大与0表示删除成功
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public int delete(L id) {
        Query query = entityManager.createQuery("delete from " + clazz.getSimpleName() + " p where p.id = ?1");
        query.setParameter(1, id);
        return query.executeUpdate();
    }


    /**
     * 显示所有数据
     *
     * @return
     */
    public List findAll() {
        String hql = "select t from " + clazz.getSimpleName() + " t";
        Query query = entityManager.createQuery(hql);
        List beans = query.getResultList();
        return beans;
    }


    /**
     * 批量插入
     *
     * @param beans
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void batchSave(List beans) {
        if (beans != null) {
            for (T bean : beans)
                entityManager.persist(bean);
            entityManager.flush();
            entityManager.clear();
        }

    }


    /**
     * 批量更新
     *
     * @param beans
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void batchUpdate(List beans) {
        if (beans != null) {
            for (T bean : beans)
                entityManager.merge(bean);
            entityManager.flush();
            entityManager.clear();
        }
    }


    @Transactional(propagation = Propagation.REQUIRED)
    public int batchDelete(List ids) {
        StringBuffer hql = new StringBuffer("delete from " + clazz.getSimpleName() + " where id  in(:ids)");
        Query query = entityManager.createQuery(hql.toString());
        query.setParameter("ids", ids);
        return query.executeUpdate();
    }


    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void batchUpdateNotNull(List beans) {
        if (beans == null || beans.size() == 0)
            return;
        List> datas = new LinkedList<>();
        for (T bean : beans) {
            Map data = ReflectUtils.createMapForNotNull(bean);
            datas.add(data);
        }

        for (Map map : datas) {
            //拼接Hql语句
            StringBuffer hql = new StringBuffer("update " + clazz.getSimpleName() + "");
            Set keys = map.keySet();
            boolean fist = true;
            for (String key : keys) {
                if (key.equals("id"))
                    continue;
                if (fist) {
                    hql.append(" set ").append(key + "=:" + key);
                    fist = false;
                } else {
                    hql.append("," + key + "=:" + key);
                }
            }
            hql.append(" where id=:id");
            Query query = entityManager.createQuery(hql.toString());

            //设置参数
            for (String key : keys) {
                Object value = map.get(key);
                query.setParameter(key, value);
            }
            query.executeUpdate();
        }
        entityManager.flush();
        entityManager.clear();

    }

    @Override
    public int executeSql(String sql, Object... params) {
        Map map = getSql(sql);
        int count = (int) map.get("count");
        Query query = entityManager.createNativeQuery(sql);
        setQueryParameters(count,query,params);
        return query.executeUpdate();
    }

    @Override
    public int executeHql(String hql, Object... params) {
        Map map = getHSql(hql);
        String jpaHql = (String) map.get("sql");
        int count = (int) map.get("count");
        Query query = entityManager.createQuery(jpaHql);
        setQueryParameters(count,query,params);
        return query.executeUpdate();
    }

    @Override
    public List> findSql(String sql, Object... params) {
        Map map = getHSql(sql);
        String jpaSql = (String) map.get("sql");
        Integer count = (Integer) map.get("count");
        Query query = entityManager.createNativeQuery(jpaSql);
        setQueryParameters(count,query,params);
        return query.unwrap(org.hibernate.SQLQuery.class)
                .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
    }

    @Override
    public  List findSql(String sql, Class clazz, Object... params) {
        Map map = getSql(sql);
        String jpaSql = (String) map.get("sql");
        Integer count = (Integer) map.get("count");
        Query query = entityManager.createNativeQuery(jpaSql);
        setQueryParameters(count,query,params);
        query.unwrap(clazz);
        return query.getResultList();
    }

    private Integer locationFrom(String sql){
        if(sql==null||sql.equals(""))
            return -1;
        int count = countSelect(sql);
        if(count==0)
            return -1;
        if(count==1){
            return sql.indexOf("from");
        }else{
            int index = sql.indexOf("from");
            String temp = sql.substring(0,index);
            if(!temp.contains("select"))
                return index;

        }
        return null;

    }

    private int countSelect(String sql){
        if(sql.indexOf("select")<0)
            return 0;
        int index = sql.indexOf("select");
        return 1+countSelect(sql.substring(index+6));
    }

    @Override
    public PageBean> pageSql(String sql, Integer pageNum, Integer pageSize, Object... params) {
        Map map = getSql(sql);
        String jpaSql = (String) map.get("sql");
        Integer count = (Integer) map.get("count");
        if (params != null) {
            if (count != params.length)
                throw new RuntimeException("参数数量和?不一致");
        }
        PageBean> pageBean = new PageBean<>();
        pageBean.setPageNum(pageNum);
        pageBean.setPageSize(pageSize);

        int index = sql.indexOf("from");
        String tempSql = "select count(1) "+sql.substring(index);
        Long totalCount = countSql(tempSql,params);
        if(totalCount==null||totalCount==0){
            pageBean.setTotalCount(0L);
            return pageBean;
        }
        pageBean.setTotalCount(totalCount);

        if(pageNum!=null&&pageSize!=null) {
            if (pageNum <= 0) {
                pageNum = 1;
            }
            jpaSql += " limit " + (pageNum - 1) * pageSize + "," + pageSize;
        }

        Query query = entityManager.createNativeQuery(jpaSql);
        if (params != null && params.length > 0) {
            int length = params.length;
            for (int i = 0; i < length; i++) {
                query.setParameter(i + 1, params[i]);
            }
        }
        List> result =   query.unwrap(org.hibernate.SQLQuery.class)
                .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();
        pageBean.setDatas(result);
        return pageBean;
    }

    private Map getSql(String sql) {
        sql += " ";
        int count = 0;
        Map map = new HashMap<>();
        map.put("sql", sql);
        map.put("count", count);
        String[] datas = sql.split("\\?");
        int length = datas.length;
        if (length == 1)
            return map;
        for (int i = 0; i < length - 1; i++) {
            count++;
        }
        map.put("count", count);
        map.put("sql", sql);
        return map;
    }

    private Map getHSql(String sql) {
        sql += " ";
        int count = 0;
        Map map = new HashMap<>();
        map.put("sql", sql);
        map.put("count", count);
        String[] datas = sql.split("\\?");
        int length = datas.length;
        if (length == 1)
            return map;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length - 1; i++) {
            count++;
            sb.append(datas[i]).append("?" + count).append(" ");
        }
        sb.append(datas[length-1]);
        map.put("count", count);
        map.put("sql", sb.toString());
        return map;
    }

    @Override
    public List findHql(String hql, Object... params) {
        Map map = getHSql(hql);
        String jpaSql = (String) map.get("sql");
        Integer count = (Integer) map.get("count");
        //获取数据
        Query query = entityManager.createQuery(jpaSql);
        setQueryParameters(count,query,params);
        List records =  query.getResultList();
        return records;
    }

    @Override
    public PageBean pageHql(String hql, Integer pageNum, Integer pageSize, Object... params) {

        Map map = getHSql(hql);
        String jpaSql = (String) map.get("sql");
        Integer count = (Integer) map.get("count");
        if (params != null) {
            if (params.length != count) {
                throw new RuntimeException("sql 语句和参数数量不一致");
            }
        }
        //执行count操作
        PageBean pageBean = new PageBean<>();
        pageBean.setPageNum(pageNum);
        pageBean.setPageSize(pageSize);
        int index = hql.indexOf("from");
        String tempHql = "select count(1) "+hql.substring(index);
        Long totalCount = countHql(tempHql,params);
        if(totalCount==null||totalCount==0){
            pageBean.setTotalCount(0L);
            return pageBean;
        }
        pageBean.setTotalCount(totalCount);

        //获取数据
        Query query = entityManager.createQuery(jpaSql);
        if (params != null && params.length > 0) {
            int length = params.length;
            for (int i = 0; i < length; i++) {
                query.setParameter(i + 1, params[i]);
            }
        }
        if(pageNum!=null&&pageSize!=null){
            if(pageNum==0)
                pageNum=1;
            query.setFirstResult((pageNum-1)*pageSize);
            query.setMaxResults(pageSize);
        }
        List records =  query.getResultList();
        pageBean.setDatas(records);
        return pageBean;
    }

    @Override
    public Long countHql(String hql, Object... params) {
        Map map = getHSql(hql);
        String jpaSql = (String) map.get("sql");
        Integer count = (Integer) map.get("count");
        Query query = entityManager.createQuery(jpaSql);
        setQueryParameters(count, query, params);
        return ((Long)query.getSingleResult());
    }

    /**
     * 为Query设置参数
     * @param count
     * @param query
     * @param params
     */
    private void setQueryParameters(Integer count, Query query, Object[] params) {
        if (params != null) {
            if (params.length != count) {
                throw new RuntimeException("sql 语句和参数数量不一致");
            }
            if (params.length > 0) {
                int length = params.length;
                for (int i = 0; i < length; i++) {
                    query.setParameter(i + 1, params[i]);
                }
            }
        }
    }

    @Override
    public Long countSql(String sql, Object... params) {
        Map map = getSql(sql);
        String jpaSql = (String) map.get("sql");
        Integer count = (Integer) map.get("count");
        Query query =  entityManager.createNativeQuery(jpaSql);
        setQueryParameters(count,query,params);
        return ((BigInteger) query.getSingleResult()).longValue();
    }

    @Override
    public int updateNotNull(T bean) {
        try {
            batchUpdateNotNull(Arrays.asList(bean));
        }catch (Exception e){
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:error:"+e.getMessage()+""+e.getCause());
            return -1;
        }
        return 1;
    }

    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public int deleteEqualField(String field, Object value) {
        Query query = entityManager.createQuery("delete from " + clazz.getSimpleName() + " p where p."+field+" = ?1");
        query.setParameter(1, value);
        return query.executeUpdate();
    }


    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public int deleteLikeField(String field,String value){
        Query query = entityManager.createQuery("delete from " + clazz.getSimpleName() + " p where p."+field+" like ?1");
        query.setParameter(1, value);
        return query.executeUpdate();
    }

    @Override
    public List findEqualField(String field, Object value) {
        Query query = entityManager.createQuery("select p from "+clazz.getSimpleName()+" p where p."+field+" = ?1");
        query.setParameter(1,value);
        List records =  query.getResultList();
        return records;
    }

    @Override
    public List findLikeField(String field, String value) {
        Query query = entityManager.createQuery("select p from "+clazz.getSimpleName()+" p where p."+field+" like ?1");
        query.setParameter(1,value);
        List records =  query.getResultList();
        return records;
    }

}


你可能感兴趣的:(制作小框架)