mybatis自动生成java代码
-
背景
首先为何需要使用java代码来代替xml?主要是某某号称扫描安全软件扫描到xml里面带有$符号就认为存在sql注入风险,但其实使用工具生成的xml是不存在sql注入风险,比如order by ${XXX}, from xxxx_$(date)等,所以通过这些例子就可以看出,这款扫描安全软件有点不友好,但客户不接受,比较信任花费了87万的软件,所以只能使用java代码来代替xml。
-
手动通过java写sql
2.1 简单sql直接注解在mapper接口上即可,比如:/** *直接写sql **/ @Select({ "select", "`XXX_id`", "from XXX_info", "where `ou_id` = #{Id,jdbcType=VARCHAR}" }) @Results({@Result(column = "XXX_id", property = "XXXId", jdbcType = JdbcType.VARCHAR)}) List<String> getXXX(String Id);
2.1 复杂的sql
复杂的sql就需要自己提供一个拼接函数了,稍微需要注意的地方就是提供的拼接函数的参数也需要加上@Param注解,否则会报arg0参数不存在,这个主要是在mybatis的版本3.4.6之后就需要这么干了,具体实例如下:
Mapper:@SelectProvider(type = SqlProvider.class, method = "getQueryingXXX") @Results({@Result(column = "XXX_id", property = "XXXId", jdbcType = JdbcType.VARCHAR)}) List<String> getQueryingXXX(@Param("searchValue") String searchValue, @Param("owner") String owner, @Param("id") String id);
SqlProvider:
public String getQueryingXXX(@Param("searchValue") String searchValue, @Param("owner") String owner, @Param("id") String id) { SQL sql = new SQL(); sql.SELECT("XXX_id"); sql.FROM("XXXXX"); final StringBuffer condition = new StringBuffer(); condition.append(String.format("`id`=#{id} ")); if(searchValue != null && searchValue.length()>0){ condition.append(String.format(" AND ( " + " `pipeline_id` LIKE CONCAT('%%', #{searchValue}, '%%') OR " + " `pipeline_name` LIKE CONCAT('%%', #{searchValue}, '%%')" + " ) ")); } if(owner != null && owner.length()>0){ condition.append(String.format(" AND (owner = #{owner})")); } sql.WHERE(condition.toString()); return sql.toString(); }
3.自动生成java代码的脚本
javaClientGenerator type="XMLMAPPER" 改成 javaClientGenerator type="ANNOTATEDMAPPER"