Mybatis可以通过在xml里面增加update来执行DDL,所以,我们在TaUserMapper.xml里面增加:
<update id="createTempTable" > create temp table ${pvsTb} as select fa_login, fa_name, fa_status, fa_type, fa_create_by, fa_create_dt, fa_update_by, fa_update_dt, fa_email, fa_passwd, fa_remark, fa_staff_id, fa_last_notify from ta_user order by fa_login limit 10; </update> <update id="dropTable" > drop table if exists ${pvsTb} </update> <select id="selectFromTmpTable" resultType="java.util.HashMap"> select * from ${pvsTb} where fa_login=#{pvsLogin} </select>
修改TaUserMapper接口,增加相应的接口方法, 用param注解的方式指定与xml一致的变量:
void createTempTable(@Param("pvsTb")String pvsTb); void dropTable(@Param("pvsTb") String pvsTb); Map<String,Object> selectFromTmpTable(@Param("pvsTb") String pvsTb,@Param("pvsLogin") String pvsLogin);
请注意有的地方用$,有的地方用#, $是直接替换, #是参考占位, ..... 如果$代入的是来往客户端的参数会有SQL注入风险.
JUnit测试, 先建立临时表tmp_1,再从这个临时表中查询caigou1的记录, 然后删除临时表:
@Test public void testDynamicSql1(){ final String c_tmpTb="tmp_1"; SqlSession lvSess=MybatisUtils.getSession(); try { TaUserMapper lvUserMapper=lvSess.getMapper(TaUserMapper.class); lvUserMapper.createTempTable(c_tmpTb); Map<String,Object> lvMap= lvUserMapper.selectFromTmpTable(c_tmpTb,"caigou1"); System.out.println(lvMap); lvUserMapper.dropTable(c_tmpTb); } finally{ MybatisUtils.closeSession(lvSess); } }