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
然后封装实现类
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;
}
}