在网上查了很多,都说Mybatis不支持动态建表,心凉了一节。还好找到这么一篇,找到了希望:http://www.zzzyk.com/show/ec5660d9cf1071b3.htm
经过在mysql环境下验证,确实可用,不知道其他数据库是否支持,如下:
Mapper.xml
<update id="createNewTable">
create table `${realTableName}`(
`id` int(11) NOT NULL AUTO_INCREMENT,
<foreach collection="newColumns" index="index" item="item">
`${item.columnName}` varchar(1000) COMMENT #{item.columnComment},
</foreach>
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT #{tableComment};
</update>
需要注意的是:
1. 表名和列名都不能使用正常的#{},系统会报错。还好iBatis提供一个方法:用${}保证原样输出。
2. 而且,表名和列名两边的引号不能少
3. COMMENT可以正常使用#{},而且不需要引号
4. 另外,传递参数支持对象列表,很强大,学习了,呵呵。
Dao.java
void createNewTable(@Param("realTableName") String realTableName, @Param("newColumns") List<TitleName> newColumns, @Param("tableName") String tableComment);
注:这里使用了之前的一篇文章:Mybatis传多个参数(三种解决方案),使用的是第三种方案。
Service.java
public void createNewTable(String realTableName, List<TitleName> newColumns, String tableComment);
Test.java
List<ColumnName> newColumns = new ArrayList< ColumnName >();
newColumns.add(new ColumnName("col_1", "第1列"));
newColumns.add(new ColumnName("col_2", "第2列"));
newColumns.add(new ColumnName("col_3", "第3列"));
service.createNewTable("test_new_table", newColumns, "测试动态建表");
ColumnName.java
private String columnName;
private String columnComment;
如果还有其他方法,欢迎交流指教,:)