前言: 在使用mybatis的过程中,总是要去注意 类似 > < 一类的特殊字符需要进行转义,十分别扭而且难记,于是笔者就自己写了一些比较笨拙的方法来实现,
1.首先就是 动态sql直接使用:
这里我使用java来动态的拼接 ,比如一个动态查询场景下,查询参数是不一定的,所以每次的查询可能都不一样,所以
我会将 mapper.xml中定义一个 字符串,
<select id="DynamicQuery"
parameterType="java.util.HashMap" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List" />
from
tb_user a
where 1=1
${sqlStr}
</select>
而serviceImpl层;
public List<TbUser> DynamicQuery(GetUserAndOrgsInfo item){
Map map=new HashMap();
StringBuffer sbStr=new StringBuffer();
sbStr.append( " and 1=1 " );
if(!Strings.isNullOrEmpty(item.name)){
sbStr.append(" and a.user_name= '"+ item.name+"' ");
}
if(!Strings.isNullOrEmpty(item.orgsStr)){
sbStr.append(" and a.user_orgsid= '"+ item.orgsStr+"' ");
}
map.put("sqlStr",sbStr);
return tbUserMapper.DynamicQuery(map);
}
**********************************************************************************
2 mybatis使用纯sql语句去实现复杂的多表查询,参考上面的代码
新建一个实体类 SqlAdapter: 只需要一个属性, private String sql
public class SqlAdapter {
String sql;
public SqlAdapter(){}
public SqlAdapter(String sql) {this.sql = sql; }
public String getSql() { return sql; }
public void setSql(String sql) { this.sql = sql; }
}
serviceImpl层:自己去写纯sql,
public List<Map> getAllDynamic(GetUserAndOrgsInfo item){
StringBuilder sb=new StringBuilder();
sb.append(" select * from tb_user a where a.id>11 order by ** ");
SqlAdapter sqlstr=new SqlAdapter(sb.toString());
return tbUserMapper.getAllDynamic(sqlstr);
}
mapper.xml层:
<select id="getAllDynamic" parameterType="com.XX.entity.SqlAdapter"
resultType="java.util.HashMap">
${sql}
</select>
************************************************************************