项目进展以及Dao部分代码的完成过程

简介: 12月20日,之前确定SpringMVC+Spring+Hibernate的方案,前面两天成功利用powerDesigner和phpmyadmin和eclipse下的hibernate tools成功的由uml生成了PO代码,修改了maven依赖中的版本使得tomcat启动时不会认为生成的PO代码有问题。

12月20日,之前确定SpringMVC+Spring+Hibernate的方案,前面两天成功利用powerDesigner和phpmyadmin和eclipse下的hibernate tools成功的由uml生成了PO代码,修改了maven依赖中的版本使得tomcat启动时不会认为生成的PO代码有问题。
接下来的工作包括:
1---调通hibernate dao的代码,换句话说利用spring-orm的技术,能够成功通过hibernate去操作之前生成的PO文件,也就是数据库的基本操作;完成Spring和Hibernate的联动。
2---在Dao的基础上写Service和controller,通过最初jsp的方式能够将数据展示在jsp页面上;
3---配置SpringMVC中有关于自定义返回值,让我们的web项目可以采用json来传递数据,从后台到前端;
4---将json传递的数据通过ExtJS显示出来。

2017年12月27日,第一步已经完成。
12月28日第二步完成(事务管理的知识差太多啊)

上述工作就是我们马上要开始的。
本博文,用来描述其中第一部分,Dao代码的形成过程。
之前分析三个其他项目的过程中确认过,Dao代码由于业务无关性,就两个文件,一个interface一个实现它的class。Dao必须实现泛型,主要调用Spring-orm中的方法。
Dao部分两个文件直接copy蒋锋的,做一些必要修改,过程如下:
_
也就是说MyHiberDao.java写完以后,后面所有业务相关的service代码都是基于这一个Dao文件就可以了。
_
创建一个新的class
_
_
_
eclipse中我们写的java文件,各种方法、属性前面的图标,代表的常用意义可以参考这个连接 这里用到的如下图:
http://blog.csdn.net/qq_27292113/article/details/54601641
_
_
下面就开始对照interface中必须实现的方法,开始一个一个的实现,毕竟是借鉴别人的代码,一方面还是要看懂,另一方面真的不想花太多时间,我们首先把一些纯java(也就是spring或者hibernate无关的)代码,列举一下,这部分肯定会用到,主要是字符处理一类的。

1---字符串大小写的处理

public class CommonUtils {
    /**
     * 判断String\List\Object[]是否为空
     * @param v
     * @param trim
     * @return
     */
    public static boolean isEmpty(Object v, boolean trim) {
        if (v == null)
            return true;
        if (v instanceof String) {
            String sv = (String) v;
            return trim ? sv.trim().length() == 0 : sv.length() == 0;
        } else if (v instanceof List<?>) {
            return ((List<?>) v).size() == 0;
        } else if (v instanceof Object[]) {
            return ((Object[]) v).length == 0;
        } else {
            return false;
        }
    }

    public static String underlineToCamelhump(String str) {
        str = str.toLowerCase();
        Matcher matcher = Pattern.compile("_[a-z]").matcher(str);
        StringBuilder builder = new StringBuilder(str);
        for (int i = 0; matcher.find(); i++) {
            builder.replace(matcher.start() - i, matcher.end() - i, matcher.group().substring(1).toUpperCase());
        }
        if (Character.isUpperCase(builder.charAt(0))) {
            builder.replace(0, 1, String.valueOf(Character.toLowerCase(builder.charAt(0))));
        }
        return builder.toString();
    }

    public static String firstCharacterUpperCase(String str) {
        if (isEmpty(str))
            return str;
        return Character.toUpperCase(str.charAt(0)) + str.substring(1);
    }

    public static void main(String[] args) {
    
        System.out.println(CommonUtils.firstCharacterUpperCase(CommonUtils.underlineToCamelhump("one_Two_THREE___fOUR+FiVE")));
  
        System.out.println(CommonUtils.underlineToCamelhump("one_Two_THREE___fOUR+FiVE"));
    }
}

我就不客气了,main()方法里面的参数大家都看到了,直接上图,看看console中的运行结果:
_

_
如上图DaoTest.java是一个测试的Dao文件
继续完成Dao文件,写完一部分,打算TestNG看看效果,结果报错了:

十二月 21, 2017 4:50:19 下午 org.springframework.web.context.ContextLoader initWebApplicationContext
严重: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'daoTest' defined in file [D:\OxygenWork\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\RepositoryCheck\WEB-INF\classes\com\tsmi\hibernate\dao\DaoTest.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.

报错的原因百度一下:因为继承了HibernateDaoSupport 相当sessionFactory还没注入到HibernateDaoSupport中,使得这里的this.getHibernateTemplate()=null。

添加代码(一个方法)如下:

@Repository
public class DaoTest extends HibernateDaoSupport implements Dao {

    @Resource
    private SessionFactory sessionFactory;
    
    private Session session;
    
    @PostConstruct
    public void InjectedSessionFactory() {
        //给父类注入sessionFactory
        super.setSessionFactory(sessionFactory);
    }

}

最后直接上代码,基本上copy的蒋锋代码
三个文件,一个interface一个class一个test文件
1---interface

package com.tsmi.hibernate.dao;

import java.io.Serializable;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.metadata.ClassMetadata;
import org.springframework.orm.hibernate5.HibernateTemplate;

import com.tsmi.hibernate.bean.PageInfo;

public interface Dao {

    public SessionFactory getSessionFactory();

    public Session getCurrentSession();

    public Connection getConnection();

    public Session openSession();

    public Dao openDao();

    public HibernateTemplate getHibernateTemplate();

    public void flush();

    public void clear();

    public void close();

    public Transaction beginTransaction();

    public void commit();

    public void rollback();

    public <T> void refresh(T t);

    public <T> void evict(T t);

    public <T> Serializable save(T t);

    public <T> List<Serializable> bulkSave(List<T> ts);

    public int bulkUpdate(final String queryString, final Object... values);

    public <T> T update(T t);

    public <T> T update(Class<T> clazz, Map<String, Object> data);

    public <T> T update(T t, String... includeFields);

    public <T> T update(T t, boolean ignoredNull, String... includeFields);

    public <T> void delete(T c);

    public int executeUpdate(String hql, Object... params);

    public <T> T saveOrUpdate(T t);

    public <T> T saveOrUpdate(T t, String... includeFields);

    public <T> T saveOrUpdate(T t, boolean ignoredNull, String... includeFields);

    public <T, ID extends Serializable> T findById(Class<T> c, ID id);

    public <ID extends Serializable> Object findById(String entityName, ID id);

    public <T> List<T> findAll(Class<T> t);

    public <T> List<T> findByProperty(Class<T> t, Object... obj);

    public <T> T findByPropertyFirst(Class<T> t, Object... obj);

    public <T> List<T> findByProperty(Class<T> t, T obj);

    public <T> List<T> findByProperty(Class<T> t, Map<String, Object> map);

    public <T> List<T> executeQuery(String hql, Object... params);

    public <T> PageInfo<T> executeQuery(String hql, int start, int limit, Object... params);

    public int selectCount(String hql, Object... params);

    public int selectPageCount(String hql, Object... params);

    public int executeSQLUpdate(String sql, Object... params);

    public List<Map<String, Object>> executeSQLQuery(String sql, Object... params);

    public List<Map<String, Object>> executeSQLQuery(String sql, String[] fields, Object... params);

    public Map<String, Object> executeSQLQueryFirst(String sql, Object... params);

    public Map<String, Object> executeSQLQueryFirst(String sql, String[] fields, Object... params);

    public <T extends Serializable> List<T> executeSQLQuery(String sql, Class<T> c, Object... params);

    public <T extends Serializable> T executeSQLQueryFirst(String sql, Class<T> c, Object... params);

    public PageInfo<Map<String, Object>> executeSQLQueryPage(String sql, int start, int limit, Object... params);

    public PageInfo<Map<String, Object>> executeSQLQueryPage(String sql, int start, int limit, int total,
            Object... params);

    public PageInfo<Map<String, Object>> executeSQLQueryPage(String sql, String[] fields, int start, int limit,
            Object... params);

    public PageInfo<Map<String, Object>> executeSQLQueryPage(String sql, String[] fields, int start, int limit,
            int total, Object... params);

    public <T extends Serializable> PageInfo<T> executeSQLQueryPage(String sql, Class<T> c, int start, int limit,
            Object... params);

    public <T extends Serializable> PageInfo<T> executeSQLQueryPage(String sql, Class<T> c, int start, int limit,
            int total, Object... params);

    public int selectSQLCount(String sql, Object... params);

    public int selectPageSQLCount(String sql, Object... params);

    public <T> Serializable getIdentifierPropertyName(T t);

    public <T> Serializable getIdentifier(T t);

    public <T> ClassMetadata getClassMetadata(T t);
}

2---dao的实现类class

package com.tsmi.hibernate.dao;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.math.BigInteger;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.internal.SessionImpl;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.hibernate.query.internal.NativeQueryImpl;
import org.hibernate.transform.Transformers;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.tsmi.hibernate.bean.PageInfo;
import com.tsmi.hibernate.utils.CommonUtils;
import com.tsmi.hibernate.utils.DataObjectUtils;

/**
 * 唯一的Dao文件
 * 对 Hibernate 和  Spring-orm 的封装
 * @author Charlie
 *
 */
@Repository
@SuppressWarnings({"unchecked","deprecation"})
public class MyHiberDao extends HibernateDaoSupport implements Dao {
    
    @Resource
    private SessionFactory sessionFactory;
    
    private Session session;
    
    /**
     * 初始化父类SessionFactory
     */
    @PostConstruct
    public void InjectedSessionFactory() {
        super.setSessionFactory(sessionFactory);
    }
    
    public MyHiberDao() {
        
    }
    
    public MyHiberDao(SessionFactory sessionFactory) {
        this.sessionFactory=sessionFactory;
        super.setSessionFactory(sessionFactory);
    }
    
    public void setSession(Session session) {
        this.session = session;    
    }
    
    /**
     * pure test method
     */
    public Session getSession() {
        return this.session;
    }
    
    /* 
     * from Hibernate
     * session's getter() method
     * Obtains the current session
     */
    public Session getCurrentSession() {
        return session == null ? sessionFactory.getCurrentSession():session;
    }

    /* 
     * from Hibernate
     * barely used
     * connection
     */
    public Connection getConnection() {
        SessionImpl session = (SessionImpl) getCurrentSession();
        return session.getJdbcCoordinator().getLogicalConnection().getPhysicalConnection();
    }

    /* 
     * from Hibernate
     * 
     * create database connection and open a session on it
     */
    public Session openSession() {
        return sessionFactory.openSession();
    }

    public Dao openDao() {
        MyHiberDao dao = new MyHiberDao();
        dao.setSessionFactory(sessionFactory);
        dao.setSession(sessionFactory.openSession());
        return dao;
    }

    /* 
     * from Hibernate
     * Force this session to flush. Must be called at the end of a unit of work, 
     * before committing the transaction and closing the session (depending on Session.setFlushMode(FlushMode), 
     * EntityTransaction.commit() calls this method).
     */
    public void flush() {
        getCurrentSession().flush();
    }
    
    /* 
     * from Hibernate
     * Completely clear the session. Evict all loaded instances and cancel all pending saves, updates and deletions. 
     * Do not close open iterators or instances of ScrollableResults.
     */
    public void clear() {
        getCurrentSession().clear();
    }

    /* 
     * from Hibernate
     * End the session by releasing the JDBC connection and cleaning up.
     */
    public void close() {
        getCurrentSession().close();
    }

    /* 
     * from Hibernate
     * session Transaction
     */
    public Transaction beginTransaction() {
        
        // Get the Transaction instance associated with this session.
        Transaction transaction = getCurrentSession().getTransaction();
        if(transaction == null||!transaction.isActive()) {
            // Begin a unit of work and return the associated Transaction object.
            transaction = getCurrentSession().beginTransaction();
        }
        return transaction;
    }

    /* 
     * from Hibernate
     */
    public void commit() {
        beginTransaction().commit();
    }

    /* 
     * from Hibernate
     */
    public void rollback() {
        beginTransaction().rollback();
    }

    

    /* 
     * from Spring-orm
     * getHibernateTemplate()--HibernateDaoSupport--Spring-orm
     * Re-read the state of the given persistent instance.
     * HibernateTemplate--session--refresh()
     * refresh() 数据库-->session
     */
    public <T> void refresh(T t) {
        getHibernateTemplate().refresh(t);
    }

    /* 
     * from Spring-orm
     * Remove the given object from the Session cache.
     * 从session中移除指定的PO
     */
    public <T> void evict(T t) {
        getHibernateTemplate().evict(t);
    }

    /* 
     * from Spring-orm
     * Persist the given transient instance.
     * 临时对象-->持久对象
     */
    public <T> Serializable save(T t) {
        //save() method is just about to persist the object,while it is not officially done
        Serializable id = getHibernateTemplate().save(t);
        //officially done
        flush();
        return id;
    }


    /* 
     * from Spring-orm
     * bulk n 大量
     * 批量save()
     */
    public <T> List<Serializable> bulkSave(List<T> ts) {
        List<Serializable> list = new ArrayList<Serializable>();
        //最好循环中,每隔20个clear一下
        for(T t:ts) {
            list.add(save(t));
        }
        flush();
        
        return list;
    }

    /* 
     * from Spring-orm
     * 
     * Update/delete all objects according to the given query, 
     * binding a number of values to "?" parameters in the query string.
     * 批量更新
     */
    public int bulkUpdate(String queryString, Object... values) {
        int count = getHibernateTemplate().bulkUpdate(queryString, values);
        flush();
        return count;
    }
    
    /* 
     * from Spring-orm
     * 获取
     * Spring-orm  HibernateTemplate.get()  Session.get()
     * get()
     * return the persistent instance of the given entity class with the given identifier
     */
    public <T, ID extends Serializable> T findById(Class<T> c, ID id) {
        return getHibernateTemplate().get(c, id);
    }

    /* 
     * from Spring-orm
     * get()
     * return the persistent instance of the given entity class with the given identifier
     */
    public <ID extends Serializable> Object findById(String entityName, ID id) {
        return getHibernateTemplate().get(entityName, id);
    }
    

    
    /* 
     * from Spring-orm
     * 游离对象-->持久对象
     */
    public <T> T update(T t) {
        return update(t,false);
    }
    
    /* 
     * String... 表示不确定参数有几个;
     * 
     */
    public <T> T update(T t, String... includeFields) {
        return update(t,true,includeFields);
    }
    
    
    /* 
     * from Spring-orm
     */
    public <T> T update(T t, boolean ignoredNull, String... includeFields) {
    
        if(ignoredNull) {
            try {
                //Serializable id = getIdentifier(t);
                //T object = (T) findById(t.getClass(),id);
                
                
            }catch(Exception e) {
                //throw new DaoException(e);
            }
            
        }else {
            
            getHibernateTemplate().update(t);
        }
    
        flush();
        return t;
        
    }


    public <T> T update(Class<T> clazz, Map<String, Object> data) {
        // TODO Auto-generated method stub
        return null;
    }

    /* 
     * from Spring-orm
     */
    public <T> void delete(T t) {
        Serializable id = getIdentifier(t);
        getHibernateTemplate().delete(findById(t.getClass(),id));
        flush();
    }

    
    
    /**
     * from Hibernate
     * private
     * HQL
     * 获取HQL的Query
     * 
     */
    private Query getQuery(String hql,Object[] params1,Map<String,Object> params2) {
        
        Query query = getCurrentSession().createQuery(hql);
        
        if(params1 !=null) {
            for(int i = 0;i<params1.length;i++) {
                query.setParameter(i, params1[i]);
            }
        }
        if(params2 !=null) {
            for(Map.Entry map : params2.entrySet()) {
                query.setParameter((String)map.getKey(),map.getValue());
            }
        }
        
        return query;
    }
    
    private int selectCount(String hql, Object[] params1, Map<String, Object> params2) {
        Query query = getQuery(hql, params1, params2);
        Object result = query.getSingleResult();
        if (result instanceof Number) {
            return ((Number) result).intValue();
        } else {
            return Integer.valueOf(result.toString());
        }
    }
    
    /* 
     * HQL
     * 获取记录数
     */
    public int selectCount(String hql, Object... params) {
        return selectCount(hql,params,null);
    }

    /* 
     * from Hibernate
     * HQL
     * 普通批量查询数据
     * Query
     */
    public <T> List<T> executeQuery(String hql, Object... params) {
        return getQuery(hql,params,null).getResultList();
    }
    
    /* 
     * from Hibernate
     * HQL
     * 分页批量查询数据
     * Query
     */
    public <T> PageInfo<T> executeQuery(String hql, int start, int limit, Object... params) {
        return executeQuery(hql,params,null,start,limit);
    }
    
    /* 
     * from Hibernate
     * private 方法 
     */
    private <T> PageInfo<T> executeQuery(String hql,Object[] params1,Map<String,Object> params2,int start,int limit){
        
        Query<T> query = getQuery(hql,params1,params2);
        ScrollableResults sr = query.scroll();
        sr.last();
        int totalRows = sr.getRowNumber();
        query.setFirstResult(start);
        query.setMaxResults(limit);
        return new PageInfo<T>(start,limit,totalRows,query.getResultList());
        
    }
    
    /*
     *  批量查询三种方式
     *  1)循环使用session的save(); 2)hqlQuery; 3)sqlQuery;
     * /
    
    /* 
     * HQL
     * 批量修改数据
     *
     * Hibernate+javax
     * HQL Query
     * Hibernate Query
     * javax executeUpdate()
     * Execute the update or delete statement
     */
    public int executeUpdate(String hql, Object... params) {
        int count = getQuery(hql,params,null).executeUpdate();
        flush();
        return count;
    }

    private int selectPageCount(String hql, Object[] params1, Map<String, Object> params2) {
        String totalsql = "select count(1) " + hql.substring(hql.indexOf(" from "));
        int orderbyIndex = totalsql.lastIndexOf(" order ");
        if (orderbyIndex != -1)
            totalsql = totalsql.substring(0, orderbyIndex);
        return selectCount(totalsql, params1, params2);
    }
    
    public int selectPageCount(String hql, Object... params) {
        return selectPageCount(hql, params, null);
    }

    
    /* 
     * from Spring-orm
     * 临时对象-->持久化对象
     * 游离对象-->持久化对象
     */
    public <T> T saveOrUpdate(T t) {
        return saveOrUpdate(t,true);
    }

    public <T> T saveOrUpdate(T t, String... includeFields) {
        return saveOrUpdate(t,true,includeFields);
    }

    public <T> T saveOrUpdate(T t, boolean ignoredNull, String... includeFields) {
        Serializable id = getIdentifier(t);
        if(CommonUtils.isEmpty(id)) {
            save(t);
        }else {
            t = update(t,ignoredNull,includeFields);
        }
        flush();
        return t;
    }

    /* 
     * Spring-orm
     * return all persistent instance of the given entity class
     * 本来PO没在session,你findAll(),全都找出来了;
     */
    public <T> List<T> findAll(Class<T> t) {
        return getHibernateTemplate().loadAll(t);
    }

    /* 
     * Hibernate
     * executeQuery()
     * 
     */
    public <T> List<T> findByProperty(Class<T> t, Object... obj) {
        if(obj != null && obj.length % 2 != 0) {
            System.out.println("error");
            return null;    
        }
        StringBuffer hql = new StringBuffer("from " + t.getName() + " ");
        if(!CommonUtils.isEmpty(obj)) {
            List<Object> params = new ArrayList<Object>();
            for(int i =0; i < obj.length; i+=2) {
                hql.append(i==0 ? " where " : " and ");
                String key = String.valueOf(obj[i]);
                Object value = obj[i + 1];
                if(value == null) {
                    hql.append(key + " is null ");
                }else {
                    hql.append(key + " = ? ");
                    params.add(obj[i + 1]);
                }
            }
            return executeQuery(hql.toString(),params.toArray());
        }
        return executeQuery(hql.toString());
    }
    
    /* 
     * Hibernate
     * executeQuery()  
     * Query getResultList()
     */
    public <T> List<T> findByProperty(Class<T> t, Map<String, Object> map) {
        StringBuffer hql = new StringBuffer("from " + t.getName() + " ");
        if(map.size() > 0)
          hql.append(" where ");
        
        List<Object> params = new ArrayList<Object>();
        for(String key : map.keySet()) {
            Object value = map.get(key);
            if(params.size() == 0) {
                hql.append(" where ");
            }
            if(value == null) {
                hql.append(key + " is null ");
            }else {
                hql.append(key + " = ? ");
                params.add(value);
            }
        }
        return executeQuery(hql.toString(),params);
    }


    public <T> List<T> findByProperty(Class<T> t, T obj) {
        StringBuffer hql = new StringBuffer("from " + t.getName() + " ");
        Field[] fields = obj.getClass().getDeclaredFields();
        List<Object> params = new ArrayList<Object>();
        for(int i = 0;i < fields.length; i++) {
            try {
                Field field = fields[i];
                field.setAccessible(true);
                Object value = fields[i].get(obj);
                if(!CommonUtils.isEmpty(value)) {
                    continue;
                }
                if(params.size() == 0) {
                    hql.append(" where ");
                }
                hql.append(field.getName() + " = ? ");
                params.add(value);
                
            }catch(Exception e) {
                e.printStackTrace();
            }    
        }
        return executeQuery(hql.toString());
    }

    /* 
     * obtain the first PO
     */
    public <T> T findByPropertyFirst(Class<T> t, Object... obj) {
        List<T> list = findByProperty(t,obj);
        return list.size() == 0 ? null : list.get(0);
    }
    
    /*
     * private方法
     * SQL批量查询
     * 
     */
    private <T> NativeQuery getSQLQuery(String sql, Class<T> c, Object[] params1, Map<String, Object> params2) {
        
        NativeQueryImpl query = (NativeQueryImpl) getCurrentSession().createNativeQuery(sql);
        Map<String,Object> param = DataObjectUtils.getSqlParameter();
        if (param != null) {
            for (String key : param.keySet()) {
                if (sql.indexOf(":" + key) != -1)
                    query.setParameter(key, param.get(key));
            }
        }
        if (c == null) {
        
        } else if (c == Map.class) {
            query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        } else {
            query.setResultTransformer(Transformers.aliasToBean(c));
        }
        query.setZeroBasedParametersIndex(true);
        if (params1 != null) {
            for (int i = 0; i < params1.length; i++) {
                query.setParameter(i, params1[i]);
            }
        }
        if (params2 != null) {
            for (Map.Entry map : params2.entrySet()) {
                query.setParameter((String) map.getKey(), map.getValue());
            }
        }
        return query;
    }
    
    /* (non-Javadoc)
     * @see com.tsmi.hibernate.dao.Dao#executeSQLQuery(java.lang.String, java.lang.Object[])
     */
    public List<Map<String, Object>> executeSQLQuery(String sql, Object... params) {
        NativeQuery query = getSQLQuery(sql, Map.class, params, null);
        return query.getResultList();
    }

    public List<Map<String, Object>> executeSQLQuery(String sql, String[] fields, Object... params) {
        NativeQuery query = getSQLQuery(sql, null, params, null);
        return arrayToMap(fields, query.getResultList());
    }
    
    public <T extends Serializable> List<T> executeSQLQuery(String sql, Class<T> c, Object... params) {
        NativeQuery query = getSQLQuery(sql, Map.class, params, null);
        return convertMapToList(c, query.getResultList());
    }

    private List<Map<String, Object>> arrayToMap(String[] fields, List<Object[]> resultList) {
        List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
        for (int i = 0; i < resultList.size(); i++) {
            Object obj = resultList.get(i);
            Map<String, Object> dataMap = new HashMap<String, Object>();
            if (obj instanceof Object[]) {
                Object[] datas = (Object[]) obj;
                for (int j = 0; j < fields.length; j++) {
                    dataMap.put(fields[j], j < datas.length ? datas[j] : null);
                }
            } else {
                dataMap.put(fields[0], obj);
            }
            dataList.add(dataMap);
        }
        return dataList;
    }

    public int executeSQLUpdate(String sql, Object... params) {
        int count = getSQLQuery(sql, Map.class, params, null).executeUpdate();
        flush();
        return count;
    }

    public Map<String, Object> executeSQLQueryFirst(String sql, Object... params) {
        List<Map<String, Object>> list = executeSQLQuery(sql, params);
        return list.size() == 0 ? null : list.get(0);
    }

    public Map<String, Object> executeSQLQueryFirst(String sql, String[] fields, Object... params) {
        NativeQuery query = getSQLQuery(sql, null, params, null);
        List<Map<String, Object>> list = arrayToMap(fields, query.getResultList());
        return list.size() == 0 ? null : list.get(0);
    }

    public <T extends Serializable> T executeSQLQueryFirst(String sql, Class<T> c, Object... params) {
        List<T> list = executeSQLQuery(sql, c, params);
        return list.size() == 0 ? null : list.get(0);
    }
    
    public static <T> T convertMapToBean(Class<T> type, Map<String, Object> map)
            throws IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException {
        BeanInfo beanInfo = Introspector.getBeanInfo(type);
        T obj = type.newInstance();

        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (String key : map.keySet()) {
            String beanfieldlike = key.replaceAll("_", "").toLowerCase();
            for (int i = 0; i < propertyDescriptors.length; i++) {
                PropertyDescriptor descriptor = propertyDescriptors[i];
                String propertyName = descriptor.getName();
                if (propertyName.toLowerCase().equals(beanfieldlike)) {
                    Object value = map.get(key);
                    Object[] args = new Object[1];
                    args[0] = value;
                    if (descriptor.getPropertyType() == Boolean.class) {
                        if (value != null && value.getClass() != Boolean.class) {
                            Boolean b = Boolean.valueOf(value.toString());
                            if (value instanceof Number)
                                b = Integer.parseInt(value.toString()) != 0;
                            args[0] = b;
                        }
                    }
                    if (descriptor.getPropertyType() == BigInteger.class) {
                        if (value != null && value.getClass() != BigInteger.class) {
                            BigInteger b = new BigInteger(value.toString());
                            args[0] = b;
                        }
                    }
                    if (descriptor.getPropertyType() == Integer.class) {
                        if (value != null) {
                            Integer b = Integer.parseInt(value.toString());
                            args[0] = b;
                        }
                    }
                    descriptor.getWriteMethod().invoke(obj, args);
                }
            }
        }
        return obj;
    }
    
    public static <T> List<T> convertMapToList(Class<T> type, List<Map<String, Object>> maps) {
        List<T> result = new ArrayList<T>();
        for (Map<String, Object> map : maps) {
            try {
                result.add(convertMapToBean(type, map));
            } catch (IllegalAccessException | InstantiationException | InvocationTargetException| IntrospectionException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
    
    
    /**
     * 这个方法调用了selectPageSQLCount,而那个方法是有问题的
     * total参数非0情况下,可以正常使用
     * @param sql
     * @param c
     * @param fields
     * @param params1
     * @param params2
     * @param start
     * @param limit
     * @param total
     * @return
     */
    private <T> PageInfo<T> executeSQLQueryPage(String sql, Class<T> c, String[] fields, Object[] params1,
            Map<String, Object> params2, int start, int limit, int total) {
        Query<T> query = getSQLQuery(sql, c, params1, params2);
        int totalRows = total == 0 ? selectPageSQLCount(sql, params1, params2) : total;
        query.setFirstResult(start);
        query.setMaxResults(limit);
        List resultList = query.getResultList();
        PageInfo info = new PageInfo<T>(start, limit, totalRows, null);
        if (c == null && !CommonUtils.isEmpty(fields)) {
            info.setData(arrayToMap(fields, resultList));
        } else {
            info.setData(resultList);
        }
        return info;
    }
    

    public PageInfo<Map<String, Object>> executeSQLQueryPage(String sql, int start, int limit, Object... params) {
        // 未实现
        return null;
    }

    public PageInfo<Map<String, Object>> executeSQLQueryPage(String sql, int start, int limit, int total,
            Object... params) {
        // 未实现
        return null;
    }

    /*
     * 四个executeSQLQueryPage(),都是调用private的executeSQLQueryPage()方法
     * */
    
    //total=0
    public PageInfo<Map<String, Object>> executeSQLQueryPage(String sql, String[] fields, int start, int limit,
            Object... params) {
        return executeSQLQueryPage(sql, null, fields, params, null, start, limit, 0);
    }

    //total!=0
    public PageInfo<Map<String, Object>> executeSQLQueryPage(String sql, String[] fields, int start, int limit,
            int total, Object... params) {

        return executeSQLQueryPage(sql, null, fields, params, null, start, limit, total);
    }

    //total=0
    public <T extends Serializable> PageInfo<T> executeSQLQueryPage(String sql, Class<T> c, int start, int limit,
            Object... params) {
        return executeSQLQueryPage(sql, c, null, params, null, start, limit, 0);
    }

    //total!=0
    public <T extends Serializable> PageInfo<T> executeSQLQueryPage(String sql, Class<T> c, int start, int limit,
            int total, Object... params) {
        return executeSQLQueryPage(sql, c, null, params, null, start, limit, total);
    }
    
    
    private int selectSQLCount(String sql, Object[] params1, Map<String, Object> params2) {
        Query query = getCurrentSession().createNativeQuery(sql);

        Map<String, Object> param = DataObjectUtils.getSqlParameter();
        if (param != null) {
            for (String key : param.keySet()) {
                if (sql.indexOf(":" + key) != -1)
                    query.setParameter(key, param.get(key));
            }
        }
        if (params1 != null) {
            for (int i = 0; i < params1.length; i++) {
                query.setParameter(i, params1[i]);
            }
        }
        if (params2 != null) {
            for (Map.Entry map : params2.entrySet()) {
                query.setParameter((String) map.getKey(), map.getValue());
            }
        }
        Object result = query.getSingleResult();
        if (result instanceof Number) {
            return ((Number) result).intValue();
        } else {
            return Integer.valueOf(result.toString());
        }
    }


    /* 
     * 调用private方法
     */
    public int selectSQLCount(String sql, Object... params) {
        return selectSQLCount(sql, params, null);
    }

    /* 
     * WARNING!!!
     * this method's function body is wrong;
     * The reason that author did not debug this method is that this method is never used;
     * 
     */
    public int selectPageSQLCount(String sql, Object... params) {
        return selectPageSQLCount(sql, params, null);
    }

    public <T> Serializable getIdentifierPropertyName(T t) {
        ClassMetadata cm = getClassMetadata(t);
        return cm.getIdentifierPropertyName();
    }

    /* 
     * get the identifier of an instance
     */
    public <T> Serializable getIdentifier(T t) {
        SessionImpl session = (SessionImpl)getCurrentSession();
        EntityPersister ep = session.getEntityPersister(t.getClass().getName(), t);
        return ep.getIdentifier(t, session);
    }

    public <T> ClassMetadata getClassMetadata(T t) {
        SessionImpl session = (SessionImpl) getCurrentSession();
        Class c = t instanceof Class ? (Class<? extends Object>) t : t.getClass();
        EntityPersister ep = session.getEntityPersister(c.getName(), t);
        return ep.getClassMetadata();
    }
    
    /**
     * test
     */
    public String testF() {
        
        return "testF()";
    }

}

3---testNG测试类

package com.tsmi.hibernate.dao;

import java.sql.SQLException;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.internal.SessionImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
import org.testng.annotations.Test;

import com.tsmi.hibernate.bean.PageInfo;
import com.tsmi.hibernate.entity.Mara;
import com.tsmi.hibernate.entity.UserDep;

@ContextConfiguration("classpath*:/mysqlHibernateContext.xml")
public class MyHiberDaoTest extends AbstractTransactionalTestNGSpringContextTests{
    
    private MyHiberDao mhd;
    
    public MyHiberDao getMhd() {
        return mhd;
    }

    @Autowired
    public void setMhd(MyHiberDao mhd) {
        this.mhd = mhd;
    }
    
    
  @Rollback(false)
  @Test
  public void f() {
      
      //just test a String
      System.out.println("------first------");
      //test a empty function which return a String
      System.out.println(mhd.testF());
      //test basic connection info
      try {
          System.out.println("数据库已知的用户"+mhd.getConnection().getMetaData().getUserName());
          System.out.println("数据库的系统函数的逗号分隔列表: "+ mhd.getConnection().getMetaData().getSystemFunctions());      
          System.out.println("数据库的时间和日期函数的逗号分隔列表: "+ mhd.getConnection().getMetaData().getTimeDateFunctions());      
          System.out.println("数据库的字符串函数的逗号分隔列表:  "+ mhd.getConnection().getMetaData().getStringFunctions());      
          System.out.println("数据库供应商用于 'schema' 的首选术语: "+ mhd.getConnection().getMetaData().getSchemaTerm());      
          System.out.println("数据库URL:  " + mhd.getConnection().getMetaData().getURL());      
          System.out.println("是否允许只读:" + mhd.getConnection().getMetaData().isReadOnly());      
          System.out.println("数据库的产品名称:" + mhd.getConnection().getMetaData().getDatabaseProductName());      
          System.out.println("数据库的版本:" + mhd.getConnection().getMetaData().getDatabaseProductVersion());      
          System.out.println("驱动程序的名称:" + mhd.getConnection().getMetaData().getDriverName());      
          System.out.println("驱动程序的版本:" + mhd.getConnection().getMetaData().getDriverVersion());
    
      }catch(SQLException e) {
          e.printStackTrace();
      }
      
      //test Hibernate's Hibernate.session 
      //SessionImpl session = (SessionImpl) mhd.getCurrentSession();
//      //Check if the session is still open.
//      System.out.println("session.isOpen()  "+session.isOpen());
//      System.out.println("session.isAutoCloseSessionEnabled()  "+session.isAutoCloseSessionEnabled());
//      //Will entities and proxies that are loaded into this session be made read-only by default? To determine the read-only/modifiable setting for a particular entity or proxy:
//      System.out.println("session.isDefaultReadOnly()  "+session.isDefaultReadOnly());
//      //Does this session contain any changes which must be synchronized with the database? In other words, would any DML operations be executed if we flushed this session?
//      System.out.println("session.isDirty()  "+session.isDirty());
  
      /*
       * Hibernate 本质是对JDBC的封装
       * Hiberante 的基本接口
       * Configuration  配置Hibernate
       * SessionFactory 初始化Hibernate
       * Session 
       * Transaction    事务
       * Query          查询
       * 
       * Configuration--SessionFactory--Session--Transaction--Query
       * 
       * 
       * 
       * Session session = factory.openSession();
       * Transaction tx;
       * try{
       *    tx = session.beginTransaction();
       *    
       *    

       *    tx.commit();
       * }catch(RuntimeException e){
       *    if(tx!=null) tx.rollback();
       *    throw e;
       * }finally{
       *    session.close();
       * }
       * 
       * */
      
/*     
      //测试flush()方法,保存临时对象
      UserDep ud2 = new UserDep();
      ud2.setKostl("2100");
      ud2.setEname("总务课");
      ud2.setLevel("1");
      mhd.flush();
      mhd.close();
      //result : fail

      */
      
/*     
      //测试save(),保存临时对象
      UserDep ud2 = new UserDep();
      ud2.setKostl("2109");
      ud2.setEname("技术的课");
      ud2.setLevel("1");
      mhd.save(ud2);
      mhd.close();
      //result : bingo
      
*/
      
/*     
     
      * 下面共同测试了findById()和clear()和flush()方法
      * 哎,什么也没测出来,放弃了
      * 
      UserDep ud3 = mhd.findById(UserDep.class, "1501");
      System.out.println(ud3.getEname());
      //mhd.evict(ud3);
      mhd.clear();
      mhd.flush();
      // mhd.refresh(ud3);
      System.out.println("after clear()   "+ud3.getEname());
*/
      
/*      
      //测试 update()/evict()/flush()
      UserDep ud4 = mhd.findById(UserDep.class, "2109");
      //remove ud4 from session
      mhd.evict(ud4);
      ud4.setEname("P板检测");
      //now ud4 is a detached object
      
      //update() method can turn a detached object into a persistent object
      mhd.update(ud4);
      //flush() method can only deal with persistent object;
      //mhd.flush();
      System.out.println(ud4.getEname());
     //result : update bingo / flush() fail
      
      */
      
/*      
      //测试delete()
      UserDep ud5 = mhd.findById(UserDep.class, "2109");
      mhd.delete(ud5);
      // result : bingo
*/
      
      /* getQuery()是MyHiberDao中的private的自定义方法
       * getQuery()执行HQL类Query的查询
       */
     
/*
        // 测试hql查询(不带参数)
        String hql = "from UserDep";
        List<UserDep> rls = mhd.executeQuery(hql, new Object[] {});
        System.out.println(rls.size());
        for (int i = 1; i < rls.size(); i++) {

            System.out.println(" 成本中心:" + rls.get(i).getKostl());
            System.out.println(" 部门名称: " + rls.get(i).getEname());

        }
        rls.clear();
*/
      
/*
        String hql2 = "from Mara as c where c.ename=?";
        String sTemp = "端子";
        List<Mara> rls2 = mhd.executeQuery(hql2, new Object[] { sTemp });

        System.out.println(rls2.size());
        for (int i = 0; i < rls2.size(); i++) {
            System.out.println(" 物料编号: " + rls2.get(i).getMatnr());
            System.out.println(" 物料名称: " + rls2.get(i).getEname());
        }
        rls2.clear();
 */
      
/*
        // 测试返回值类型为PageInfo 的executeQuery(),分页显示
        String hql2 = "from Mara as c where c.ename=?";
        String sTemp = "端子";
        
        PageInfo<Mara> pm1 = mhd.executeQuery(hql2, 10, 20, new Object[] { sTemp });
        List<Mara> lm1 = pm1.getData();
        System.out.println(lm1.size());
        for (int i = 0; i < lm1.size(); i++) {
            System.out.println(" 物料编号: " + lm1.get(i).getMatnr());
            System.out.println(" 物料名称: " + lm1.get(i).getEname());
        }
        lm1.clear();
*/
      
/*      
         //测试executeUpdate() 带有参数更新
         //String hql2 =  "update UserDep c set c.ename =? , c.level=? where c.level=?"; 
         String hql2 =  "update UserDep c set c.ename =?  where c.level=?"; 
         mhd.executeUpdate(hql2, new Object[] {"火箭军","1"});
         
*/
      
/*        
      //测试findAll()
         
      String hql2 = "from Mara as c where c.ename=?";
      String sTemp = "端子";
      List<Mara> rls2 =  mhd.executeQuery(hql2, new Object[] {sTemp});
      //清空session
      mhd.clear();
      //findAll()
      List<Mara> rls3 = mhd.findAll(Mara.class);
      
      System.out.println(rls3.size());
      for (int i = 0;i < rls3.size();i++) {
          System.out.println(" 物料编号: "+rls3.get(i).getMatnr());
          System.out.println(" 物料名称: "+rls3.get(i).getEname());
      }
      System.out.println(rls3.size());
      mhd.clear();
      mhd.close();
      //result : get all the data from db
*/
      
      
/*      
      //测试findByProperty()
      
      List<Mara> rls3 = mhd.findByProperty(Mara.class, new Object[] {"ename","端子","matnr","VH-T"});
      for (int i = 0;i < rls3.size();i++) {
          System.out.println(" 物料编号: "+rls3.get(i).getMatnr());
          System.out.println(" 物料名称: "+rls3.get(i).getEname());
      }
      System.out.println(rls3.size());
      
*/
      
/*      
      //测试selectCount()
      String hql2 = "select count(1) from Mara as c where c.ename=?";
      String sTemp = "端子";
      System.out.println(mhd.selectCount(hql2, new Object[] {sTemp}));
*/  
  }

}
目录
相关文章
|
6月前
|
Java 测试技术 数据库
测试用例的基本要素 && properties配置文件 && 测试用例的基本要素 && SpringMVC背景知识 && 按照开发阶段划分测试类型
测试用例的基本要素 && properties配置文件 && 测试用例的基本要素 && SpringMVC背景知识 && 按照开发阶段划分测试类型
38 0
|
7月前
|
测试技术 持续交付
单元测试:构建稳健应用的第一步
在现代软件开发中,单元测试已经成为构建稳健应用程序的不可或缺的一环。它们是自动化测试的一种形式,旨在验证应用程序的各个部分是否按预期工作。本博客将深入探讨单元测试的核心概念、实施方法以及为什么它们对于开发可维护、可靠的软件至关重要。
29 0
|
11天前
|
SQL XML Java
MyBatis初探:揭示初始化阶段的核心流程与内部机制
MyBatis初探:揭示初始化阶段的核心流程与内部机制
30 2
MyBatis初探:揭示初始化阶段的核心流程与内部机制
|
5月前
|
自然语言处理 搜索推荐 Java
【网安AIGC专题10.25】9 LIBRO方法(ICSE2023顶会自动化测试生成):提示工程+查询LLM+选择、排序、后处理(测试用例函数放入对应测试类中,并解决执行该测试用例所需的依赖)
【网安AIGC专题10.25】9 LIBRO方法(ICSE2023顶会自动化测试生成):提示工程+查询LLM+选择、排序、后处理(测试用例函数放入对应测试类中,并解决执行该测试用例所需的依赖)
129 0
|
9月前
|
安全 测试技术 程序员
软工总结——生命周期各阶段所需文档
软工总结——生命周期各阶段所需文档
|
监控 测试技术
测试的最终产物是什么
测试的最终产物是什么
73 0
测试的最终产物是什么
|
Java 数据库连接 测试技术
SSM整合过程梳理
SSM整合过程介绍
108 0
SSM整合过程梳理
|
存储 SQL 测试技术
软件测试面试题:接口自动化当中,参数化(数据驱动)是如何实现?
软件测试面试题:接口自动化当中,参数化(数据驱动)是如何实现?
171 0
|
测试技术
软件测试面试题:依赖第三方数据的接口如何进行测试?
软件测试面试题:依赖第三方数据的接口如何进行测试?
437 0
|
测试技术
软件测试面试题:在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?
软件测试面试题:在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?
441 0

热门文章

最新文章