mybatics细节问题

2019-07-26  本文已影响0人  mingyi_b37e

最近在学习基于springboot的SSM项目的后台程序,期间遇到很多问题,也解决很多问题,简单介绍下。

1 mybatics genatator

对于 mybatics genatator是mybatics为了简化工作量,根据数据库表自动映射出mapper.xml文件,POJO实体类和DAO层类,减少了很多工作量。介绍mybatics genatator的使用文章很多。这里介绍一个介绍很详细的博客地址:https://blog.csdn.net/testcs_dn/article/details/79295065
构建步骤有很多需要注意的地方:

  1. 大多数项目使用很主流的版本管理器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>
  1. 接着就是配置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&amp;characterEncoding=UTF-8&amp;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>
  1. 对于表的配置。最好按照小编的配置,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
上一篇下一篇

猜你喜欢

热点阅读