mybatis criteria singleton

通常我们会使用mybatis-generator生成条件查询的相关criteria对象,但是每次写条件查询的时候都要去new这么一个对象,非常浪费内存空间,所以可以写一个单例工厂用于创建相关的criteria对象。

未使用单例工厂之前的会写类似这样的代码:

InvoiceCriteria invoiceCriteria = new InvoiceCriteria();
		//InvoiceCriteria invoiceCriteria = CriteriaFactory.createCriteria(InvoiceCriteria.class);
		System.out.println(invoiceCriteria);
		Criteria criteria = invoiceCriteria.createCriteria();

使用单例工厂之后会使得每次拿到的criteria对象都是同一个对象:

//InvoiceCriteria invoiceCriteria = new InvoiceCriteria();
		InvoiceCriteria invoiceCriteria = CriteriaFactory.createCriteria(InvoiceCriteria.class);
		System.out.println(invoiceCriteria);
		Criteria criteria = invoiceCriteria.createCriteria();

具体实现如下,首先让mybatis-generator自动生成的criteria对象实现一个统一的接口,如CbpsCriteria,这个接口相当于一个标记接口,无需定义任何方法。

package top.auok.cbps.ssm.ps.factory;

public interface CbpsCriteria {

}
import top.auok.cbps.ssm.ps.factory.CbpsCriteria;

public class InvoiceCriteria implements CbpsCriteria {
    protected String orderByClause;

    protected boolean distinct;

    protected List<Criteria> oredCriteria;

    public InvoiceCriteria() {
        oredCriteria = new ArrayList<Criteria>();
    }

......

单例工厂代码如下:

package top.auok.cbps.ssm.ps.factory;

import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;

/**
 * mybatis criteria singleton factory
 * 
 * @author leocnx
 *
 */
public class CriteriaFactory {

	private static final Map<String, Object> objectMap = new HashMap<String, Object>();

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public synchronized static <T extends CbpsCriteria> T createCriteria(Class<T> c) {
		CbpsCriteria cbpsCriteria = null;
		String className = null;
		className = c.getName();
		try {
			if (!objectMap.containsKey(className)) {
				Class clazz = Class.forName(className);
				// 获得无参构造
				Constructor constructor = clazz.getDeclaredConstructor();
				// 设置无参构造是可访问的
				constructor.setAccessible(true);
				// 产生一个实例对象
				cbpsCriteria = (CbpsCriteria) constructor.newInstance();
				objectMap.put(className, cbpsCriteria);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return (T) objectMap.get(className);
	}
}

the end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值