mybatis 動態新增表,查看錶,新增資料
阿新 • • 發佈:2018-12-01
1.動態新增表
mapper
int dropExistTable(@Param("tableName") String tableName);//自動建立資料表
對映檔案
<update id="dropExistTable" parameterType="string" statementType="STATEMENT">
CREATE TABLE ${tableName} (
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` varchar(100) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
`create_time` timestamp NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 </update>
controller
@RequestMapping("/createtable")
@ResponseBody
public String createTable( String tableName){
Map<String, Object> reMap = new HashMap<String, Object>();
int res = userService.dropExistTable(tableName);
if (res == 0) {
reMap.put("code",1); reMap.put("msg","建立成功"); logger.info("'tableNameString'+建立成功"); }else{ reMap.put("code",-1); reMap.put("msg","建立失敗"); logger.info("建立失敗"); } return JSONUtil.getJSON(reMap); }
- 新增屬性statementType="STATEMENT"
- 同時sql裡的屬有變數取值都改成${xxxx},而不是#{xxx}
-
statementType:STATEMENT(非預編譯),PREPARED(預編譯)或CALLABLE中的任意一個,這就告訴 MyBatis 分別使用Statement,PreparedStatement或者CallableStatement。預設:PREPARED。這裡顯然不能使用預編譯,要改成非預編譯。。
- ${xxxx}:$將傳入的資料直接顯示生成在sql中,對於字串資料,需要手動加上引號
2.動態查詢資料表
List<User> selecTable(@Param("tableName") String tableName);
專案中User表是個空表,裡面跟動態建立的表結構,欄位一致
對映檔案 *mapper.xml
<select id="selecTable" parameterType="java.lang.String" resultMap="BaseResultMap" statementType="STATEMENT"> select * from ${tableName} </select>
controller
@RequestMapping("/selecTable") public String showSelecTable(String tableName){ List<User> objects = userService.selecTable(tableName); System.out.println("user::::"+objects); logger.info("成功"); return JSONUtil.getJSON(objects); }
#和$符號的區別
#{ }表示一個佔位符號, 可以實現preparedStatement向佔位符中設定值,自動加粗樣式進行java型別和jdbc型別轉換。#{}可以有效防止sql注入。#{}可以接收簡單型別值或pojo屬性值。 如果parameterType傳輸單個簡單型別值,#{}括號中可以是value或其它名稱。
$ { } 表示拼接sql串,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc型別轉換, 可以接收簡單型別值或pojo屬性值,如果parameterType傳輸單個簡單型別值, {}可以接收簡單型別值或pojo屬性值,如果parameterType傳輸單個簡單型別值,可以接收簡單型別值或pojo屬性值,如果parameterType傳輸單個簡單型別值,{}括號中只能是value。
注意:對於order by 後面的排序規則,表名等資料庫物件名,如果要傳入,也應該使用${……}
3.動態表資料新增
int insertTable(@Param("user")User user,@Param("tableName") String tableName);
insertTable() 方法中是兩個引數,一個引數是tabelName , 另一個引數 是User物件, 所以<insert > 標籤中不能有parameterType 引數, 而是使用 @Param(“”) 進行修飾, 使用的時候要注意,
@Param 是 import org.apache.ibatis.annotations.Param;, 不要導錯包了。
mapper.xml
<insert id="insertTable" > insert into ${tableName} ( name, password, create_time) values (#{user.name}, #{user.password}, #{user.createTime}) </insert>
controller實現方法
@RequestMapping("/addTable") @ResponseBody public String addTable( String name,String password,String tableName){ Map<String, Object> reMap = new HashMap<String, Object>(); User user= new User(); user.setName(name); user.setPassword(password); user.setCreateTime(new Date()); System.out.println("傳入的user引數"+user); int res = userService.insertTable(user,tableName); if (res > 0) { reMap.put("code",1); reMap.put("msg","成功"); logger.info("'tableNameString'+成功"); }else{ reMap.put("code",-1); reMap.put("msg","失敗"); logger.info("失敗"); } return JSONUtil.getJSON(reMap); }