轉載請註明出處:http://www.javashuo.com/article/p-ukskkogo-w.html html
項目中業務需求的不一樣,有時候咱們須要動態操做數據表(如:動態建表、操做表字段等)。常見的咱們會把日誌、設備實時位置信息等存入數據表,而且以必定時間段生成一個表來存儲,log_20180六、log_201807等。在這裏咱們用MyBatis實現,會用到動態SQL。java
動態SQL是Mybatis的強大特性之一,MyBatis在對sql語句進行預編譯以前,會對sql進行動態解析,解析爲一個BoundSql對象,也是在此對動態sql進行處理。sql
在動態sql解析過程當中,#{ }與${ }的效果是不同的:apache
#{ } 解析爲一個JDBC預編譯語句(prepared statement)的參數標記符。 如如下sql語句: select * from user where name = #{name}; 會被解析爲: select * from user where name = ?;
能夠看到#{ }被解析爲一個參數佔位符 ? 。微信
${ } 僅僅爲一個純粹的String替換,在動態SQL解析階段將會進行變量替換。 如如下sql語句: select * from user where name = ${name};
當咱們傳遞參數「joanna」時,sql會解析爲: select * from user where name = 「joanna」;
能夠看到預編譯以前的sql語句已經不包含變量name了。mybatis
綜上所述,${ }的變量的替換階段是在動態SQL解析階段,而#{ } 的變量的替換是在DBMS中。app
下面實現MyBatis動態建立表,判斷表是否存在,刪除表功能。spa
Mapper.xml日誌
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="xx.xxx.xx.mapper.OperateTableMapper" > <select id="existTable" parameterType="String" resultType="Integer"> select count(*) from information_schema.TABLES where LCASE(table_name)=#{tableName} </select> <update id="dropTable"> DROP TABLE IF EXISTS ${tableName} </update> <update id="createNewTable" parameterType="String"> CREATE TABLE ${tableName} ( id bigint(20) NOT NULL AUTO_INCREMENT, entityId bigint(20) NOT NULL, dx double NOT NULL, dy double NOT NULL, dz double NOT NULL, ntype varchar(32) NOT NULL, gnssTime bigint(20) NOT NULL, speed float DEFAULT NULL, direction float DEFAULT NULL, attributes varchar(255) DEFAULT NULL, PRIMARY KEY (id)) </update> <insert id="insert" parameterType="xx.xxx.xx.po.Trackpoint"> insert into ${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}) </insert> </mapper>
Mapper.javacode
package xx.xxx.xx.mapper; import org.apache.ibatis.annotations.Param; import xx.xxx.xx.po.Trackpoint; public interface OperateTableMapper { int existTable(String tableName); int dropTable(@Param("tableName")String tableName); int createNewTable(@Param("tableName")String tableName); int insert(@Param("tableName")String tableName,@Param("trackpoint")Trackpoint trackpoint); }
若是此文對您有幫助,微信打賞我一下吧~