`
jin8000608172
  • 浏览: 140096 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

互联网数功能位,表扩展(flagBit,feature)

阅读更多
<select id="queryRegThreeDaysNotCharge" parameterType="map" resultMap="BaseResultMap">
		SELECT id FROM member m
		where m.register_time >= to_date(concat(to_char(sysdate-3,'yyyy-mm-dd'),' 11:00:00'),'yyyy-mm-dd hh24:mi:ss')
		<![CDATA[
			and m.register_time < to_date(concat(to_char(sysdate-2,'yyyy-mm-dd'),' 11:00:00'),'yyyy-mm-dd hh24:mi:ss')
		]]> 
		and  BITAND(m.flag_bit,${memberFlagBit}) = 0
	</select>

<update id="addMemberFlagBit" parameterType="map">
        update member set flag_bit = (flag_bit + ${flagBit}) - bitand(flag_bit, ${flagBit}) where id = #{memberId}
    </update>
    <update id="clearMemberFlagBit" parameterType="map">
        update member set flag_bit = bitand(flag_bit, ${flagBit}) where id = #{memberId}
    </update>


引用
package com.xxx.dao.domain;

public interface ExtensionFeatures {
	String getFeatures();

	void setFeatures(String features);

	int getFeaturesVersion();

	void setupFeature(String columnName, String value);

	void setupFeature(String columnName, Object value);

	void removeFeature(String columnName);

	String getFeature(String columnName);

	<T> T getFeature(String columnName, Class<T> clz);
}



package com.xxx.dao.domain;

public interface ExtensionFlagBit {
	long getFlagBit();

	/**
	 * flagBit的乐观锁字段,最好要有对应的数据表字段,要不代码/sql配置写得很麻烦。
	 * 
	 * 假设flagVersion没有数据表字段,而是用flagBit的旧值作为乐观锁:
	 * DO中有flagVersion存放从数据库刚取出时的值,
	 * 那就要setFlagBit()后手动调用setFlageVersion(),在setFlagBit()里隐藏地调用setFlagVersion()是不好的
	 * 或着mybatis中resultMap要配置多一行将同字段内容放进两个setter中。
	 * 
	 * 如果取单条要手动调用setFlagVersion(),在取出是列表时,要在manager中手动加个循环手动setFlagVersion()
	 * 
	 * 即使在mybatis中resultMap配置了多一行将同字段内容放进两个setter中,因为都是用自身的值作乐观锁,
	 * 处理不了超高频率并发交替改变这个bit的情形。
	 * 彩票行业比一些行业在这里多了一个乐观锁字段,因为我们行业会在"跟单"这业务领域在同一记录上的并发比较常见。
	 * 
	 */
	int getFlagVersion();
}



package com.xxx.dao.domain;

/**
 * <ul>
 * <li>某个设置如果不用于where条件,选用flagBit和feature都行</li>
 * <li>如果用于where条件,选用flagBit,用于where条件时用bitand()/bitor()/bitxor()函数</li>
 * <li>如果是值选取比较少,比如1~4,可以选用flagBit,或4个bit内的组合能比较对应</li>
 * <li>如果值的范围可能比较扩充,可用json表达的features</li>
 * </ul>
 * 
 * @author zhoufeng
 *
 */
public interface ExtensionField extends ExtensionFlagBit, ExtensionFeatures {

}



package com.xxxpiao.common.entity.member;

import java.util.Calendar;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Transient;

import org.hibernate.annotations.Type;

import com.xxx.dao.domain.ExtensionField;
import com.xxx.dao.domain.HasLoadedAttach;
import com.xxx.dao.util.HasLoadedAttachUtil;
import com.xxx.member.common.constant.MemberHasLoadedAttachBit;
import com.xxxpiao.common.entity.BaseEntity;
import com.xxxpiao.common.entity.enumerated.BindBankType;
import com.xxxpiao.common.entity.enumerated.CertType;
import com.xxxpiao.common.entity.enumerated.MemberStatus;
import com.xxxpiao.common.entity.enumerated.SellClient;
import com.xxxpiao.common.entity.enumerated.Sex;
import com.xxxpiao.common.entity.enumerated.ThirdType;
import com.xxxpiao.common.service.vo.RegisterType;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * 网站客户
 * 
 * @author yaya
 * 
 */
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@SequenceGenerator(name = "SEQ_MEMBER", sequenceName = "SEQ_MEMBER", allocationSize = 1, initialValue = 1)
public class Member extends BaseEntity implements HasLoadedAttach, ExtensionField {
	private static final long serialVersionUID = 6014921986862506261L;

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_MEMBER")
	private Long id;

	@Column(nullable = false, unique = true)
	private String account;

	/** 昵称(屏蔽手机号,默认跟帐户名相同) */
	@Column(nullable = false)
	private String nickname;

	@Column(nullable = false)
	private String password;

	/** 联系电话 */
	@Column(name = "phone")
	private String phone;

	/** 电邮地址 */
	private String email;

	/** 用户状态 (0-正常,1-关闭) */
	@Enumerated
	@Column(nullable = false)
	private MemberStatus status = MemberStatus.ENABLE;

	/** 注册时间 */
	@Column(nullable = false)
	private Calendar registerTime;

	/** 来源客户端 */
	@Enumerated
	@Column(nullable = false)
	private SellClient sellClient;

	/** 市场渠道 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "sell_channel", nullable = false)
	private MemberMarketChannel sellChannel;

	/** 证件类型 (0-身份证,1-军官证 ,2-护照) */
	@Enumerated
	private CertType certType;

	/** 证件号码 */
	private String certNo;

	/** */
	private Calendar lastLoginTime;

	/** */
	private String name;

	/** */
	private Calendar birthday;

	/** 性别 (0-男,1-女) */
	@Enumerated
	private Sex sex;

	/** 用户所在地区 */
	private Long areaId;

	/** IM */
	private String im;

	/** 提款银行ID */
	private Long bankId;

	/** 开户行全称 */
	private String bankName;

	/** 银行帐号 */
	private String bankCardNo;

	/** 消费级别 */
	private int userLevel = 0;

	/** 头衔 */
	private String title;

	/** 推荐人 */
	private String recoMember;

	/** 用户资料完整度(0-快速注册,1-完整注册) */
	@Column(name = "INFO_FULL_STATUS")
	private int infoFullStatus;

	@Type(type = "thirdType")
	private ThirdType thirdType = ThirdType.LOCAL;

	/** 用户在第三方系统的标识,如在支付宝的标识,一般会在共享注册时设置 */
	private String thirdId;
	
	/** 用户是本站注册的,但通过第三方绑定登陆的,有这个信息*/
	private MemberThirdLogin thirdLogin;
	
	/** 注册类型,暂时不保存到数据库中 */
	@Transient
	private RegisterType registerType;

	/** 用户绑定类型 */
	@Type(type = "bindBankType")
	private BindBankType bindBankType = BindBankType.NORMAL;

	/** 用户绑定银行卡信息 **/
	private String bindBankInfo;

	/** 会员信息更新时间 */
	private Calendar updateTime = Calendar.getInstance();

	/** 用户提款手机号码绑定 */
	private String getMoneyPhone;
	/**
	 * 出生月日
	 */
	private String birthdayMmdd;
	
	@Transient
	private long attachBit;

	private Long flagBit = 0L;

	private Integer flagVersion = 0;

	private JSONObject features = new JSONObject();

	private Integer featuresVersion = 0;

	public Member() {

	}

	public Member(Long id) {
		this.id = id;
	}

	/**
	 * 快速注册用户构造方法
	 * 
	 * @param account
	 * @param password
	 * @param sellClient
	 * @param sellChannel
	 */
	public Member(String account, String password, SellClient sellClient, MemberMarketChannel sellChannel) {
		this.account = account;
		this.nickname = account;
		this.password = password;
		this.registerTime = Calendar.getInstance();
		this.sellClient = sellClient;
		this.sellChannel = sellChannel;
	}

	public Member(String account, String password) {
		this.account = account;
		this.password = password;
	}
	
	@Override
	public Long getId() {
		return id;
	}

	public String getAccount() {
		return account;
	}

	public void setAccount(String account) {
		this.account = account;
	}

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public MemberStatus getStatus() {
		return status;
	}

	public void setStatus(MemberStatus status) {
		this.status = status;
	}

	public Calendar getRegisterTime() {
		return registerTime;
	}

	public void setRegisterTime(Calendar registerTime) {
		this.registerTime = registerTime;
	}

	public SellClient getSellClient() {
		return sellClient;
	}

	public void setSellClient(SellClient sellClient) {
		this.sellClient = sellClient;
	}

	public MemberMarketChannel getSellChannel() {
		return sellChannel;
	}

	public void setSellChannel(MemberMarketChannel sellChannel) {
		this.sellChannel = sellChannel;
		addAttachFlag(MemberHasLoadedAttachBit.sellChannel);
	}

	public void setSellChannelId(Long sellChannel) {
		this.sellChannel = new MemberMarketChannel(sellChannel);
		removeAttachFlag(MemberHasLoadedAttachBit.sellChannel);
	}

	public CertType getCertType() {
		return certType;
	}

	public void setCertType(CertType certType) {
		this.certType = certType;
	}

	public String getCertNo() {
		return certNo;
	}

	public void setCertNo(String certNo) {
		this.certNo = certNo;
	}

	public Calendar getLastLoginTime() {
		return lastLoginTime;
	}

	public void setLastLoginTime(Calendar lastLoginTime) {
		this.lastLoginTime = lastLoginTime;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		if(name!=null){
			this.name = name.trim();
		}else{
			this.name = null;
		}
	}

	public Calendar getBirthday() {
		return birthday;
	}

	public void setBirthday(Calendar birthday) {
		this.birthday = birthday;
	}

	public Sex getSex() {
		return sex;
	}

	public void setSex(Sex sex) {
		this.sex = sex;
	}

	public Long getAreaId() {
		return areaId;
	}

	public void setAreaId(Long areaId) {
		this.areaId = areaId;
	}

	public String getIm() {
		return im;
	}

	public void setIm(String im) {
		this.im = im;
	}

	public Long getBankId() {
		return bankId;
	}

	public void setBankId(Long bankId) {
		this.bankId = bankId;
	}

	public String getBankName() {
		return bankName;
	}

	public void setBankName(String bankName) {
		this.bankName = bankName;
	}

	public String getBankCardNo() {
		return bankCardNo;
	}

	public void setBankCardNo(String bankCardNo) {
		this.bankCardNo = bankCardNo;
	}

	public int getUserLevel() {
		return userLevel;
	}

	public void setUserLevel(int userLevel) {
		this.userLevel = userLevel;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getRecoMember() {
		return recoMember;
	}

	public void setRecoMember(String recoMember) {
		this.recoMember = recoMember;
	}

	public int getInfoFullStatus() {
		if(this.name!=null && this.name.length()>0 &&
				this.phone!=null && this.phone.length()>0 &&
				this.certNo!=null && this.certNo.length()>0){
			return 1;//完善资料
		}
		return infoFullStatus;
	}

	public void setInfoFullStatus(int infoFullStatus) {
		this.infoFullStatus = infoFullStatus;
	}

	public String getThirdId() {
		return thirdId;
	}

	public void setThirdId(String thirdId) {
		this.thirdId = thirdId;
	}
	
	public MemberThirdLogin getThirdLogin() {
		return thirdLogin;
	}

	public void setThirdLogin(MemberThirdLogin thirdLogin) {
		this.thirdLogin = thirdLogin;
		this.addAttachFlag(MemberHasLoadedAttachBit.thirdLogin);
	}

	public void setId(Long id) {
		this.id = id;
	}

	public ThirdType getThirdType() {
		return thirdType;
	}

	public void setThirdType(ThirdType thirdType) {
		this.thirdType = thirdType;
	}

	public RegisterType getRegisterType() {
		return registerType;
	}

	public void setRegisterType(RegisterType registerType) {
		this.registerType = registerType;
	}

	public BindBankType getBindBankType() {
		return bindBankType;
	}

	public void setBindBankType(BindBankType bindBankType) {
		this.bindBankType = bindBankType;
	}

	public String getBindBankInfo() {
		return bindBankInfo;
	}

	public void setBindBankInfo(String bindBankInfo) {
		this.bindBankInfo = bindBankInfo;
	}

	public Calendar getUpdateTime() {
		return updateTime;
	}

	public void setUpdateTime(Calendar updateTime) {
		this.updateTime = updateTime;
	}

	public String getGetMoneyPhone() {
		return getMoneyPhone;
	}

	public void setGetMoneyPhone(String getMoneyPhone) {
		this.getMoneyPhone = getMoneyPhone;
	}
	
	@Override
	public boolean hasAttachLoaded(long bitForPart) {
		return HasLoadedAttachUtil.hasAttachLoaded(attachBit, bitForPart);
	}

	private void removeAttachFlag(long flagBit) {
		this.attachBit &= flagBit ^ Long.MAX_VALUE;
	}

	private void addAttachFlag(long flagBit) {
		this.attachBit |= flagBit;
	}

	@Override
	public long getFlagBit() {
		return this.flagBit == null ? 0 : flagBit;
	}

	@Override
	public int getFlagVersion() {
		return this.flagVersion == null ? 0 : flagVersion;
	}

	@Override
	public String getFeatures() {
		return JSON.toJSONString(features,SerializerFeature.UseISO8601DateFormat);
	}

	@Override
	public int getFeaturesVersion() {
		return this.featuresVersion == null ? 0 : featuresVersion;
	}

	@Override
	public void setupFeature(String columnName, String value) {
		features.put(columnName, value);
	}

	@Override
	public void setupFeature(String columnName, Object value) {
		features.put(columnName, value);
	}

	@Override
	public void removeFeature(String columnName) {
		features.remove(columnName);
	}

	@Override
	public String getFeature(String columnName) {
		return features.getString(columnName);
	}

	@Override
	public <T> T getFeature(String columnName, Class<T> clz) {
		return features.getObject(columnName, clz);
	}

	public void addFlagBit(Long flagBit) {
		this.flagBit |= flagBit.longValue();
	}
	public void removeFlagBit(long flagBit) {
		this.flagBit &= flagBit ^ Long.MAX_VALUE;
	}
	public void setFlagBit(Long flagBit) {
		this.flagBit = flagBit == null ? 0 : flagBit;
	}

	public void setFeatures(String features) {
		this.features = JSONObject.parseObject(features,Feature.AllowISO8601DateFormat);
	}

	public void setFlagVersion(Integer flagVersion) {
		this.flagVersion = flagVersion == null ? 0 : flagVersion;
	}

	public void setFeaturesVersion(Integer featuresVersion) {
		this.featuresVersion = featuresVersion == null ? 0 : featuresVersion;
	}

	public String getBirthdayMmdd() {
		return birthdayMmdd;
	}

	public void setBirthdayMmdd(String birthdayMmdd) {
		this.birthdayMmdd = birthdayMmdd;
	}
	
}



引用
http://blog.csdn.net/hengyunabc/article/details/34623957
  • 大小: 191.4 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    django-feature-flag:简化功能标志

    `django-feature-flag` 是一个针对 Python 的 Django 框架开发的库,它专为实现“功能旗标”或“特性开关”(Feature Flags/Feature Toggles)而设计。这个工具允许开发者在不发布新代码的情况下,通过简单的配置来...

    Laravel开发-laravel-simple-featureflag

    【标题】:“Laravel开发-laravel-simple-featureflag”是一个关于在Laravel框架中实现功能标记(Feature Flags)的项目,它提供了一种快速且简洁的方法来管理应用中的特性开关。 【描述】:“Laravel的快速和肮脏...

    Laravel开发-laravel-feature

    Laravel是PHP框架中的一个明星,以其优雅的语法和强大的功能著称,而laravel-feature则进一步扩展了其功能,帮助开发者更好地组织和控制项目中的不同特性。 首先,让我们理解一下什么是“功能标记”。在软件开发中...

    高通camera chi-cdk feature2框架介绍

    高通Camera Chi-CDK Feature2框架是一个功能强大、灵活的框架,能够满足camera应用程序对高性能和高效率的需求。通过了解Feature2框架的架构、组件、工作流程和关键技术点,我们可以更好地理解和应用Feature2框架,...

    Laravel开发-feature

    3. **功能扩展**:可能包括增加多语言支持、自定义分类、促销和折扣管理、客户评论、评分等。这些功能可以通过编写Laravel控制器、模型、视图和路由来实现,同时利用Magento 2的API接口进行数据交互。 4. **支付...

    VS2010建模功能包Modeling Feature Pack

    主要功能: (1)支持C++项目的dgml生成:可以查看项目和类的依赖关系 (2)UML类图的代码双向生成: 从UML类图生成代码 从代码形成UML类图 安装: 运行Visualization_and_Modeling_Feature_Pack_Runtime.vsix和 ...

    feature-flag-service

    综上所述,"feature-flag-service"项目很可能是实现了一个Java功能标记服务,允许开发者通过简单的API调用来控制功能的开启和关闭,以实现灵活的软件部署和管理。通过学习和应用这些知识点,可以提高软件开发的效率...

    ArcGIS Featureservice在线编辑

    在GIS领域,ArcGIS是Esri公司开发的一套强大的地理信息系统软件,用于处理地理空间数据。ArcGIS Featureservice是ArcGIS Server...在实际开发中,还需要结合具体的业务需求和用户体验设计,来优化和扩展这些基本功能。

    MFC Feature Pack Samples (MFC Feature Pack 示例)

    **MFC Feature Pack 示例**是微软为Visual Studio 2008 SP1提供的一系列示例代码,旨在展示MFC(Microsoft Foundation Classes)的新功能和改进。这些示例旨在帮助开发者更好地理解和利用MFC库在现代Windows应用程序...

    Sharepoint自定义Feature阐述

    在SharePoint中,Feature是核心的扩展机制,它允许开发人员将自定义的功能集打包,以便在SharePoint环境中部署和启用。Feature可以包含一系列元素,如列表实例、内容类型、页面布局、Web部件等,以实现特定的功能...

    FeatureLayer,FeatureDataset,FeatureClass,Feature几个概念总结

    `IFeatureLayer` 接口提供了对 `FeatureLayer` 的操作,包括管理数据源、选择集以及查询功能。例如,`IFeatureLayer::DataSourceType` 可以用来查看数据源类型,而 `IFeatureLayer::FeatureClass` 属性则返回该图层...

    ArcGIS for Android FeatureLayer的属性更新

    总结来说,`ArcGIS for Android FeatureLayer`的属性更新涉及到创建和操作特征表,查询特征,修改属性,以及同步编辑。这是一个基础但至关重要的功能,对于构建交互式和动态的GIS应用程序至关重要。在实际开发中,应...

    使用CXF Interceptor&Feature

    本篇文章将深入探讨如何利用CXF的Interceptor(拦截器)和Feature(特性)功能,提升我们的服务开发体验。 首先,Interceptor是CXF框架中的一个核心组件,它允许我们在服务调用的生命周期中插入自定义的行为。拦截...

    chrome-feature-flag-crx插件

    Chrome Feature Flag CRX 插件是一款专为Google Chrome浏览器设计的扩展程序,它允许用户方便地管理和调整浏览器中的“功能标志”(Feature Flags)。功能标志是Chrome开发团队用于实验性功能的一种机制,通过这些...

    更改FeatureClass范围

    下面将详细介绍如何更改FeatureClass范围,包括使用ArcGIS desktop重新导入要素类、修改SDE系统表和修改PersonalGDB系统表等方法。 一、重新导入要素类 要更改FeatureClass范围,首先需要重新导入要素类。在 ...

    feature转化为Json对象

    "Feature 转化为 Json 对象" 在 GIS 应用中,Feature 对象是非常重要的一种数据结构,用于描述空间要素的属性和几何信息。但是在实际应用中,我们需要将 Feature 对象转换为 Json 对象,以便在客户端进行处理和展示...

    feature-toggle:PHP应用程序的可扩展功能切换功能

    功能切换关于FeatureToggle是一个易于使用的可扩展库,旨在为PHP应用程序提供功能切换功能。模型库模型基于Toggles,它们是定义用于评估功能是否应打开或关闭(启用或禁用)的算法的类。 例如,一个Toggle会读取配置...

    Feature设置文本风格

    在SuperMap iClient 6R for JavaScript开发模式中,`Feature`对象是地图服务中基本的数据单元,它代表了地图上的一个实体,如点、线、面等地理要素。为`Feature`对象设置文本风格是地图展示的重要环节,能够帮助用户...

    VS 2010 visualization modeling feature pack

    通过可视化和建模功能包,可以扩展 Visual Studio 2010的功能,可以从 UML 类关系图生成代码、从代码创建 UML 类关系图、创建和验证 C 和 C++ 代码的层关系图、编写自定义代码以创建、修改和验证层关系图等。

    第 06 节_GEE 的数据类型(Geometry,Feature, Feature Collection).pdf

    在地理信息系统(GIS)和遥感领域中,Google Earth Engine(简称GEE)是一个功能强大的云端平台,它允许用户对地理空间信息进行处理和分析。GEE的一个显著特点是,它提供了丰富的数据类型来处理和分析地理空间数据。...

Global site tag (gtag.js) - Google Analytics