最近又复习了JPA和Hibernate,JPA-hibernate到现在支持自定义对象和动态参数查询都很复杂,早应该简化了。
Mybatis变得如此受欢迎,确实有原因的。
查询语句需要:
a.自定义Object,比如ProductWithTypeName
b.支持根据动态参数组装sql语句
在Mybatis里面实现这两个要求就很简单和方便。
我喜欢用注解,不想用xml配置文件,继续简化和少些代码。
public class ProductWithTypeName {
private Integer prodectId;
private String productName;
private Integer typeId;
private String typeName;
1. 实现方式一
@Select({ "<script>"
+"select p.id as prodectId, p.name as productName,type.id as typeId,type.name as typeName "
+"from product p left join product_type type on p.product_type =type.id "
+"where 1=1"
+"<if test='pname != null'> AND p.name=#{pname} </if> "
+"<if test='tname != null'> AND type.name=#{tname} </if>"
+"</script>"
})
public List<ProductWithTypeName> queryProductAnnotation(@Param("pname")String
productName,@Param("tname") String typeName);
根据参数动态构建查询sql也可以写在注解里面,确实方便。
2.实现方式二,增加provider
@SelectProvider(type=MerchantManageDaoSqlProvider.class,method="queryProductProvider")
public List<ProductWithTypeName> queryProduct(String productName,String typeName);
public class MerchantManageDaoSqlProvider {
public String queryProductProvider(String productName,String typeName) {
String sql="select p.id as prodectId, p.name as productName,type.id as typeId,type.name as typeName "
+ "from product p left join product_type type on p.product_type =type.id where 1=1 ";
if(StringUtils.isNotBlank(productName)) {
sql+=" and p.name='"+productName+"'";
}
if(StringUtils.isNotBlank(typeName)) {
sql+=" and type.name='"+typeName+"'";
}
return sql;
}
}
这两种实现方式都很方便。
Mybatis确实实用。