MyBatis动态创建表格,并且复制数据
一 业务要求
老师交代任务,数据库有一张表,现在需要前端页面在条件搜索下得到的数据,保存在另一张表中,这表是动态生成的,但是新表的结构和源表结构一样,项目框架使用的MyBatis,这里面有两个操作:
- 动态生成表
- 复制条件查询的数据到新表中
- 检验新表生成是否重复
二 代码实现
1.通过MyBatis插件生成DAO层,XML,POJO类
2.检验该动态是否存在,如果存在,会删除,重新建的
<select id="isTableExist" parameterType="java.lang.String" resultType="java.lang.Integer">
select count(*) from information_schema.TABLES where table_name = #{tableName}
</select>
3.动态生成表格
<update id="addNewTable">
create table ${tableName} like t_imsirpt;
</update>
4.复制数据
<insert id="copyOf" parameterType="com.nkr.ndp.dao.bean.TImsirpt">
insert into ${tableName}
select * from t_imsirpt i
where 1=1
<if test="devices !=null and devices.length > 0">
and devid in
<foreach collection="devices" item="item" index="index"
open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test=" imsi!=null and imsi!=0L">
and imsi like "%"#{imsi}"%"
</if>
<if test=" isdn!=null and isdn!='' ">
and isdn like "%"#{isdn}"%"
</if>
<if test="beginTime !=null ">
<![CDATA[ and time >= #{beginTime} ]]>
</if>
<if test="endTime !=null ">
<![CDATA[ and time < #{endTime} ]]>
</if>
</insert>
5.DAO层接口
int isTableExist(@Param("tableName") String tableName);
int addNewTable(@Param("tableName") String tableName);
int copyOf(@Param("tableName") String tableName,
@Param("devices") String[] devices,
@Param("beginTime") Date beginTime,
@Param("endTime") Date endTime,
@Param("imsi") Long imsi,
@Param("isdn") String isdn);
总结
1.这只是应对两个不同表但是数据结构是一样,其实不一样,原理也是一样 2.数据量过大的时候,建议合并添加和复制两个语句,可提高效率,但是校验一层就不存在了 3.表明不能重复,一旦重复,上次查询的结果就会被覆盖
|