参数绑定

参数绑定指的是:将接口参数绑定到SQL指定的位置中,也即向SQL中传入参数。

序号绑定

序号绑定指的是将接口参数的序号绑定到SQL指定的位置中。 参数的序号从1开始,:1表示使用第1个参数,:2表示使用第2个参数,以此类推。 下面是序号绑定的实例:

@SQL("insert into binding_user(uid, name, age) values(:1, :2, :3)")
public void addUserByIndex(int uid, String name, int age);

请看上面的代码,当调用addUserByIndex方法时,:1将被替换为addUserByIndex方法的第1个参数,也就是uid;:2将替换为addUserByIndex方法的第2个参数,也就是name,:3将替换为addUserByIndex方法的第3个参数,也就是age。

最终mango内部将执行如下的JDBC代码绑定参数:

ps = conn.prepareStatement("insert into binding_user(uid, name, age) values(?, ?, ?)");
ps.setInt(1, uid);
ps.setString(2, name);
ps.setInt(3, age);

重命名绑定

使用序号绑定虽然很简便,但有时查看起来会不够直观,这时我们可以通过@Rename注解对参数进行重命名。 下面是重命名绑定的实例:

@SQL("insert into binding_user(uid, name, age) values(:uid, :name, :age)")
void addUserByRename(@Rename("uid") int uid, @Rename("name") String name, @Rename("age") int age);

需要注意的是,一旦使用@Rename注解对参数进行重命名,则不能再通过序号绑定参数,下面是一个不合法的实例:

@SQL("insert into binding_user(uid, name, age) values(:1, :name, :age)")
void addUserError(@Rename("uid") int uid, @Rename("name") String name, @Rename("age") int age);

列表参数绑定

在SQL中使用in操作的时候,我们会使用到列表参数绑定。 下面是列表参数绑定的实例:

@SQL("select uid, name, age from binding_user where uid in (:1)")
public List<BindingUser> getUsersByUids(List<Integer> uids);

需要注意的是, in (:1) 中的参数必须是List或Set或Array,同时返回参数也必须是List或Set或Array。

属性绑定

当接口参数传入的是自定义对象时,我们可以使用属性绑定。 下面是属性绑定的实例:

@SQL("insert into binding_user(uid, name, age) values(:1.uid, :1.name, :1.age)")
public void addUserByObjIndex(BindingUser user);

需要注意的是,BindingUser类必须含有getUid(),getName(),getAge()方法, 因为:1.uid将调用getUid()方法获取参数,:1.name将调用getName()方法获取参数,:1.age将调用getAge()方法获取参数。 当然,我们依然可以对参数进行重命名:

@SQL("insert into binding_user(uid, name, age) values(:u.uid, :u.name, :u.age)")
public void addUserByObjRename(@Rename("u") BindingUser user);

属性自动匹配

在使用自定义对象时,使用:1.uid或:u.uid绑定参数会显得不够简练,mango实现了属性自动匹配功能,使SQL更加简练。 下面是属性自动匹配的实例:

@SQL("insert into binding_user(uid, name, age) values(:uid, :name, :age)")
public void addUserByProperty(BindingUser user);

混合绑定

各种参数绑定混合使用:

@SQL("insert into binding_user(uid, name, age) values(:myuid, :name, :age)")
public void addUserByMix(@Rename("myuid") int uid, BindingUser user);

查看完整示例代码和表结构

参数绑定 的所有代码和表结构均可以在 mango-example 中找到。