mybatics细节问题
最近在学习基于springboot的SSM项目的后台程序,期间遇到很多问题,也解决很多问题,简单介绍下。
1 mybatics genatator
对于 mybatics genatator是mybatics为了简化工作量,根据数据库表自动映射出mapper.xml文件,POJO实体类和DAO层类,减少了很多工作量。介绍mybatics genatator的使用文章很多。这里介绍一个介绍很详细的博客地址:https://blog.csdn.net/testcs_dn/article/details/79295065
构建步骤有很多需要注意的地方:
- 大多数项目使用很主流的版本管理器maven构建,网上很多介绍在引入mybatics genatator时候,写的不全。具体POM的插件项配置如下:
<!--mybatis逆向生產-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<configurationFile>src/main/resources/Mybatics/GenerateConfig</configurationFile>
<overwrite>true</overwrite> <!--是否在运行时候重写POJO和配置文件-->
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version> <!--即使在上面的依赖已经添加了mysql-connector-java
也必须再次添加,而且必须加版本号,版本号去包里找-->
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version> <!--核心依赖库,最好添加上,注意版本对应-->
</dependency>
</dependencies>
</plugin>
- 接着就是配置GenerateConfig.xml,这里面的配置项很多,每个属性的详解见以上的链接。它分为总体配置和对每个表的单独配置。总体配置如下:
<generatorConfiguration>
<context id="Mysql" defaultModelType="flat">
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="false"/>
</commentGenerator>
<!--数据库连接驱动类,URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"
userId="用户"
password="密码">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成(实体)模型的包名和位置-->
<javaModelGenerator targetPackage="oil.oil_test.POJO" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成XML映射文件的包名和位置-->
<sqlMapGenerator targetPackage="Mybatics.Mapper" targetProject="src\main\resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO接口的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="oil.oil_test.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
- 对于表的配置。最好按照小编的配置,tableName是列名,domainObjectName是根据该表生成的实体的名称。很多false选项是指把自动生成的SQL语言给除去掉(写的乱,不如自己写)。useActualColumnNames是指按照数据每张表里的列名,生成实体类里的属性名,详细解释见链接里。
<table tableName="apply_table" domainObjectName="Apply"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false" enableInsert="false">
<property name="useActualColumnNames" value="true"/>
</table>
小编就是在这里遇到的问题,遇到了数据库表生成的实体对应属性不对,莫名其妙多了一些属性,有一些实体就少了一些属性。估计是mybatics genatator映射到其他表去了,但是原因一直找不到。摸索很久,找到解决办法:1.建立数据库的时候,表名后面加些后缀(例如:_table)等等,如果把用户表直接写user,很可能出错,因为我看后台仿佛mybatics genatator找表的时候,貌似是SQL里的模糊查询方式。2,数据库的列名,最好按照javabean规则,写成驼峰样子(如:userName,userPassword),注意首字母不要大写。
2 mybatics联表查询
大家肯定遇到过需要查询数据库里某几张表联合起来的结果,比如把学生表的信息和学生所在班级的信息联合查询并显示(因为数据库搭建时,学生表里只会存一个班级的唯一ID,不会存关于这个班级的其余信息),所以我们要使用联合查询。这点不同于hibernate,因为我们可以自己写SQL语句。这里介绍步骤如下:
1 建立对应的POJO类。有很多人嫌麻烦,不肯建立,真有那么烦么?这里推荐一个做法,比如要显示学生(包括班级,爱好的所有信息)直接新建一个类,继承学生类,在private引入班级类和爱好类就完事了。如下:
public class UserAll extends User {
private Class userClass;
private Favourate favourate;
然后get与set。。。
}
2.对应mapper里的.xml怎么写也很方便,把几个类的mapper里自动生成的基本resultmap拼在一起就好了。
注意两个关键字就行:association是一对一连接的,collection是一对多连接的。
<!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性-->
<resultMap id="唯一的标识" type="映射的pojo对象">
<id column="表的主键字段,或者可以为查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" />
<result column="表的一个字段(可以为任意表的一个字段)" jdbcType="字段类型" property="映射到pojo对象的一个属性(须为type定义的pojo对象中的一个属性)"/>
<association property="pojo的一个对象属性" javaType="pojo关联的pojo对象">
<id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的主席属性"/>
<result column="任意表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/>
</association>
<!-- 集合中的property须为oftype定义的pojo对象的属性-->
<collection property="pojo的集合属性" ofType="集合中的pojo对象">
<id column="集合中pojo对象对应的表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" />
<result column="可以为任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" />
</collection>
</resultMap>
3.接下来就是SQL语句,使用左右拼接的方式(left join)
image.png