mybatis自动生成java代码

mybatis自动生成java代码

  1. 背景

    首先为何需要使用java代码来代替xml?主要是某某号称扫描安全软件扫描到xml里面带有$符号就认为存在sql注入风险,但其实使用工具生成的xml是不存在sql注入风险,比如order by ${XXX}, from xxxx_$(date)等,所以通过这些例子就可以看出,这款扫描安全软件有点不友好,但客户不接受,比较信任花费了87万的软件,所以只能使用java代码来代替xml。

  2. 手动通过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"
上一篇:查看用户使用了哪些表空间


下一篇:一键获取数据库整体信息脚本