Oracle位操作


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


<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>


[img]http://dl2.iteye.com/upload/attachment/0098/0407/3a205f60-79a5-351b-a93b-5b6681be88b6.jpg[/img]

package com.xxx.member.common.constant;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.xxxpiao.common.entity.enumerated.Game;
import com.xxxpiao.common.entity.enumerated.OperType;

/**
* 如果1个long flagBit字段不够,再增加多1/2个flagBit字段,
* 64bit+64bit+64bit = 192bit,可以搞定大部分相似变化,比单一字段只表示有限单一意义的利用率高很多。
*
* 这里常量和features内里由**和**来设计/增加业务,两人要管理和搭配好/分派好/互动沟通好vipuser.flagBit,
* member.flagBit负责单个帐号相关的重要/基础/安全性/系统性功能/用户指定前台配置,vipuser.flagBit负责同一自然人多个帐号的处理和促销/活动功能
* vipuser.flagBit一些已过期活动占用的flagBit也可回收重复利用到别的功能和活动
*
* VipUserFlagBitConstant.java 中有更多说明
* {@see com.xxx.vip.common.constant.flagbit.VipUserFlagBitConstant}
*
* 参考资料:
* <ul>
* <li>http://wiki.inzwc.com/wiki/index.php/ArchAndBiz 能否通过标识/精致数据急剧滤掉大部分IO次数和高消耗</li>
* </ul>
*
* @author **
*
*/
public class MemberFlagBitConstant {
// 是否加密身份证号
public static long encryptCertNo = 1;
// 是否加密电话号码
public static long encryptPhone = 1 << 2;
// 是否加密email
public static long encryptEmail = 1 << 3;
// 是否加密im通讯工具
public static long encryptIm = 1 << 4;
// 是否开通手机号登录服务
public static long phoneLoginOpen = 1 << 5;

/** 是否开通投注邮件通知 **/
public static long betEmailNotifyOpen = 1 << 6;

/**
* 已通过短信下发/客服回拨方式验证手机号是真实的
*/
public static long confirmed_mobile = 1 << 7;

/**
* 已通过让用户上传拍照身份证方式确认身份证是真实的
*/
public static long confirmed_certNo = 1 << 8;

/**
* 此帐户已被发现存在多个根据手机号/身份证号等确定的东西或蛛丝马迹发现有关联帐号,
* 进一步信息需从vip系统或安全系统中获取
*/
public static long haveMultiAccountFound = 1 << 9;

/** 标识有信用卡充值 **/
public static long creditcardCharge = 1 << 10;

/**是否启用了投注凭证*/
public static long enable_bet_vouch = 1 << 11;

/**
* 是否是北京单场大户1。vip = very important person
*
* 请通过IDE的索引查找到相应的规则
*/
public static long gameBD_vip_1 = 1 << 12;

public static long gameJZ_vip_1 = 1 << 13;

public static long gameDCSF_vip_1 = 1 << 14;

/***
* 新会员是否已经充值
*/
public static long newMemberIsCharge = 1 << 15;
/**
* 验证邮箱
*/
public static long validateMemberEmail=1 << 16;

/**
* 是否绑定手机短信投注系统(smsbet)
*/
public static long bindSmsbetSystem = 1 << 17;

/**
* 类型
*/
private Long index;
/**
* 类型名称
*/
private String name;
public MemberFlagBitConstant(Long index, String name) {
this.index = index;
this.name = name;
}
/*************以下可配置在admin后台管理配置功能**************/
public final static MemberFlagBitConstant VALIDATE_MEMBER_EMAIL = new MemberFlagBitConstant(validateMemberEmail,"验证邮箱");
public final static MemberFlagBitConstant BIND_SMS_BET_SYSTEM = new MemberFlagBitConstant(bindSmsbetSystem,"是否绑定手机短信投注系统");

/** 功能对应的位标记值 **/
public static Map<Long,MemberFlagBitConstant> memberFlagBitConfigMap = new HashMap<Long,MemberFlagBitConstant>();
static{
memberFlagBitConfigMap.put(VALIDATE_MEMBER_EMAIL.getIndex(), VALIDATE_MEMBER_EMAIL);
memberFlagBitConfigMap.put(BIND_SMS_BET_SYSTEM.getIndex(), BIND_SMS_BET_SYSTEM);
}

/**
* 某会员配置的功能
* @return
*/
public static List<MemberFlagBitConstant> getMemberFlagBitByFlagBit(long optionConstant){
List<MemberFlagBitConstant> flagbits = new ArrayList<MemberFlagBitConstant>();
for(Long key:memberFlagBitConfigMap.keySet()){
if(MemberFlagBitConstant.isExistFlagBit(key, optionConstant)){
flagbits.add(memberFlagBitConfigMap.get(key));
}
}
return flagbits;
}
public static List<MemberFlagBitConstant> getAll(){
List<MemberFlagBitConstant> list = new ArrayList<MemberFlagBitConstant>();
for(Long key:memberFlagBitConfigMap.keySet()){
list.add(memberFlagBitConfigMap.get(key));
}
return list;
}



public static boolean isEncryptCertNo(long optionConstant) {
return (optionConstant & encryptCertNo) > 0;
}

public static boolean isEncryptPhone(long optionConstant) {
return (optionConstant & encryptPhone) > 0;
}

public static boolean isEncryptEmail(long optionConstant) {
return (optionConstant & encryptEmail) > 0;
}

public static boolean isEncryptIm(long optionConstant) {
return (optionConstant & encryptIm) > 0;
}

public static boolean isPhoneLoginOpen(long optionConstant) {
return (optionConstant & phoneLoginOpen) > 0;
}

public static boolean isBetEmailNotifyOpen(long optionConstant) {
return (optionConstant & betEmailNotifyOpen) > 0;
}
public static boolean isCreditcardCharge(long optionConstant) {
return (optionConstant & creditcardCharge) > 0;
}
public static boolean isEnableBetVouch(long optionConstant) {
return (optionConstant & enable_bet_vouch) > 0;
}
public static boolean isGameBD_vip_1(long optionConstant) {
return (optionConstant & gameBD_vip_1) > 0;
}
public static boolean isBind_Sms_Bet_System(long optionConstant) {
return (optionConstant & bindSmsbetSystem) > 0;
}
public static boolean isGameJZ_vip_1(long optionConstant) {
return (optionConstant & gameJZ_vip_1) > 0;
}
public static boolean isGameDCSF_vip_1(long optionConstant) {
return (optionConstant & gameDCSF_vip_1) > 0;
}
public static long getGame_vip_flag(long optionConstant) {
if ((optionConstant & gameBD_vip_1 ) > 0 ) {
return gameBD_vip_1;
}else if ((optionConstant& gameJZ_vip_1) > 0) {
return gameJZ_vip_1;
}else if ((optionConstant& gameDCSF_vip_1) > 0) {
return gameDCSF_vip_1;
}
return 0;
}
public static boolean isNewMemberIsCharge(long optionConstant) {
return (optionConstant & newMemberIsCharge) > 0;
}
public static boolean isValidateMemberEmail(long optionConstant){
return (optionConstant & validateMemberEmail) > 0;
}
/**
* 验证 optionFlagbit操作标识是否已经存在memberFlagbit 中
* @param optionConstant
* @return
*/
public static boolean isExistFlagBit(long optionFlagbit,long memberFlagbit) {
return (optionFlagbit & memberFlagbit )> 0;
}
/**
* 获取addFlagbit写日志记录map
* @return
*/
public static Map<Long, OperType> getAddFlagBitWithSupportOperLogMap(){
Map<Long, OperType> supportLogMap = new HashMap<>();
supportLogMap.put(enable_bet_vouch, OperType.BET_VOUCH_OPEN);
supportLogMap.put(betEmailNotifyOpen, OperType.OPOEN_BET_EMAIL_NOTIFY);
supportLogMap.put(validateMemberEmail, OperType.EMAIL_VALID);
return supportLogMap;
}
/**
* 获取removeFlagbit写日志记录map
* @return
*/
public static Map<Long, OperType> getRemoveFlagBitWithSupportOperLogMap(){
Map<Long, OperType> supportLogMap = new HashMap<>();
supportLogMap.put(enable_bet_vouch, OperType.BET_VOUCH_CLOSE);
supportLogMap.put(betEmailNotifyOpen, OperType.CLOSE_BET_EMAIL_NOTIFY);
supportLogMap.put(validateMemberEmail, OperType.CANCEL_EMAIL_VALID);
return supportLogMap;
}
/**
* vip延迟上传flag对应game的map
* @return
*/
public static Map<Long, Game> getGameVipFlagAndParentGameMap(){
Map<Long, Game> flagGameMap = new HashMap<>();
flagGameMap.put(gameBD_vip_1, Game.JJ_BJDC);
flagGameMap.put(gameDCSF_vip_1, Game.JJ_DCSF);
flagGameMap.put(gameJZ_vip_1, Game.JJ_ZC);
return flagGameMap;
}


public Long getIndex() {
return index;
}
public void setIndex(Long index) {
this.index = index;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}



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;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值