HS4J Kit是HS4J的贡献项目, 它的灵感来自ORM(对象关系映射), 通过使用Annotation(注解)对领域对象进行声明, 即可实现对HS4J的调用, 省去编写和维护较为底层的模板式代码.
举例而言, 在一个管理用户信息的业务场景中通常都会有:
01 class User {
02 Long id;
03 String name;
04 Integer age;
05 }
06
07 interface UserRepository {
08 void add(User user);
09 void delete(User user);
10 User findBy(long id);
11 void update(User user);
12 }01 CREATE TABLE `user_t` (
02 `id` int(10) unsigned NOT NULL,
03 `name` varchar(50) DEFAULT NULL,
04 `age` int(3) DEFAULT NULL,
05 PRIMARY KEY (`id`),
06 KEY `NAME` (`name`),
07 KEY `AGE` (`age`)
08 ) ENGINE=InnoDB若直接使用HS4J提供的API, 代码会如HS4J Getting Started的示例一样, 模式化的重复. 对象结构简单还不是问题, 一旦对象字段十多个, 而且还老是要变化, 可想而知噩梦才刚刚开始.
使用Kit提供的注解来声明的话, 一切HS4J的调用操作全部将透明化:
01 @Repository(database="test", table="user_t")
02 interface UserRepository {
03 @HandlerSocket(INSERT)
04 @EntityClass(User.class)
05 void add(User user);
06 ...
07 }接下来要写的代码就是:01 HSClient hsClient = new HSClientImpl(new InetSocketAddress(9999));
02 ProxyFactory proxyFactory = new HandlerSocketProxyFactory(hsClient);
03 UserRepository proxy = proxyFactory.newProxyOf(UserRepository.class);
04
05 proxy.add(new User(1L, "killme2008", 18));
06
07 hsClient.shutdown();抛开必要的初始化和销毁的代码, 除了一行必须的业务代码没有任何多余的.
这里没有配置表的列(Columns), 而是通过EntityClass来告诉Kit默认使用User的所有字段映射为表的所有列, 前提是User的字段名与表列名一致.
若列名与字段名无法一致的时候, 可以ColumnName来声明:
01 class User {
02 @ColumnName("uid")
03 Long id;
04 ...
05 }查询方法怎么声明呢?01 @HandlerSocket(FIND)
02 @EntityClass(User.class)
03 ResultIterator findBy(@Operator(EQ) long id);业务代码会是:01 ResultIterator itr = proxy.findBy(1L);
02 while (itr.next()) {
03 User user = itr.get();
04 ...
05 }缺省情况下, 使用表的主键作为Index的key. 与add不同的是:
查询场景通常会有分页的需求, 这就会使用到Offset和Limit两个注解:
01 @HandlerSocket(FIND)
02 @Index("AGE")
03 @EntityClass(User.class)
04 ResultIterator findUserAgeGreaterThan(@Operator(GT) int age, @Offset int offset, @Limit int limit);上面都是全字段写入或读取, 在部分修改的场景中如何注解呢?01 @HandlerSocket(UPDATE)
02 @Columns("age")
03 @Index("NAME")
04 void updateUserAge(@Operator(EQ) String name, int age);通过Colunms告诉HS4J打开的Index仅对age进行操作, 并以name为key, 是用age参数作为value.
修改多值的情况下, 请保证参数声明的顺序和Columns定义的顺序一致:
01 @HandlerSocket(UPDATE)
02 @Columns({"name", "age"})
03 void updateUserNameAndAge(@Operator(EQ)long id, String name, int age);主要的用法介绍到此, 还其他的用法就不再累述了, 请参看单元测试代码举一反三吧!