项目中须要根据不一样的表名和列名生成不一样的select语句,我想ibatis这里也应该是用预编译的形式存储???? java
不太了解具体原理,反正我知道在用oci库的时候,是能够的;用sprinf("sql","xx","xx"),一下,就能够了。oci库确定是用预编译的形式干的! sql
因而,我上网查了查,感受相似的问题有,可没给出一个完整的例子。想了一想,既然你能动态传入map,map里面存储了相应的查询值,那你 app
ibatis确定也能传入其余元数据信息吧。测试了一下,能够!OK,搞定了:) 测试
很少说了,代码以下 spa
- Java code :
- // just a releation to the table stored in db
- public class Test {
- public String name;
- public Timestamp date;
- public int id;
- }
- public class TestInsert {
- // logger class you can replace it to System.out.println
- static Log logger = LogFactory.getLog(TestInsert.class);
-
- public static void main(String[] args) {
- /*
- * Test test = new Test(); test.date = new
- * Timestamp(System.currentTimeMillis()); test.name = "fffff"; try {
- * long num = (Long) EntityManager.getSqlMapper().insertArgs(
- * "insertOperation", "fffff", new
- * Timestamp(System.currentTimeMillis())); logger.info("ID is " + num);
- * } catch (SQLException e) { e.printStackTrace(); }
- */
- // try the dynamic table dealation
- HashMap<String, Object> map = new HashMap<String, Object>();
- // set the query value
- map.put("ID", "dizhuang");
- // set the col1 to be selected
- map.put("col1", "*");
- // set the table name
- map.put("tablePrefix", "testsocevent");
- // set the col name which you use
- map.put("col2", "NAME");
- // map.put("ID", 1000);
- // map.put("id", "1005");
- try {
- // why args is error?
- Test test = (Test) EntityManager.getSqlMapper().queryForObject(
- "getTest", map);
- logger.info("id : " + test.id);
- logger.info("time :" + test.date);
- logger.info("name : " + test.name);
- } catch (SQLException e) {
- logger.error(e.getMessage(), e);
- // e.printStackTrace();
- }
- }
-
- // ibatis sql
- <select id="getTest" parameterClass="java.util.HashMap"
- resultClass="com.neusoft.soc.eventcenter.test.Test"
- remapResults="true">
- SELECT
- $col1$
- FROM
- $tablePrefix$
- WHERE
- $col2$ = #ID#
- </select>