1. 程式人生 > >mybatis generator生成帶有分頁的Mybatis程式碼

mybatis generator生成帶有分頁的Mybatis程式碼

MyBatis開發,最讓人開心的就是可以隨意寫SQL,這樣有多好的效能的SQL都可以進行調優。

但是MyBatis的優點也是它的缺點,不論什麼專案都需要編寫SQL,令人頭疼的要命,一般業務(例如單表操作)的簡單查詢、修改、刪除、插入,都需要自己手工去編寫SQL。

還好有第三方的軟體給我解決這些事情,可以像使用Hibernate一樣使用MyBatis,當需要進行特殊定製的再進行修改。

1.      本文件主要描述

1、表格; 2、檢視;3、儲存過程;4、自定義的MyBatis

1.1.            表格

    com.epublic.cwa.dao.table.entity

    com.epublic.cwa.dao.table.mapper

1.2.            檢視

    com.epublic.cwa.dao.view.entity

    com.epublic.cwa.dao.view.mapper

1.3.            儲存過程

    com.epublic.cwa.dao.procedure.entity

    com.epublic.cwa.dao.procedure.mapper

1.4.            自定義MyBatis

    com.epublic.cwa.dao.custom.entity

    com.epublic.cwa.dao.custom.mapper

2.      安裝外掛

為了快速進行開發,少做重複性勞動工作,必須使用工具。

       經過Google、Bing等工具搜尋與對比,選定工具:

線上文件,參考

http://ibatis.apache.org/docs/tools/ibator/

由於ibatis轉移為mybatis,所以參考mybatis 最新文件:

http://code.google.com/p/mybatis/wiki/Downloads?tm=2

下載的MyBatis Generator Tool中有文件說明

2.1.            外掛下載地址

http://yunpan.cn/cJaVdf3Fszf5a  訪問密碼 6479

下載獲取MyBatis_Generator.7z檔案,解壓縮後,放入Eclipse的外掛中,外掛如何放,我就不囉嗦了,自己百度搞定。

3.      擴充套件自定義排序

3.1.            引入專案Jar包

一個是資料庫,一個是我們將要擴充套件的jar

org.mybatis.generator.core_1.3.1.201101032122.jar

mysql-connector-java-5.1.13.jar

3.2.            編寫程式碼

將plugin的生命週期和怎麼擴充套件,

http://ibatis.apache.org/docs/tools/ibator/reference/pluggingIn.html

       生命週期和怎麼擴充套件都已經交代明瞭,接下來就是動手實踐了

packagecom.epublic.xzk.db.mybatis.plugin;

import java.util.List;

importorg.mybatis.generator.api.CommentGenerator;

importorg.mybatis.generator.api.IntrospectedTable;

importorg.mybatis.generator.api.PluginAdapter;

importorg.mybatis.generator.api.ShellRunner;

importorg.mybatis.generator.api.dom.java.Field;

importorg.mybatis.generator.api.dom.java.FullyQualifiedJavaType;

importorg.mybatis.generator.api.dom.java.JavaVisibility;

importorg.mybatis.generator.api.dom.java.Method;

importorg.mybatis.generator.api.dom.java.Parameter;

importorg.mybatis.generator.api.dom.java.TopLevelClass;

importorg.mybatis.generator.api.dom.xml.Attribute;

importorg.mybatis.generator.api.dom.xml.TextElement;

importorg.mybatis.generator.api.dom.xml.XmlElement;

/**

 * <pre>

 * add paginationusing mysql limit.2

 * This class isonly used in ibator code generator.

 *[generatorConfiguration]

 *     [context id="context1"]

 *            [plugintype="com.epublic.xzk.db.mybatis.plugin.PaginationPlugin" /]

 *

 * </pre>

*/

public class PaginationPlugin extends PluginAdapter {

  @Override

  publicbooleanmodelExampleClassGenerated(TopLevelClasstopLevelClass,IntrospectedTable introspectedTable) {

         // addfield, getter, setter for limit clause

         addLimit(topLevelClass,introspectedTable,"limitStart");

         addLimit(topLevelClass,introspectedTable,"limitEnd");

         returnsuper.modelExampleClassGenerated(topLevelClass,introspectedTable);

  }

  @Override

  publicbooleansqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElementelement,

                IntrospectedTable introspectedTable) {

         // LIMIT5,10; // 檢索記錄行 6-15

         XmlElement isNotNullElement= new XmlElement("if");//$NON-NLS-1$

         isNotNullElement.addAttribute(new Attribute("test","limitStart != null and limitStart >=0"));//$NON-NLS-1$ //$NON-NLS-2$

         isNotNullElement.addElement(new TextElement("limit${limitStart} , ${limitEnd}"));

         element.addElement(isNotNullElement);

         // LIMIT 5;//檢索前 5個記錄行

         returnsuper.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element,introspectedTable);

  }

  privatevoid addLimit(TopLevelClasstopLevelClass, IntrospectedTable introspectedTable, String name){

         CommentGenerator commentGenerator =context.getCommentGenerator();

         Field field= new Field();

         field.setVisibility(JavaVisibility.PROTECTED);

         field.setType(FullyQualifiedJavaType.getIntInstance());

         field.setName(name);

         field.setInitializationString("-1");

         commentGenerator.addFieldComment(field,introspectedTable);

         topLevelClass.addField(field);

         charc =name.charAt(0);

         String camel= Character.toUpperCase(c) +name.substring(1);

         Method method= new Method();

         method.setVisibility(JavaVisibility.PUBLIC);

         method.setName("set" +camel);

         method.addParameter(new Parameter(FullyQualifiedJavaType.getIntInstance(),name));

         method.addBodyLine("this." +name+ "=" +name+ ";");

         commentGenerator.addGeneralMethodComment(method,introspectedTable);

         topLevelClass.addMethod(method);

         method= new Method();

         method.setVisibility(JavaVisibility.PUBLIC);

         method.setReturnType(FullyQualifiedJavaType.getIntInstance());

         method.setName("get" +camel);

         method.addBodyLine("return " +name+ ";");

         commentGenerator.addGeneralMethodComment(method,introspectedTable);

         topLevelClass.addMethod(method);

  }

  /**

   * This plugin is always valid -no properties are required

   */

  publicboolean validate(List<String>warnings) {

         returntrue;

  }

  publicstaticvoidgenerate() {

         String config= PaginationPlugin.class.getClassLoader().getResource("mybatisConfig.xml").getFile();

         String[] arg= { "-configfile", config, "-overwrite"};

         ShellRunner.main(arg);

  }

  publicstaticvoidmain(String[] args) {

         generate();

  }

}

4.      生成指令碼的樣例

4.1.            表

建立檔案“generatorConfig-java-table.xml”

<?xmlversion="1.0" encoding="UTF-8" ?>

<!DOCTYPEgeneratorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >

<generatorConfiguration >

  <context id="context1" >

         <plugin type="com.epublic.xzk.db.mybatis.plugin.PaginationPlugin" />

         <commentGenerator>

                <!-- 避免生成註解

                       <propertyname="suppressDate" value="true" />

                              -->

                <property name="suppressAllComments" value="true" />

         </commentGenerator>

         <jdbcConnection driverClass="com.mysql.jdbc.Driver"

                connectionURL="jdbc:mysql://192.168.0.128:3306/faceserver_xzk"

                userId="root"

                password="admin"

                />

         <!-- Model檔案儲存位置 -->

         <javaModelGenerator targetPackage="com.epublic.cwa.dao.table.entity" targetProject="01.cwa-web\src\main\java-dao">

                <property name="trimStrings" value="true" /> 

         </javaModelGenerator>

         <!-- 生成的mapper檔案-->

         <sqlMapGenerator targetPackage="com.epublic.cwa.dao.table.mapper" targetProject="01.cwa-web\src\main\java-dao" >

         </sqlMapGenerator>

         <!-- 生成的查詢條件的類 -->

         <javaClientGenerator type="XMLMAPPER" targetPackage="com.epublic.cwa.dao.table.mapper" targetProject="01.cwa-web\src\main\java-dao">

         </javaClientGenerator>

         <!-- 該表作為字典表參考資料,不再使用

                <tableschema="" tableName="CWA_SYS_ROLES" ></table>

                <tableschema="" tableName="CWA_SYS_USER_ROLE" ></table>

                -->

         <table schema=""tableName="cwa_sys_functions" ></table>

         <table schema=""tableName="CWA_SYS_ROLE_FUNCTION" ></table>

         <table schema=""tableName="cwa_sys_users" ></table>

         <table schema=""tableName="cwa_sys_model_view_dic" ></table>

         <table schema=""tableName="cwa_dept" ></table>

         <table schema=""tableName="CWA_USER" ></table>

         <table schema=""tableName="cwa_sys_log" ></table>

  </context>

</generatorConfiguration>

生成的程式碼如下:

4.2.            檢視

建立檔案“generatorConfig-java-view.xml”

<?xmlversion="1.0" encoding="UTF-8" ?>

<!DOCTYPEgeneratorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis GeneratorConfiguration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >

<generatorConfiguration >            

  <context id="MySQL_Context" >

         <plugin type="com.epublic.xzk.db.mybatis.plugin.PaginationPlugin" />

         <commentGenerator>

                <!-- 避免生成註解

                       <propertyname="suppressDate" value="true" />

                              -->

                <property name="suppressAllComments" value="true" />

         </commentGenerator>

         <jdbcConnection driverClass="com.mysql.jdbc.Driver"

                connectionURL="jdbc:mysql://192.168.0.128:3306/faceserver_xzk"

                userId="root"

                password="admin"

                />

         <javaTypeResolver > 

                <property name="forceBigDecimals" value="false" /> 

         </javaTypeResolver>

         <!-- Model檔案儲存位置 -->

         <javaModelGenerator targetPackage="com.epublic.cwa.dao.view.entity" targetProject="01.cwa-web\src\main\java-dao">

                <property name="trimStrings" value="true" /> 

         </javaModelGenerator>

         <!-- 生成的mapper檔案-->

         <sqlMapGenerator targetPackage="com.epublic.cwa.dao.view.mapper" targetProject="01.cwa-web\src\main\java-dao">

         </sqlMapGenerator>

         <!-- 生成的查詢條件的類 -->

         <javaClientGenerator type="XMLMAPPER" targetPackage="com.epublic.cwa.dao.view.mapper" targetProject="01.cwa-web\src\main\java-dao">

         </javaClientGenerator>

         <table schema=""tableName="v_cwa_sys_users"

                enableCountByExample="true"

                enableSelectByExample="true"

                enableInsert="false"

                enableUpdateByExample="false"

                enableDeleteByExample="false"

                selectByExampleQueryId="true"></table>

         <table schema=""tableName="v_cwa_device"

                enableCountByExample="true"

                enableSelectByExample="true"

                enableInsert="false"

                enableUpdateByExample="false"

                enableDeleteByExample="false"

                selectByExampleQueryId="true"></table>

  </context>

</generatorConfiguration>

生成指令碼如下:

 

4.3.            自定義

自己隨便寫了,只要符合MyBatis就可以了。

4.4.            儲存過程

自己隨便寫了,只要符合MyBatis就可以了。

5.      呼叫示例

5.1.            範例程式碼

  /**

   * 查詢分頁

   *

   * @param formDto

   *            查詢表單

   * @param orderByDto

   * @param pageDto

   * @return

   */

  public PageModel<VCwaDevice>queryByPage(MachineDeviceQueryDtoformDto, CommonQueryByOrderByDto orderByDto,

                PageDtopageDto) {

         VCwaDeviceExampleexample = new VCwaDeviceExample();

         // Step02.查詢總數

         int totalRecord = vCwaDeviceMapper.countByExample(example);

         // Step04.增加排序物件

         String queryOrderBy = orderByDto.getQueryOrderBy();

         if (StringUtils.isEmpty(queryOrderBy)==false) {

                example.setOrderByClause(queryOrderBy);

         } else {

                example.setOrderByClause("id desc");

         }

         // Step03.計算分頁物件

         int pageSize = pageDto.getPageSize();

         int curPage = pageDto.getCurPage();

         PageModel<VCwaDevice>borrowList = new PageModel<VCwaDevice>(pageSize,curPage, totalRecord);

         int startRow = borrowList.getStartRow();

         example. setLimitStart(startRow);

         example.setLimitEnd(pageSize);

         // Step05.查詢資料庫,獲取分頁資料

         List<VCwaDevice>dataList = vCwaDeviceMapper.selectByExample(example);

         borrowList.setDataList(dataList);

         return borrowList;

  }

5.2.            DTO物件

5.2.1. PageDto

packagecom.epublic.cwa.common.web.page;

import java.util.ArrayList;

import java.util.List;

/**

 * 分頁物件

 *

 * @author Ken.xu

 * @version 201528下午7:03:21

 */

public class PageDto {

  // 每頁顯示的頁碼個數

  privateintSHOW_PAGE_COUNT= 5;

  privateintcurPage= 0;// 當前頁碼

  privateintpageSize= 15;// 每頁大小

  // 以下兩個引數不初始化設定

  privateinttotalRows= 0;// 總記錄數

  privateintpageNum= 0;// 總頁數

  publicList<Integer> getShowPageNumList() {

         List<Integer> showPageNumList = newArrayList<Integer>();

         intpageNumBegin = 1,pageNumEnd= pageNum;

         if(pageNum <=SHOW_PAGE_COUNT){//總頁碼小於5

                pageNumEnd= pageNum;

         } else{

                // 獲取中間的位置

                intpageCenterNum =SHOW_PAGE_COUNT/ 2;

                if(curPage -pageCenterNum> 0) {//超過第三個,那麼左側-2為中間即可

                       pageNumBegin= curPage - pageCenterNum;

                } else{

                       pageNumBegin= 0;

                }

                pageNumEnd= pageNumBegin + SHOW_PAGE_COUNT;

         }

         for(intpageNum= pageNumBegin;pageNum<= pageNumEnd;pageNum++){

                showPageNumList.add(pageNum);

         }

         returnshowPageNumList;

  }

  publicPageDto() {

  }

  /**

   * 預設構造器,初始化成員變數

   *

   * @param totalRows

   *           總記錄數

   * @param curPage

   *           當前頁碼

   * @param pageSize

   *           每頁大小

   * @param items

   *           存放資料

   */

  publicPageDto(inttotalRows,intcurPage,intpageSize){

         this.setPage(totalRows,curPage,pageSize);

  }

  /**

   * 預設構造器,初始化成員變數

   *

   * @param totalRows

   *           總記錄數

   * @param curPage

   *           當前頁碼

   * @param pageSize

   *           每頁大小

   */

  publicvoid setPage(inttotalRows,intcurPage,intpageSize){

         this.pageSize =pageSize;

         this.totalRows =totalRows;

         this.curPage =curPage;

         // 計算總頁碼

         this.pageNum = (int)Math.ceil((double)totalRows / pageSize);

  }

  publicint getPageSize() {

         returnpageSize;

  }

  publicvoid setPageSize(intpageSize){

         this.pageSize =pageSize;

  }

  publicint getTotalRows() {

         returntotalRows;

  }

  publicvoid setTotalRows(inttotalrows){

         this.totalRows =totalrows;

  }

  publicint getPageNum() {

         returnpageNum;

  }

  publicvoid setPageNum(intpageNum){

         this.pageNum =pageNum;

  }

  publicint getCurPage() {

         returncurPage;

  }

  publicvoid setCurPage(intcurPage){

         this.curPage =curPage;

  }

}

5.2.2. CommonQueryByOrderByDto

packagecom.epublic.cwa.common.web.dto;

/**

 * 查詢分頁

 *

 * @author Ken.xu

 * @version 201529上午8:54:28

 */

public class CommonQueryByOrderByDto {

  /**

   * 排序的中文描述

   */

  privateString queryOrderByChsText;

  /**

   * 排序的字串(SQL指令碼的OrderBy一部分)

   */

  privateString queryOrderBy;

  publicString getQueryOrderByChsText() {

         returnqueryOrderByChsText;

  }

  publicvoid setQueryOrderByChsText(StringqueryOrderByChsText) {

         this.queryOrderByChsText =queryOrderByChsText;

  }

  publicString getQueryOrderBy() {

         returnqueryOrderBy;

  }

  publicvoid setQueryOrderBy(StringqueryOrderBy) {

         this.queryOrderBy =queryOrderBy;

  }

}