mybatis中由Dao层向mapper层演变的以及逆向工程详解[个人笔记]

在mybatis数据库开发过程中,一开始是先写dao ,pojo然后通过映射文件来完成数据库的操作;

一个简单的案例是---->>>
在这里插入图片描述
看起来就这么多,如果你想看一下本教程,可以直接移步-------

链接

mybatis逆向工程

由结果导向配置文件,正常情况下是由我们根据数据库文件编写pojo实体类,而mabatis逆向工程是通过一个mybatis-genertator-core核心包来实现自动生成pojo的一种实现;

下面简单来说一下generrator的配置------>>>
首先是表头---->>>>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

表头没有什么好研究的,规定好了,
配置文件下的基本规则内容

配置生成器

<generatorConfiguration >
   <properties resource="jdbc.properties"/>
<!--  resource:配置资源加载地址
  url:配置资源加载地址 
  两个选择一个,或者选择不引用直接在下面配置  -->
<context>
具体的配置内容
</context>
</generatorConfiguration>

context 标签的含义是生成一组对象的环境,唯一id必不可少

 <context id="mysql" defaultModelType="flat" targetRuntime="MyBatis3" introspectedColumnImpl="com.Gavin.Tools">

defaultModelType用于指定生成对象的样式,有三个可选值---->>>>

1,conditional:如果某张表只有一个字段,则不会生成pojo实体

2,flat:所有内容(主键,blob)等全部生成在一个对象中;也是最常用的

3,hierarchical:主键生成一个XXKey对象(key class),Blob等单独生成一个对象,其他简单属性在一个对象中(record class)

如果表中没有blob,则hierarchical 与flat的效果是一样的

targetRuntime:
1,MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample;

2,MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample;

introspectedColumnImpl:值为类全限定名,用于扩展MBG,即引入一个工具类用于扩展MBG

下面的配置基本是默认的,如果遇到某些情况可以修改一下,比如表字段与java关键字冲突时候;

      <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;
            一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖
         -->
        <property name="autoDelimitKeywords" value="false"/>
        <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- 格式化java代码 -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!-- 格式化XML代码 -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>

        <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

关于注释的一些配置,当然可以自定义注释,要有类的实现,代码留作日后在讨论;

 <commentGenerator>
            <!-- 是否去除自动生成的注释 -->
            <property name="suppressAllComments" value="true"/>
            <!-- 生成注释是否带时间戳-->
            <property name="suppressDate" value="true"/>
            <!-- 生成的Java文件的编码格式 -->
            <property name="javaFileEncoding" value="utf-8"/>
            <!-- 格式化java代码-->
            <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
            <!-- 格式化XML代码-->
            <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
        </commentGenerator>

在这里插入图片描述

java数据库连接,在这里,开头generatorConfiguration可以引入一个外部文件,然后修改数据库时会很方便;这里并没有这么做,你知道就行;等案例的时候会采用外部配置的方式完成;

    <!-- 数据库连接驱动类,URL,用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/gavin?useUnicode=true&amp;characterEncoding=UTF-8"
 userId="gavin" password="123456">
<!-- 这里面可以设置property属性,每一个property属性都设置到配置的Driver上 -->
            <property name="useSSL" value="true"/>
        </jdbcConnection>
        

自定义数据库中数据处理类型,当然前提是需要有类型处理器的实现类或者继承类;

   <!-- java类型处理器
            用于处理DB中的类型到Java中的类型,默认使用JavaTypeResolverDefaultImpl;
            注意一点,默认会先尝试使用Integer,Long,Short等来对应DECIMAL和 NUMERIC数据类型;
        -->
        <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
          <!--
          对一些数据类型进行很好的处理以便节省空间
 true:使用BigDecimal对应DECIMAL和 NUMERIC数据类型
false:默认,
scale>0;length>18:使用BigDecimal;
scale=0;length[10,18]:使用Long;
 scale=0;length[5,9]:使用Integer;
 scale=0;length<5:使用Short;
             -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

生成实体类—pojo 生成的位置以及其他配置

<!-- 生成Domain模型:包名(targetPackage)、位置(targetProject) -->
<javaModelGenerator targetPackage="com.project.business.domain"
                    targetProject="D:/workSpace/project/src/main/java">
    <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
    <property name="enableSubPackages" value="true"/>
    <!-- 设置是否在getter方法中,对String类型字段调用trim()方法-->
    <property name="trimStrings" value="true"/>
</javaModelGenerator>

生成xml文件—mapper.xml

<!-- 生成xml映射文件:包名(targetPackage)、位置(targetProject) -->
        <sqlMapGenerator targetPackage="com.proj....ss.dao" targetProject="D:/workS....">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

生成dao层接口

 <!-- 生成DAO接口:包名(targetPackage)、位置(targetProject) -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.....dao"
    targetProject="D:.....">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

要操作的表----

    <!-- 要生成的表:tableName - 数据库中的表名或视图名,domainObjectName - 实体类名 -->
        <table tableName="tableName" domainObjectName="tableNameDO"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false">
  <!--这里也可以处理关键字冲突-->
<columnOverride column="id" javaType="Integer"/>
        </table>

当然,上面的配置内容不必全部都配置,挑选自己需要的就好了;

下面是我自己配置的

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 配置生成器 -->
<generatorConfiguration >
<!--引入外部配置 -->
    <properties resource="jdbc.properties"/>
    <!--    没有扩展的功能,所以不配置introspectedColumnImpl了-->
    <context id="mysql" defaultModelType="flat" targetRuntime="MyBatis3">

        <!--        全局配置-->
        <!--        自动划界关键字-->
        <property name="autoDelimitKeywords" value="false"/>
        <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- 格式化java代码 -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!-- 格式化XML代码 -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>

        <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!--注释操作,这里选择不生成注释-->
        <commentGenerator>
            <!--            局部配置-->
            <!-- 如果选择false,下面两个就可以不写-->
            <property name="addRemarkComments" value="true"/>
            <!-- 是否去除自动生成的注释 -->
            <property name="suppressAllComments" value="true"/>
            <!-- 生成注释是否带时间戳-->
            <property name="suppressDate" value="false"/>
        </commentGenerator>

        <!--   jdbc驱动配置-->
        <jdbcConnection driverClass="${jdbc_driver}"
                        connectionURL="${jdbc_url}"
                        userId="${jdbc_username}" password="${jdbc_password}">
            <property name="useSSL" value="false"/>
            <!-- 这里面可以设置property属性,每一个property属性都设置到配置的Driver上 -->
        </jdbcConnection>

        <!-- java类型处理器
            用于处理DB中的类型到Java中的类型,默认使用JavaTypeResolverDefaultImpl;
            注意一点,默认会先尝试使用Integer,Long,Short等来对应DECIMAL和 NUMERIC数据类型;
        -->
        <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
            <!--
                true:使用BigDecimal对应DECIMAL和 NUMERIC数据类型
                false:默认,
                    scale>0;length>18:使用BigDecimal;
                    scale=0;length[10,18]:使用Long;
                    scale=0;length[5,9]:使用Integer;
                    scale=0;length<5:使用Short;
             -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>


        <!-- java模型创建器,是必须要的元素
            负责:1,key类(见context的defaultModelType);2,java类;3,查询类
            targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
            targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
         -->

        <!--生成实体类-->
        <javaModelGenerator targetPackage="com.gavin.pojo" targetProject="./src/main/java">
            <!--  for MyBatis3/MyBatis3Simple
                自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter;
             -->
            <property name="constructorBased" value="false"/>

            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
            <property name="enableSubPackages" value="true"/>

            <!-- for MyBatis3 / MyBatis3Simple
                是否创建一个不可变的类,如果为true,
                那么MBG会创建一个没有setter方法的类,取而代之的是类似constructorBased的类
             -->
            <property name="immutable" value="false"/>

            <!-- 设置一个父类对象,
                如果设置了这个根对象,那么生成的keyClass或者recordClass会继承这个类;在Table的rootClass属性中可以覆盖该选项
                注意:如果在key class或者record class中有root class相同的属性,MBG就不会重新生成这些属性了,包括:
                    1,属性名相同,类型相同,有相同的getter/setter方法;
             -->
            
            <property name="rootClass" value="com.gavin.pojo.BaseBook"/>
            <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>


        <!-- 生成SQL map的XML文件生成器,
            注意,在Mybatis3之后,我们可以使用mapper.xml文件+Mapper接口(或者不用mapper接口),
                或者只使用Mapper接口+Annotation,所以,如果 javaClientGenerator配置中配置了需要生成XML的话,这个元素就必须配置
            targetPackage/targetProject:同javaModelGenerator
         -->
        <sqlMapGenerator targetPackage="com.gavin.mapper" targetProject="./src/main/resources">
            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>


        <table tableName="bookstore" domainObjectName="Book"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

下面写测试类以生成需要的数据----

package GavinTest;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class test {
    public static void main(String[] args) {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        String Cfg = "C:\\Users\\Gavin\\IdeaProjects\\comgavinreverse\\src\\main\\resources\\Generator-Config.xml";

        File configFile = new File(Cfg);
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = null;
        try {
            config = cp.parseConfiguration(configFile);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMLParserException e) {
            e.printStackTrace();
        }
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = null;
        try {
            myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        } catch (InvalidConfigurationException e) {
            e.printStackTrace();
        }
        try {
            myBatisGenerator.generate(null);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

在生成时出现了一个错误,-----
在这里插入图片描述

原来是设置了继承了一个父类,
在这里插入图片描述
如果设置了该项,那么父类中有的属性不会在子类中再去生成了;

同时我们还可指定全参构造方法是否生成;
在这里插入图片描述

最后打印日志----->>
在这里插入图片描述

配置文件可以使得不生成映射文件,但是这种方式会使得代码维护修改sql,就比较…
即通过如下配置---->>>>>

在这里插入图片描述
一般是采用用混合的模式----即如下方式—
在这里插入图片描述

生成的目录结构
在这里插入图片描述
源代码放在这里了------>>>>

就是这里

对了,放一个标准的逆向工程配置文件供参考------->>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 配置生成器 -->
<generatorConfiguration >
    <properties resource="jdbc.properties"/>
    <!--    没有扩展的功能,所以不配置introspectedColumnImpl了-->
    <context id="mysql" defaultModelType="flat" targetRuntime="MyBatis3">

        <!--        全局配置-->
        <!--        自动划界关键字-->

        <property name="autoDelimitKeywords" value="false"/>
        <!-- 生成的Java文件的编码 -->
        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- 格式化java代码 -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!-- 格式化XML代码 -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>

        <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!--注释操作,这里选择不生成注释-->
        <commentGenerator>
            <!--            局部配置-->
            <!-- 如果选择false,下面两个就可以不写-->
            <property name="addRemarkComments" value="true"/>
            <!-- 是否去除自动生成的注释 -->
            <property name="suppressAllComments" value="true"/>
            <!-- 生成注释是否带时间戳-->
            <property name="suppressDate" value="true"/>
        </commentGenerator>

        <!--   jdbc驱动配置-->
        <jdbcConnection driverClass="${jdbc_driver}"
                        connectionURL="${jdbc_url}"
                        userId="${jdbc_username}" password="${jdbc_password}">
            <property name="useSSL" value="false"/>
            <!-- 这里面可以设置property属性,每一个property属性都设置到配置的Driver上 -->
        </jdbcConnection>

        <!-- java类型处理器
            用于处理DB中的类型到Java中的类型,默认使用JavaTypeResolverDefaultImpl;
            注意一点,默认会先尝试使用Integer,Long,Short等来对应DECIMAL和 NUMERIC数据类型;
        -->
        <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
            <!--
                true:使用BigDecimal对应DECIMAL和 NUMERIC数据类型
                false:默认,
                    scale>0;length>18:使用BigDecimal;
                    scale=0;length[10,18]:使用Long;
                    scale=0;length[5,9]:使用Integer;
                    scale=0;length<5:使用Short;
             -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>


        <!-- java模型创建器,是必须要的元素
            负责:1,key类(见context的defaultModelType);2,java类;3,查询类
            targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
            targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
         -->

        <!--生成实体类-->
        <javaModelGenerator targetPackage="com.gavin.pojo" targetProject="./src/main/java">
            <!--  for MyBatis3/MyBatis3Simple
                自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter;
             -->
            <property name="constructorBased" value="true"/>

            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
            <property name="enableSubPackages" value="true"/>

            <!-- for MyBatis3 / MyBatis3Simple
                是否创建一个不可变的类,如果为true,
                那么MBG会创建一个没有setter方法的类,取而代之的是类似constructorBased的类
             -->
            <property name="immutable" value="false"/>

            <!-- 设置一个父类对象,
                如果设置了这个根对象,那么生成的keyClass或者recordClass会继承这个类;在Table的rootClass属性中可以覆盖该选项
                注意:如果在key class或者record class中有root class相同的属性,MBG就不会重新生成这些属性了,包括:
                    1,属性名相同,类型相同,有相同的getter/setter方法;
             -->

            <property name="rootClass" value="com.gavin.pojo.BaseBook"/>
            <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>



<!--        生成mapper-->
        <sqlMapGenerator targetPackage="com.gavin.mapper" targetProject="./src/main/resources">
            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

<!--  生成mapper与Dao-->
        <javaClientGenerator targetPackage="com.gavin.dao" type="XMLMAPPER" targetProject="./src/main/java">
            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
            <property name="enableSubPackages" value="true"/>

            <!-- 可以为所有生成的接口添加一个父接口,但是MBG只负责生成,不负责检查
            <property name="rootInterface" value=""/>
             -->
        </javaClientGenerator>

        <table tableName="bookstore" domainObjectName="Book"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false">
        </table>

    </context>

</generatorConfiguration>

mapper开发规范

  1. Mapper接口的名和对应的Mapper.xml映射文件的名必须一致。
  2. Mapper.xml文件中的namespace与Mapper接口的类路径相同(即接口文件和映射文件需要放在同一个包中)。
  3. Mapper接口中的方法名和Mapper.xml中定义的每个执行语句的id相同。
  4. Mapper接口中方法的输入参数类型要和Mapper.xml中定义的每个SQL的parameterType的类型相同。
  5. Mapper接口方法的输出参数类型要和Mapper.xml中定义的每个SQL的resultType的类型相同。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeMartain

祝:生活蒸蒸日上!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值