虽然 spring5 也推出了 WebFlux 这一套异步技术栈,这种极大提升吞吐的玩法在 node 里玩的风生水起,但 java 世界里异步依旧不是主流,Vertx 倒是做了不少对异步的支持,但是其对于数据访问层的封装依旧还是挺精简的,传统的 javaer 还是受不了这种没有对象映射的工具库,于是我尝试将 Mybatis 移植到了异步驱动上,让数据访问层的工作变得更简单一些。给个例子:
@Sql(User.class)
public interface CommonMapper {
@Select(columns = "id,age,username")
@OrderBy("id desc")
@Page
@ModelConditions({
@ModelCondition(field = "username", criterion = Criterions.EQUAL),
@ModelCondition(field = "maxAge", column = "age", criterion = Criterions.LESS),
@ModelCondition(field = "minAge", column = "age", criterion = Criterions.GREATER)
})
void query(UserSearch userSearch, DataHandler<List<User>> handler);
}
复制代码
上面是 mapper 接口定义,方法的最后一个参数因为异步的原因所以变成了一个回调,不同的是有很多注解来表达 sql,看到这些注解应该不难猜出 sql 语句吧。如果不喜欢你当然可以继续使用 mapper.xml 的方式来写 sql。
更多内容移步代码库吧~
AsyncDao
asyncDao是一款异步非阻塞模型下的数据访问层工具。
- MySQL only. 基于MySQL的异步驱动
- 借鉴了Mybatis的mapping 和 dynamicSQL的内容,Mybatiser可以无缝切换
- 注解表达SQL的能力
- 事务支持
- SpringBoot支持
Mybatis like
使用上与Mybatis几乎一致,由于异步非阻塞的关系,数据的返回都会通过回调DataHandler来完成,所以方法定义参数的最后一个一定是DataHandler类型。由于需要提取方法的参数名,于是需要加上编译参数-parameters
,请将它在IDE和maven里配置上。
public interface CommonDao {
void query(User user, DataHandler<List<User>> handler);
void querySingle(User user, DataHandler<User> handler);
void querySingleMap(User user, DataHandler<Map> handler);
void insert(User user,DataHandler<Long> handler);
void update(User user,DataHandler<Long> handler);
void delete(User user,DataHandler<Long> handler);
}
复制代码
mapper.xml与Mybatis几乎一致的写法(覆盖常见标签,一些不常用标签可能不支持,动态SQL建议使用注解SQL功能)
<?xml version="1.0" encoding="UTF-8"?>
<mapper namespace="com.tg.async.mapper.CommonDao">
<resultMap id="BaseResultMap" type="com.tg.async.mapper.User">
<id column="id" property="id"/>
<result column="old_address" property="oldAddress"/>
<result column="created_at" property="createdAt"/>
<result column="password" property="password"/>
<result column="now_address" property="nowAddress"/>
<result column="state" property="state"/>
<result column="age" property="age"/>
<result column="username" property="username"/>
<result column="updated_at" property="updatedAt"/>
</resultMap>
<select id="query" resultMap="BaseResultMap">select * from T_User
<where>
<if test="user.username!=null and user.username!=''">AND username = #{user.username}</if>