JavaWeb框架 - Mybatis06

逆向工程

  1. 什么是MyBatista的逆向工程:MyBatis的逆向工程指利用MyBatis Generator,可以快速的根据表生成对应的映射文件,接口,以及bean类 简单的说就是 通过数据库中的表来自动的生成代码
    • MyBatis Generator,简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询。但是表连接、存储过程等这些复杂sql的定义需要我们手工编写
    • 官方文档地址:http://www.mybatis.org/generator/
    • 官方工程地址https://github.com/mybatis/generator/releases
  2. 使用逆向工程的好处:非常的简单 就是 当数据库表比较多的时候,重复的创建pojo对象和简单的数据库表的(CRUD)操作的mapper,效率低,官方给出了使用mybatis Generator用来根据数据库表逆向生成pojo和mapper文件,极大的方便开发 最终级的理由就是懒
  3. 逆向工程的使用步骤:使用逆向工程生成文件非常的方便只需要进行一些简单的配置
    • 在IDEA上创建maven工程

    • 在maven中添加依赖

      <!-- MBG -->
      <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.3.5</version>
      </dependency>
      
    • 进行generationConfig.xml文件的配置:

      <?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>
          <context id="mybatisGenerator" targetRuntime="MyBatis">
              <commentGenerator>
                  <!-- 是否去除自动生成的注释 true:是 : false:否 -->
                  <property name="suppressAllComments" value="true" />
              </commentGenerator>
              <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
              <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                              connectionURL="jdbc:mysql://localhost:3306/mybatisGenerator?
                                  serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true" userId="root"
                              password="12345">
              </jdbcConnection>
      
              <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
                  NUMERIC 类型解析为java.math.BigDecimal -->
              <javaTypeResolver>
                  <property name="forceBigDecimals" value="false" />
              </javaTypeResolver>
      
              <!-- targetProject:生成PO类的位置 -->
              <javaModelGenerator targetPackage="pojo"
                                  targetProject=".\src">
                  <!-- enableSubPackages:是否让schema作为包的后缀 -->
                  <property name="enableSubPackages" value="false" />
                  <!-- 从数据库返回的值被清理前后的空格 -->
                  <property name="trimStrings" value="true" />
              </javaModelGenerator>
              <!-- targetProject:mapper映射文件生成的位置 -->
              <sqlMapGenerator targetPackage="mapper"
                               targetProject=".\src">
                  <!-- enableSubPackages:是否让schema作为包的后缀 -->
                  <property name="enableSubPackages" value="false" />
              </sqlMapGenerator>
              <!-- targetPackage:mapper接口生成的位置 -->
              <javaClientGenerator type="XMLMAPPER"
                                   targetPackage="mapper"
                                   targetProject=".\src">
                  <!-- enableSubPackages:是否让schema作为包的后缀 -->
                  <property name="enableSubPackages" value="false" />
              </javaClientGenerator>
              <!-- 指定数据库表 -->
              <table tableName="items"></table>
              <table tableName="orders"></table>
              <table tableName="orderdetail"></table>
              <table tableName="user"></table>
            
              <!-- 有些表的字段需要指定java类型
               <table schema="" tableName="">
                  <columnOverride column="" javaType="" />
              </table> -->
          </context>
      </generatorConfiguration>
      
    • 使用Java类来执行逆向工程: 执行main方法 生成pojo和mapperr对象

      
      public class Generator {
          public void generator() throws Exception{
              List<String> warnings = new ArrayList<String>();
              boolean overwrite = true;
             /**指向逆向工程配置文件 其余的步骤都是固定的*/
              File configFile = new File("src/generatorConfig.xml");
              ConfigurationParser parser = new ConfigurationParser(warnings);
              Configuration config = parser.parseConfiguration(configFile);
              DefaultShellCallback callback = new DefaultShellCallback(overwrite);
              MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
                      callback, warnings);
              myBatisGenerator.generate(null);
          }
          public static void main(String[] args) throws Exception {
              try {
                  Generator generatorSqlmap = new Generator();
                  generatorSqlmap.generator();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
      
  4. MBG的配置详解:
    • generatorConfiguration 标签下的子级标签,分别是 properties classPathEntry context 。在配置这几个标签的时候,必须注意它们的顺序properties classPathEntry contex
    • properties 标签。这个标签用来指定外部的属性元素,最多可以配置 一个,也可以不配置 properties 标签用于指定一个需要在配置中解析使用的外部属性文件 引入属性文件后,可以在配置中使用${ property }这种形式的引用,通过这种方式引用属性文件中的属性值(常常是用来配置JDBC的信息)
      • 属性: properties 标签包含 resource url 两个属性 只能使用一个属性 同时使用会报错
        • resource 指定 classpath 下的属性文件
        • url 指定文件系统上的特定位置 (可以是在磁盘中的任意位置 使用的是file协议)
    • classPathEntry 标签 这个标签可以配置多个 可以不配置 classPathEntry 标签最常见的用法是通过属性 location 指定驱动的路径或者是指定 rootClass 属性配直类所在的 jar包
    • context 标签:该标签至少配置 一个 也可以配置多个(重点)
      • 属性 :
        • id属性:context 标签只有一个必选属 id ,用来唯一确定该标签,该 id 属性可以在运行MBG时使用
        • defaultModelType属性 :定义了 MBG 如何生成实体类。该属性有以下可选值:
          • conditional 默认值,和下面的 hierarchical 类似,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,而是会将该字段合并到基本实体类中
          • flat :该模型只为每张表生成 个实体类。这个实体类包含表中的所有字段种模型最简单,推荐使用。
          • hierarchical :如果表有主键,那么该模型会产生 个单独的主键实体类,如果表还有 BLOB 字段,则会为表生成 个包含所有 BLOB 字段的单独的实体类,然后为所有其他的字段另外生成 个单独的实体类。 MBG 会在所有生成的实体类之间维护 个继承关系
        • targetRuntime属性 :此属性用于指定生成的代码的运行时环境,支持以下可选值MyBatis3 默认值另一种就是MyBatis3Simple 这种情况不会生成与 Example 相关的方法
        • introspectedColumnimpl属性 该参数可以指定扩展 org mybatis.generator.api. Introspected Column 类的实现类
    • commentGenerator 标签:该标签用来配置如何生成注释信息,最多可以配置一个(一般都是屏蔽注释信息)
      • 默认的实现类中提供了个可选属性,需要通过 property 属性进行配置:
        • suppressAllComments :阻止生成注释 ,默认为 false
        • suppressDate 阻止生成的注释包含时间戳,默认为 false
        • addRemarkComments :注释是否添加数据库表的备注信息 ,默认为 false
    • jdbcConnection 标签:jdbcConnection 指定 MBG 要连接的数据库信息,该标签必须有,并且只能有一个:推荐将JDBC驱动放置到classpath下
      • 属性: 前两个是必须的属性 后两个是可选的属性
        • driverClass 访问数据库的 JDBC 驱动程序的全限定类名
        • connection URL 访问数据库的 JDBC 连接 URL
        • user!d :访问数据库的用户 ID
        • password 访问数据库的密码。
    • javaTypeResolver 标签:标签的配置用来指定 JDBC 类型和 Java 类型如何转换,最多可以配置一个
      • 其中能使用property 标签,可以配置的属性为 forceBigDecimals,该属性可以控制是否强制将 DECIMAL NUMERIC 类型的 JDBC 字段转换为 Java 类型的java.math BigDecimal ,默认值为 false ,一般不需要配置
    • javaModelGenerator 标签:该标签用来控制生成的实体类、
      • 属性:
        • targetPackage 生成实体类存放的包名。一般就是放在该包下,实际还会受到其他
          配置的影响
        • targetProject :指定目标项目路径,可以使用相对路径或绝对路径
    • sqlMapGenerator 标签:该标签用于配置 SQL 映射生成器 Mapper.xml 文件的属性,该标签可选,最多配置y一个
      • 属性:必选
        • targetPackage 生成 SQL 映射文件( XML 文件)存放的包名 。一般就是放在该包下
        • targetProject 指定目标项目路径,可以使用相对路径或绝对路径
    • javaClientGenerator 标签:不配置此标签就不能生成Mapper接口
      • 属性:
        • type 用于选择客户端代码( Mapper 接口)生成器
        • targetPackage 生成实体类存放的包名。一般就是放在该包下,实际还会受到其他
          配置的影响
        • targetProject :指定目标项目路径,可以使用相对路径或绝对路径
    • table 标签:table 是最重要的一个标签,该标签用于配置需要通过内省数据库的表,只有在 table配置过的表才能经过上述其他配置生成最终的代码,该标签至少要配置 个,可以配置多个table 标签有 个必选属性 tableName ,该属性指定要生成的表名,可以使用 SQL 通配符匹配多个表
      • 生成全部的表,可以如下配置:<table tableName ="%"/>

分页插件

在这里插入图片描述

  1. 使用步骤: 是一个国内的牛人开源项目
    • 使用 Maven在 pom.xml 中添加如下依赖:
      <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper</artifactId>
          <version>最新版本</version>
      </dependency>
      
    • 配置拦截器插件特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor。 com.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法
      • 在 MyBatis 配置 xml 中配置拦截器插件

        <plugins>
            <!-- com.github.pagehelper为PageHelper类所在包名 -->
            <plugin interceptor="com.github.pagehelper.PageInterceptor">
                <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
                <property name="param1" value="value1"/>
        	</plugin>
        </plugins>
        
      • 拦截器中的参数详解:

        • dialect:默认情况下会使用 PageHelper 方式进行分页,如果想要实现自己的分页逻辑,可以实现 Dialect(com.github.pagehelper.Dialect) 接口,然后配置该属性为实现类的全限定名称。
          下面几个参数都是针对默认 dialect 情况下的参数。使用自定义 dialect 实现时,下面的参数没有任何作用

        • helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
          特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
          你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。

        • offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。

        • rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。

        • pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。

        • reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。

        • params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。

        • supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。

        • autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver),用法和注意事项参考下面的场景五。

        • closeConn:默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为 false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定

      • 调用:

        • RowBounds方式的调用:

          List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10));
          

          使用这种调用方式时,你可以使用RowBounds参数进行分页,这种方式侵入性最小,我们可以看到,通过RowBounds方式调用只是使用了这个参数,并没有增加其他任何内容 分页插件检测到使用了RowBounds参数时,就会对该查询进行物理分页

        • PageHelper.startPage 静态方法调用除了 PageHelper.startPage 方法外,还提供了类似用法的 PageHelper.offsetPage 方法。在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页 还能使用 PageInfo对象将结果进行包装

          //获取第1页,10条内容,默认查询总数count
          PageHelper.startPage(1, 10);
          //紧跟着的第一个select方法会被分页 还有其他的查询方法不会进行分页
          List<Country> list = countryMapper.selectAll();
          //用PageInfo对结果进行包装
          PageInfo page = new PageInfo(list);
          //测试PageInfo全部属性
          //PageInfo包含了非常全面的分页属性
          assertEquals(1, page.getPageNum());
          assertEquals(10, page.getPageSize());
          assertEquals(1, page.getStartRow());
          assertEquals(10, page.getEndRow());
          assertEquals(183, page.getTotal());
          assertEquals(19, page.getPages());
          assertEquals(1, page.getFirstPage());
          assertEquals(8, page.getLastPage());
          assertEquals(true, page.isFirstPage());
          assertEquals(false, page.isLastPage());
          assertEquals(false, page.isHasPreviousPage());
          assertEquals(true, page.isHasNextPage());
          
        • 使用参数的方式:想要使用参数方式,需要配置 supportMethodsArguments 参数为 true,同时要配置 params 参数

          <plugins>
              <!-- com.github.pagehelper为PageHelper类所在包名 -->
              <plugin interceptor="com.github.pagehelper.PageInterceptor">
                  <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
                  <property name="supportMethodsArguments" value="true"/>
                  <property name="params" value="pageNum=pageNumKey;pageSize=pageSizeKey;"/>
          	</plugin>
          </plugins>
          

          在方法中 添加pageNumKeypageSizeKey 参数,这个方法就会被分页

          List<Country> selectByPageNumSize(
          	@Param("user") User user,
          	@Param("pageNumKey") int pageNum,
          	@Param("pageSizeKey") int pageSize);
          
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

上山打卤面

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值