MyBatis动态创建表的实例代码
项目中业务需求的不同,有时候我们需要动态操作数据表(如:动态建表、操作表字段等)。常见的我们会把日志、设备实时位置信息等存入数据表,并且以一定时间段生成一个表来存储,log_201806、log_201807等。在这里我们用MyBatis实现,会用到动态SQL。
动态SQL是Mybatis的强大特性之一,MyBatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此对动态sql进行处理。
在动态sql解析过程中,#{}与${}的效果是不一样的:
#{}解析为一个JDBC预编译语句(preparedstatement)的参数标记符。
如以下sql语句:
select*fromuserwherename=#{name};
会被解析为:
select*fromuserwherename=?;
可以看到#{}被解析为一个参数占位符?。
${}仅仅为一个纯粹的String替换,在动态SQL解析阶段将会进行变量替换。
如以下sql语句:
select*fromuserwherename=${name};
当我们传递参数“joanna”时,sql会解析为:
select*fromuserwherename=“joanna”;
可以看到预编译之前的sql语句已经不包含变量name了。
综上所述,${}的变量的替换阶段是在动态SQL解析阶段,而#{}的变量的替换是在DBMS中。
下面实现MyBatis动态创建表,判断表是否存在,删除表功能。
Mapper.xml
selectcount(*) frominformation_schema.TABLES whereLCASE(table_name)=#{tableName} DROPTABLEIFEXISTS${tableName} CREATETABLE${tableName}( idbigint(20)NOTNULLAUTO_INCREMENT, entityIdbigint(20)NOTNULL, dxdoubleNOTNULL, dydoubleNOTNULL, dzdoubleNOTNULL, ntypevarchar(32)NOTNULL, gnssTimebigint(20)NOTNULL, speedfloatDEFAULTNULL, directionfloatDEFAULTNULL, attributesvarchar(255)DEFAULTNULL, PRIMARYKEY(id)) insertinto${tableName} (entityId,dx,dy,dz,ntype,gnssTime,speed,direction,attributes) values (#{trackpoint.entityid}, #{trackpoint.dx}, #{trackpoint.dy}, #{trackpoint.dz}, #{trackpoint.ntype}, #{trackpoint.gnsstime}, #{trackpoint.speed}, #{trackpoint.direction}, #{trackpoint.attributes})
Mapper.java
packagexx.xxx.xx.mapper;
importorg.apache.ibatis.annotations.Param; importxx.xxx.xx.po.Trackpoint; publicinterfaceOperateTableMapper{ intexistTable(StringtableName); intdropTable(@Param("tableName")StringtableName); intcreateNewTable(@Param("tableName")StringtableName); intinsert(@Param("tableName")StringtableName,@Param("trackpoint")Trackpointtrackpoint); }
总结
以上所述是小编给大家介绍的MyBatis动态创建表的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!