【mybatis】利用动态语句动态创建表和列

本文介绍如何使用MyBatis通过XML映射文件及接口定义来动态创建数据库表,并提供了实现的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的

为了动态从数据库中生成表以及定义属性

步骤

创建新的xml文件以及mapper接口类

TabelControllerMapper.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="com.me.mapper.TableControllerMapper">  


	<update id="createNewTable">  
		CREATE TABLE ${myMap.theTableName}(  
			id int(10) PRIMARY KEY AUTO_INCREMENT NOT NULL  
			<foreach collection="myMap" index="key" item="value">  
				<if test="key.toString() != 'theTableName'.toString()">  
					,${key} ${value}  
				</if>  
			</foreach>  );  
	</update>  
</mapper>

注意第一句定义id后面不加逗号,在foreach循环里前面加上逗号是为了语句最后一次执行后面没有逗号,否则会报错


TableControllerMapper接口

package com.me.mapper;  

import org.apache.ibatis.annotations.Mapper;  
import org.apache.ibatis.annotations.Param;  

import java.util.HashMap;  

/**  
 * @author fenghere  
 */@Mapper  
	public interface TableControllerMapper {  
    /**  
     * fetch data by rule id * * @param map mymap  
     * @return Result<XxxxDO>  
     */  

  void createNewTable(@Param(value = "myMap") HashMap map);  
}

输入的参数为hashmap类型,关于这种引入参数的方法另一篇博客有写

http://xfff.xyz/2019/01/07/Mybatis%E4%BC%A0%E5%8F%82%E6%96%B9%E6%B3%95/


测试

写一个测试类

package com.me.demo;  

import com.me.beans.User;  
import com.me.mapper.TableControllerMapper;  
import com.me.mapper.UserMapper;  
import com.me.security.Md5Utils;  
import com.me.service.UserService;  
import org.junit.Test;  
import org.springframework.beans.factory.annotation.Autowired;  

import java.io.UnsupportedEncodingException;  
import java.security.NoSuchAlgorithmException;  
import java.util.HashMap;  

/**  
 * @ClassName MyTest  
 * @Description TODO  
 * @Author xufeng  
 * @Data 2019/2/22 13:46  
 * @Version 1.0  
 **/
 public class MyTest extends DemoApplicationTests{  


  @Autowired  
  TableControllerMapper tableControllerMapper;  

  @Test  
  public void myTest(){  
          HashMap<String,String> mymap = new HashMap<>();  
          mymap.put("theTableName","dsafakshfdksahlfhdashdfh");  
          mymap.put("text","text");  
          mymap.put("username","varchar(10)");  
          mymap.put("ididiid","int");  
          tableControllerMapper.createNewTable(mymap);  

  }  
}

MyTest类继承DemoApplicationTests是为了引入springboot项目的数据库和mapper配置

执行完成,进入数据库查看

如下

在这里插入图片描述
在这里插入图片描述


另外,删除表等操作应为类似的操作.

<select id="existTable" parameterType="java.lang.String" resultType="java.lang.Integer">
    select count(*)
    from information_schema.TABLES
    where LCASE(table_name) = #{tableName}
</select>


<update id="dropTable">
    DROP TABLE ${tablename}
</update>
### MyBatis 动态 SQL 语法示例 #### 使用 `<if>` 标签构条件查询 `<if>` 标签用于根据特定条件决定是否包含某部分 SQL 语句。这使得可以根据不同的输入参数动态调整查询逻辑。 ```xml <select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </if> </select> ``` 此代码片段展示了如何仅当 `title` 参数不为空时才将其加入到查询条件中[^1]。 #### 利用 OGNL 达式增强灵活性 MyBatis 支持使用 OGNL(对象图导航语言)作为其达式的引擎,允许更复杂的条件判断数据操作。OGNL 能够访问并修改 Java 对象中的属性,执行方法调用等复杂行为。 例如,在 XML 映射文件中可以通过如下方式设置查询条件: ```xml <where> <if test="author.name != null and author.name != '' "> AND author_name = #{author.name} </if> </where> ``` 这里利用了 OGNL 来检查作者的名字是否存在以及非空字符串的情况[^2]。 #### 定义可重用的 SQL 片段 为了提高代码复用性维护性,可以定义公共使用的 SQL 片断并通过 `<include>` 标签引入这些片断。 ```xml <!-- 定义 --> <sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql> <!-- 引入 --> <select id="selectUsers" parameterType="map" resultMap="userResultMap"> SELECT <include refid="userColumns"><property name="alias" value="t"/></include>, FROM some_table t </select> ``` 上述例子说明了怎样创一个名为 `userColumns` 的 SQL 片段,并在另一个查询中引用它以简化重复代码[^3]。 #### 实际应用案例:基于多个字段过滤员工 下面是一个完整的测试函数实例,展示了一个简单的多条件筛选场景下的实现方法。 ```java @Test public void testList(){ List<Emp> empList = empMapper.list(null, (short) 1, null, null); System.out.println(empList); } ``` 这段代码示了一次针对数据库 EMP 进行的选择操作,其中可能涉及到了多种不同类型的过滤条件[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值