项目需求:
在对权限进行查询时需要查询多个对象中所有拥有权限的id,最常使用的方法就是使用in关键字,在以前的工作中还没有遇到这种情况。
一种解决方法可以使用“+”拼接字符串,但是这种情况很容易有SQL注入危险。
另一种解决方法使用“?”替代符,然后再传入参数。现在的项目使用JPA,但是解决带有left join联合查询时很复杂,在这里使用jdbcTemplate解决。
具体代码如下:
@Repository
public class PrivilegeJdbcDaoImpl implements PrivilegeJdbcDao {
@Autowired
private JdbcTemplate jdbcTemplate;
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
@Override
public List getPrivilegesByRole(String[] osDomins) {
namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());
MapSqlParameterSource parameterSource = new MapSqlParameterSource();
List osDomains1= Arrays.asList(osDomins);
parameterSource.addValue("osDomains", osDomains1);
String sql = "select p.mapping_type type,p.obj_id objId,p.os_domain domain,p.scene scene,m.user_id userId from fd_privilege p left join fd_user_role_mapping m on p.obj_id=m.role_id where p.mapping_type='role' and p.os_domain in (:osDomains)";
return namedParameterJdbcTemplate.query(sql,parameterSource, new RowMapper<PrivilegeVo>() {
@Override
public PrivilegeVo mapRow(ResultSet rs, int rowNum) throws SQLException {
PrivilegeVo privilegeVo = new PrivilegeVo();
privilegeVo.setMappingType(rs.getString("type"));
privilegeVo.setObjId(rs.getString("objId"));
privilegeVo.setOsDomain(rs.getString("domain"));
privilegeVo.setScene(rs.getString("scene"));
privilegeVo.setUserId(rs.getString("userId"));
return privilegeVo;
}
});
}
}




