因为项目中需要做一些操作,比如动态在数据库中创建表,动态给数据库添加字段等等;
当时网上找了很多资料没看懂,后来看了一篇文章总算来了灵感,但没保存链接,所以一时没法贴出来。
毕竟自己在做的过程中遇到了很多坎坷,所以就自己整理一下了。
---------------------------------- 割背景 -------------------------------------------
其实MyBatis是可以支持原生的SQL的,而且不需要做什么额外的操作,比如我们要新增一条记录的时候,我们是:
<insert id="saveTableColumn" > insert into table_column (id,table_id,column_label,column_code) values (#{id},#{table_id},#{column_label},#{column_code}) insert>
这种方式是我们常用的MyBatis新增记录的方式,如果我想给某张表添加一个字段的话,语句是:
alter table 表名 add column 字段名 + 字段类型等等……
同样地,在MyBatis中,我们也可以写成这样:
<insert id="addColumn" parameterType="java.util.Map"> alter table ${table} add column ${column} ${type} ; insert>
注意这里是使用的是${},而不是上面的#{},而且多了一个
parameterType="java.util.Map"
这是因为如果我们使用#{}的时候,MyBatis会自动帮我们把我们的字段自动加上单引号'',使用${}的时候就不会。
使用Map传参,MyBatis可以直接根据你的key取值。
在DAO中,我们写个对应的方法名就可以了
public int addColumn(Map map);
那么在其他地方调用这个的时候,只需要直接往Map中put值就行。
map.put("table",操作的表名); map.put("column",字段名称); // 调用设置字段类型的方法 map.put("type",拼接字段类型);
我的字段类型是使用了一个方法,根据需要拼接为字符串即可,方法里面有项目资料,这里就不贴出来了。
执行增加字段的方法,可以看到输出的信息:
我的语句里字段类型给错了,大家不要介意,先实现,再优化哈!
补充:
利用上面的方法,如果想要完全地自定义SQL也是没有问题的,直接把你的语句写在${}里面就行了,比如
<insert id="addColumn" parameterType="java.util.Map"> ${sql}; insert>
当然,如果要返回指定的类型,如结果集等,就在上面那里加上resultType="返回类型"就可以了。
另外就是,Mapper中的方法不一定是要