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 2015年2月8日下午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 2015年2月9日上午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;
}
}