以上接口除了directXXX,其他都有等同的异步接口。insert、delete、update接口与JPA同名接口用法一样。DataSource提供了丰富的查询接口,且有独特的翻页查询功能。每以系列的方法主要重载三类: 单个字段过滤、FilterBean过滤和FilterNode过滤。
返回类型为CompletableFuture的接口均为异步接口。
- 开发者可以借鉴 Redkale-demo 中的 AutoClassCreator的代码根据数据表自动生成Entity代码。
+ 开发者可以借鉴 Redkale-demo 中的 AutoClassCreator的代码根据数据表自动生成Entity代码。
FilterBean、FilterNode对象用于构造过滤条件。FilterBean可以转化为FilterNode。FilterBean主要用于接收外界构建的过滤条件,而FilterNode为了构建内部的过滤条件且降低过滤条件变化的耦合性,FilterNode中name值以#开头的视为虚拟字段,不会构建成过滤条件,仅供分布分库的DistributeTableStrategy策略使用。
@@ -84,13 +83,13 @@
如上定义UserBean过滤条件,当非数值类字段值为null、字符串值为空、数值类字段值小于@FilterColumn.least()值(least的默认值为1)都不会构建成过滤条件。@FilterColumn.express根据字段的类型有不同的默认值,若字段类型为Collection子类或数组则express默认为FilterExpress.IN;若字段类型为Range的子类则express默认为FilterExpress.BETWEEN;其他类型则express默认为FilterExpress.EQUAL。默认字段之间是AND关系,若想使用OR关系则需要使用@FilterGroup进行标记:
@@ -115,14 +114,14 @@
如上@FilterGroup 的value 必须是[OR]或者[AND]开头,没有标记@FilterGroup的字段等价于标记了@FilterGroup(value = "[AND]")。[AND]、[OR]后面的字符串为GROUP_NAME,默认的GROUP_NAME为空字符串。如上"[OR]a"可以直接使用"[OR]",有多个[OR]或者[AND]则需要加上不同的NAME。
@@ -187,7 +186,7 @@
DistributeTableStrategy分表策略需要实现三个接口,模板表由实体类的@Table注解提供。Redkale默认实现的MySQL数据库的拷贝表结构语句,其他数据库类型需要通过指定persistence.xml 中的 javax.persistence.tablenotexist.sqlstates 与 javax.persistence.tablecopy.sqltemplate 来配置。
+ DistributeTableStrategy分表策略需要实现三个接口,模板表由实体类的@Table注解提供。Redkale默认实现的MySQL数据库的拷贝表结构语句,其他数据库类型需要通过指定source.properties 中的 tablenotexist-sqlstates 与 tablecopy-sqltemplate 来配置。
@DistributeTable(strategy = LoginRecord.TableStrategy.class)
public class LoginRecord extends BaseEntity {
@@ -199,22 +198,22 @@
private long userid; //C端用户ID
@Column(updatable = false, comment = "登录网络类型; wifi/4g/3g")
- private String netmode = ""; //登录网络类型; wifi/4g/3g
+ private String netMode = ""; //登录网络类型; wifi/4g/3g
@Column(updatable = false, comment = "APP版本信息")
- private String appversion = ""; //APP版本信息
+ private String appVersion = ""; //APP版本信息
@Column(updatable = false, comment = "APP操作系统信息")
private String appos = ""; //APP操作系统信息
@Column(updatable = false, comment = "登录时客户端信息")
- private String loginagent = ""; //登录时客户端信息
+ private String loginAgent = ""; //登录时客户端信息
@Column(updatable = false, comment = "登录时的IP")
- private String loginaddr = ""; //登录时的IP
+ private String loginAddr = ""; //登录时的IP
@Column(updatable = false, comment = "创建时间")
- private long createtime; //创建时间
+ private long createTime; //创建时间
/** 以下省略getter setter方法 */
@@ -223,7 +222,7 @@
public static void main(String[] args) throws Throwable {
LoginRecord record = new LoginRecord();
long now = System.currentTimeMillis();
- record.setCreatetime(now); //设置创建时间
+ record.setCreateTime(now); //设置创建时间
record.setLoginid(Utility.format36time(now) + "-" + Utility.uuid()); //主键的生成规则
//.... 填充其他字段
source.insert(record);
@@ -241,14 +240,14 @@
public String getTable(String table, FilterNode node) {
Serializable day = node.findValue("#day"); //LoginRecord没有day字段,所以前面要加#,表示虚拟字段, 值为yyyyMMdd格式
if (day != null) getTable(table, (Integer) day, 0L); //存在#day参数则直接使用day值
- Serializable time = node.findValue("createtime"); //存在createtime则使用最小时间,且createtime的范围必须在一天内,因为本表以天为单位建表
+ Serializable time = node.findValue("createTime"); //存在createTime则使用最小时间,且createTime的范围必须在一天内,因为本表以天为单位建表
return getTable(table, 0, (time == null ? 0L : (time instanceof Range ? ((Range.LongRange) time).getMin() : (Long) time)));
}
//创建或单个查询时调用本方法
@Override
public String getTable(String table, LoginRecord bean) {
- return getTable(table, 0, bean.getCreatetime());
+ return getTable(table, 0, bean.getCreateTime());
}
//根据主键ID查询单个记录时调用本方法
@@ -258,10 +257,10 @@
return getTable(table, 0, Long.parseLong(id.substring(0, 9), 36));
}
- private String getTable(String table, int day, long createtime) { //day为0或yyyyMMdd格式数据
+ private String getTable(String table, int day, long createTime) { //day为0或yyyyMMdd格式数据
int pos = table.indexOf('.');
- String year = day > 0 ? String.valueOf(day / 10000) : String.format(yearformat, createtime); //没有day取createtime
- return "platf_login_" + year + "." + table.substring(pos + 1) + "_" + (day > 0 ? day : String.format(dayformat, createtime));
+ String year = day > 0 ? String.valueOf(day / 10000) : String.format(yearformat, createTime); //没有day取createTime
+ return "platf_login_" + year + "." + table.substring(pos + 1) + "_" + (day > 0 ? day : String.format(dayformat, createTime));
}
}
}
@@ -281,7 +280,7 @@
private String loginid = ""; //LoginRecord主键
@Column(updatable = false, comment = "创建时间")
- private long createtime; //创建时间
+ private long createTime; //创建时间
/** 以下省略getter setter方法 */
@@ -321,7 +320,7 @@
private long userid; //用户ID
@Column(length = 64, comment = "用户昵称")
- private String username = ""; //用户昵称
+ private String userName = ""; //用户昵称
@Column(length = 32, comment = "手机号码")
private String mobile = ""; //手机号码
@@ -334,7 +333,7 @@
private String remark = ""; //备注
@Column(updatable = false, comment = "创建时间")
- private long createtime; //创建时间
+ private long createTime; //创建时间
/** 以下省略getter setter方法 */
@@ -376,21 +375,21 @@
//使用CacheSource必须要指明泛型
@Resource(name = "usersessions")
- protected CacheSource<Integer> sessions;
+ protected CacheSource sessions;
//登录
public RetResult<UserInfo> login(LoginBean bean) { //bean.sessionid 在接入层进行赋值
UserInfo user = null;
// 登陆逻辑 user = ...
users.put(user.getUserid(), user);
- sessions.set(600, bean.getSessionid(), user.getUserid()); //session过期时间设置为10分钟
+ sessions.setLong(600, bean.getSessionid(), user.getUserid()); //session过期时间设置为10分钟
return new RetResult<>(user);
}
//获取当前用户信息
public UserInfo current(String sessionid) { //给HTTP的BaseServlet用
- Integer userid = sessions.getAndRefresh(sessionid);
- return userid == null ? null : users.get(userid);
+ Long userid = sessions.getLongAndRefresh(sessionid);
+ return userid == null ? null : users.get(userid.intValue());
}
//注销
@@ -400,61 +399,56 @@
}