专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 动态MyBatis创建表

动态MyBatis创建表

更新时间:2022-03-23 11:00:40 来源:星辉 浏览3719次

1.动态添加表

映射器

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` 时间戳 NULL 
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8 
  </update>

控制器

    @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("创建失败"); 
        }
        返回 JSONUtil。获取JSON(重新映射);
    }

添加属性 statementType="STATEMENT"

同时将sql中因变量的值改为${xxxx},而不是#{xxx}

statementType:STATEMENT(未预编译),PREPARED(预编译)或CALLABLE中的任何一种,告诉你MyBatis单独使用Statement,PreparedStatement或者CallableStatement。默认:准备。这里明显没有预编译,要改成非预编译..

${xxxx}:$直接在sql中生成传入的数据,对于字符串数据,需要手动加引号

2.动态查询数据表

List<User> selectTable(@Param("tableName") String tableName);

项目中 User 表为空,有动态创建的表结构,字段一致

映射文件 *mapper.xml

<select id="selectTable" parameterType="java.lang.String" resultMap="BaseResultMap" statementType="STATEMENT"> 
    select * from ${tableName}
  </选择>

控制器

	@RequestMapping("/selectTable") 
	public String showSelectTable(String tableName){ 
		List<User> objects = userService.selecTable(tableName); 
		System.out.println("user::::"+objects); 
		logger.info("成功"); 
		返回 JSONUtil.getJSON(对象);
	}

#和$符号的区别

#{}代表占位符符号,可以实现preparedStatement给占位符设置值,自动加粗样式java类型和jdbc类型转换。#{}可以有效防止sql注入。#{}可以接受简单类型值或 pojo 属性值。如果 parameterType 传递一个单一的简单类型值,#{} 可以是括号中的 value 或者其他一些名字。

${ } 表示拼接sql strand,通过 ${} 可以是 parameterType 传入的内容在 sql 中拼接出来的 jdbc 类型转换,可以接受简单类型值或者 pojo 属性值,如果 parameterType 传递单个简单类型值,{可以接受简单类型值或者 pojo 属性值,如果 parameterType 传递单个简单类型值,可以接受简单类型值或者 pojo 属性值,如果 parameterType 传递单个简单类型值,{} 只能是括号内的值.

注意:关于 order by 下面的排序规则,表名等数据库对象名,如果要传入,还应该使用${……}

3.动态表数据添加

int insertTable(@Param("user")User user,@Param("tableName") String tableName);
insertTable() 方法中有两个参数,一个参数是 tabelName ,另一个参数是 User object ,因此 <insert> 标签中不能有...的参数Type参数,而是使用@Param(“”)来修饰,注意,
@Param 是 import org.apache.ibatis.annotations.Param;,不要误导包。

映射器.xml

  <insert id="insertTable" >
  插入 ${tableName}(名称、密码、create_time)
  值(#{user.name}、#{user.password}、#{user.createTime})
  </插入>

控制器实现方法

@RequestMapping("/addTable") 
	@ResponseBody 
	public String addTable( String name,String password,String tableName){ 
		Map<String, Object> reMap = new HashMap<String, Object>(); 
		用户用户=新用户();
		user.setName(name); 
		user.setPassword(密码); 
		user.setCreateTime(new Date()); 
		System.out.println("传入用户参数"+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); 
			重新映射.put("
		}
		返回 JSONUtil.getJSON(reMap);
	}

通过以上介绍相信大家对动态MyBatis创建表的方法已经有所了解,大家如果对此比较感兴趣,想了解更多相关知识,不妨来关注一下星辉的Mybatis-Plus视频教程,里面的课程内容由浅到深,通俗易懂,适合没有基础的小伙伴学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>