MyBatis動態(tài)創(chuàng)建表的實例代碼
項目中業(yè)務需求的不同,有時候我們需要動態(tài)操作數據表(如:動態(tài)建表、操作表字段等)。常見的我們會把日志、設備實時位置信息等存入數據表,并且以一定時間段生成一個表來存儲,log_201806、log_201807等。在這里我們用MyBatis實現(xiàn),會用到動態(tài)SQL。
動態(tài)SQL是Mybatis的強大特性之一,MyBatis在對sql語句進行預編譯之前,會對sql進行動態(tài)解析,解析為一個BoundSql對象,也是在此對動態(tài)sql進行處理。
在動態(tài)sql解析過程中,#{ }與${ }的效果是不一樣的:
#{ } 解析為一個JDBC預編譯語句(prepared statement)的參數標記符。
如以下sql語句:
select * from user where name = #{name};
會被解析為:
select * from user where name = ?;
可以看到#{ }被解析為一個參數占位符 ? 。
${ } 僅僅為一個純粹的String替換,在動態(tài)SQL解析階段將會進行變量替換。
如以下sql語句:
select * from user where name = ${name};
當我們傳遞參數“joanna”時,sql會解析為:
select * from user where name = “joanna”;
可以看到預編譯之前的sql語句已經不包含變量name了。
綜上所述,${ }的變量的替換階段是在動態(tài)SQL解析階段,而#{ } 的變量的替換是在DBMS中。
下面實現(xiàn)MyBatis動態(tài)創(chuàng)建表,判斷表是否存在,刪除表功能。
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.java
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);
}
總結
以上所述是小編給大家介紹的MyBatis動態(tài)創(chuàng)建表的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
相關文章
Java線程安全問題小結_動力節(jié)點Java學院整理
這篇文章主要介紹了Java線程安全問題小結的相關資料,需要的朋友可以參考下2017-05-05
java使用listIterator逆序arraylist示例分享
對于列表而言,除了Iterator,還提供了一個功能更加強大的ListIterator。它可以實現(xiàn)逆序遍歷列表中的元素。本示例將使用其逆序遍歷ArrayList2014-02-02
詳解Java創(chuàng)建多線程的四種方式以及優(yōu)缺點
這篇文章主要介紹了Java創(chuàng)建多線程的四種方式以及優(yōu)缺點,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
java HttpURLConnection 發(fā)送文件和字符串信息
這篇文章主要介紹了java HttpURLConnection 發(fā)送文件和字符串信息的相關資料,需要的朋友可以參考下2017-06-06
出現(xiàn)java.lang.NoSuchMethodException異常的解決(靠譜)
這篇文章主要介紹了出現(xiàn)java.lang.NoSuchMethodException異常的解決方案(靠譜),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

