在工做中有一个需求就是动态的对某张表作增删查改,刚开始的思路是直接利用mybatis foreach标签生成,可是在开发过程当中遇到一个问题就是必须得${}这种方式接收参数否则会报错(具体什么缘由请自行了解不作解释),可是公司提倡尽可能不用这种方式(特别是参数),因此强迫症范了就想看看还有没有什么好的办法。结果发现利用SQL语句构建器可以达到比较好的效果,因此就试了一下结果成功了。html
用的是mybatis版本3.1.1,mybatis3.2版本以上写法有点不同java
/** * 新增 */ SqlBuilder.BEGIN(); String sequence = BaseUtil.getEuiSeq("SEQ_QC_POLICY", ""); SqlBuilder.INSERT_INTO("T_QC_POLICY"); SqlBuilder.VALUES("QC_POLICY_SNO", "#{id}"); SqlBuilder.VALUES("QC_POLICY_NAME", "#{name}"); Map<String,Object> values =new HashMap<>(); values.put("sql", SqlBuilder.SQL()); values.put("id", sequence); values.put("name", "zhangsan"); /* 查询 SqlBuilder.SELECT("*"); SqlBuilder.FROM("T_QC_TASK"); SqlBuilder.WHERE("TASK_SNO=#{id}"); Map<String,Object> values =new HashMap<>(); values.put("sql", SqlBuilder.SQL()); values.put("id", 879347); */ WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); /* 此段代码能够忽略 String[] names = wac.getBeanDefinitionNames(); for(int i=0; i<names.length; i++){ System.out.println("---"+names[i]); }*/ SqlSessionFactory sf = (SqlSessionFactory)wac.getBean("sqlSessionFactory0"); SqlSessionTemplate sessionTemplate = new SqlSessionTemplate(sf); sessionTemplate.insert("abc", values);
因为项目种进行了封装因此没办法用spring注解生成SlqSessionTemplate对象,因此只能经过WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); 获取上下文,spring
而后获取到SqlSessionFactorysql
而后在经过SqlSessionFactory构造SqlSessionTemplate。session
接下来xml文件中的写法就比较简单了mybatis
<select id="abc" parameterType="java.util.HashMap" resultType="java.util.HashMap"> ${sql} </select>
参考:http://www.mybatis.org/mybatis-3/zh/index.htmlui