问题:
正常生成的Dao层文件和mapper.xml是这样的(这里我喜欢Dao的命名方式,把UserMapping改为了UserDao。)
结果发现按照官网给出的信息配置后少了红线上的东西
解决方法:
这种情况明显是我们写的配置与数据库对接时检查不了表主键信息,也就是不知道哪一个是 PrimaryKey ???
那是我数据库连接包的版本太低了吗?于是我把springboot提供的连接包注释掉,换成最新 4.3.7的连接包后重新生成文件,发现并没有用 。
这个时候我在其他文章中看到了数据库连接信息中设置 useInfomationSchema = true ,试了一下,确实可以,但是为什么配置了这个属性,MybatisGenerator 插件就可以识别数据库信息了呢?
<!-- 配置数据库连接信息 -->
<jdbcConnection
driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/votesystem?serverTimezone=Asia/Shanghai"
userId="root"
password="">
<!--设置可以获取tables remarks信息-->
<property name="useInformationSchema" value="true"/>
<!--设置可以获取remarks信息-->
<property name="remarks" value="true"/>
</jdbcConnection>
查了一下Mysql官网关于这个参数的解释 https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html
大体意思是 当连接 5.0.7以上的mysql版本时,要用这个 useInformationSchema 来获取 DatabaseMetaData 吗? 默认是 false
那么这个DatabaseMetaData 指的是哪部分数据呢?
参考了官方网站 https://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html
Interface DatabaseMetaData extend Wrapper
有关整个数据库的综合信息。
此接口由驱动程序供应商实现,以便用户了解数据库管理系统(DBMS)的功能以及基于与其一起使用的JDBCTM技术(“JDBC驱动程序”)的驱动程序。
某些DatabaseMetaData方法以ResultSet对象的形式返回信息列表。常规ResultSet方法(如getString和getInt)可用于从这些ResultSet对象中检索数据。如果给定形式的元数据不可用,则将返回空ResultSet。定义为由给定方法的ResultSet对象返回的列之外的其他列可以由JDBC驱动程序供应商定义,并且必须通过其列标签访问。
简单来说 这个接口是在插件访问中可以检索到给定方法的ResultSet对象的列,从而判定其主键,进而生成 ByPrimaryKey
好吧,搞不动了,暂时这么理解吧。