mybatis注解开发
@InsertProvider
@DeleteProvider
@UpdateProvider
@SelectProvider
以上四个注解用于使用SQL构建器来完成动态SQL的组建。
注解中有两个属性:type和method
type:用于构建SQL语句的类型的字节码对象
method:构建SQL语句的方法名称
案例:同时查询多个id值的用户对象
动态SQL的三种实现方式(注解实现动态sql)
方式一:自己拼接SQL语句
sql构建器
public class SqlBuilder {
public String getSelectUserSql(@Param("ids") List<Integer> ids){
String sql="select * from t_user where id in(";
for (int i = 0; i < ids.size(); i++) {
if(i<ids.size()-1) {
sql += ids.get(i) + ",";
}else {
sql += ids.get(i) + ")";
}
}
return sql;
}
}
mapper层
@SelectProvider(type =/*产生SQL语句的类的字节码对象*/SqlBuilder.class,method =/*产生SQL语句的方法名称*/"getSelectUserSql")
List<User> findByIds(@Param("ids") List<Integer> ids);
测试类
public static void main(String[] args) {
UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
List<User> users = mapper.findByIds(Arrays.asList(1, 2, 3, 4, 5));
users.forEach(user->{
System.out.println(user.getUsername());
});
}
方式二:使用mybatis提供的SQL类来完成动态SQL的创建
package com.woniuxy.utils;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;
import java.util.List;
public class SqlBuilder {
public String getSelectUserSql(@Param("ids") List<Integer> ids){
//生成动态SQL的方式二
String condition="id in (";
for (int i = 0; i < ids.size(); i++) {
if(i<ids.size()-1) {
condition += ids.get(i) + ",";
}else {
condition += ids.get(i) + ")";
}
}
String sql = new SQL().SELECT("*")// SELECT *
.FROM("t_user")// from t_user
.WHERE(condition).toString();
return sql;
}
}
方式三:不使用provider,直接使用增删改查注解完成SQL语句的执行
注意:此处不再使用@SelectProvider,而是使用@Select注解完成动态SQL的执行,将XML中的动态SQL写到<s