美文网首页
mybatics细节问题

mybatics细节问题

作者: mingyi_b37e | 来源:发表于2019-07-26 10:28 被阅读0次

    最近在学习基于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

    相关文章

      网友评论

          本文标题:mybatics细节问题

          本文链接:https://www.haomeiwen.com/subject/foolrctx.html