今天做mybatis配置文件,希望通过mybatis方法获得指定表的元数据,在mysql下,使用语句
show columns from user
这样类似的语句,由于表名需要通过参数获取,所以我就写了这么一个配置文件:
<?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.wjx.lab.spring.commcrud.dao.CommMapper">
<select id="getUserTableColumns" parameterType="java.lang.String" resultType="map">
show columns from #{tableName}
</select>
</mapper>
结果呢,就是在执行这个的时候报错。根据日志可以看到这样的字:“show columns from ?”。
现在想来也是经验不足,这个问题当不传递变量,写死语句“show columns from user”时候完全没有问题,当传递参数就出错,应该是参数错了。
最后找到,确实参数错了,因为定义参数类型是String,所有mybatis会替换最终执行的语句是“show columns from ‘user’ ”。这里多了一个引号。
最终没有太好的办法解决,不想改动太大,利用mysql数据库的特点,将这个语句改为了查询information_schema数据库表,也可以达到同样的效果。同时由于那个是标准的sql语句,参数替换完全没有问题。
最终配置文件为:
<?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.wjx.lab.spring.commcrud.dao.CommMapper">
<select id="getUserTableColumns" parameterType="java.lang.String" resultType="map">
SELECT
*
FROM
information_schema.COLUMNS
WHERE
TABLE_SCHEMA = #{tableSchema}
AND
TABLE_NAME = #{tabName}
</select>
</mapper>