1. 程式人生 > >mybatis 動態新增表,查看錶,新增資料

mybatis 動態新增表,查看錶,新增資料

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);
		
	}