在工作中有一个需求就是动态的对某张表做增删查改,刚开始的思路是直接利用mybatis foreach标签生成,但是在开发过程中遇到一个问题就是必须得${}这种方式接收参数不然会报错(具体什么原因请自行了解不做解释),但是公司提倡尽量不用这种方式(特别是参数),所以强迫症范了就想看看还有没有什么好的办法。结果发现利用SQL语句构建器能够达到比较好的效果,所以就试了一下结果成功了。
用的是mybatis版本3.1.1,mybatis3.2版本以上写法有点不一样
/**
* 新增
*/
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(); 获取上下文,
然后获取到SqlSessionFactory
然后在通过SqlSessionFactory构造SqlSessionTemplate。
接下来xml文件中的写法就比较简单了
<select id="abc" parameterType="java.util.HashMap" resultType="java.util.HashMap">
${sql}
</select>
参考:http://www.mybatis.org/mybatis-3/zh/index.html