打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
maven+mybatis+mybatis

第一步:准备需要的jar包。由于maven只要配置pom.xml就可以从仓库下载jar包。因此我们首先配置pom.xml。

注意com.microsoft.sqlserver需要自己加入maven仓库的。

  1. <dependencies>  
  2.     ......  
  3.     <dependency>  
  4.         <groupId>org.mybatis</groupId>  
  5.         <artifactId>mybatis</artifactId>  
  6.         <version>3.2.3</version>  
  7.     </dependency>  
  8.       
  9.     <dependency>  
  10.         <groupId>com.microsoft.sqlserver</groupId>  
  11.         <artifactId>sqljdbc4</artifactId>  
  12.         <version>4.0</version>  
  13.     </dependency>  
  14.   
  15.     <dependency>  
  16.         <groupId>org.mybatis.generator</groupId>  
  17.         <artifactId>mybatis-generator-core</artifactId>  
  18.         <version>1.3.2</version>  
  19.     </dependency>  
  20.       
  21.     ......  
  22. </dependencies>  
  23.   
  24. <build>  
  25.     ......  
  26.     <plugins>   
  27.         ......  
  28.           
  29.         <!-- generator插件 -->  
  30.         <plugin>  
  31.             <groupId>org.mybatis.generator</groupId>  
  32.             <artifactId>mybatis-generator-maven-plugin</artifactId>  
  33.             <version>1.3.2</version>  
  34.             <configuration>    
  35.                 <overwrite>true</overwrite>    
  36.                 <verbose>true</verbose>  
  37.             </configuration>  
  38.               
  39.             <dependencies>  
  40.                 <dependency>  
  41.                     <groupId>com.microsoft.sqlserver</groupId>  
  42.                     <artifactId>sqljdbc4</artifactId>  
  43.                     <version>4.0</version>  
  44.                 </dependency>  
  45.                 <dependency>    
  46.                     <groupId>com.montnets.edusun</groupId>  
  47.                     <artifactId>mybatis-user-defined-plugin</artifactId>  
  48.                     <version>0.1</version>  
  49.                 </dependency>  
  50.             </dependencies>  
  51.         </plugin>  
  52.     </plugins>  
  53. </build>  

第二步:配置generatorConfig.xml文件。在src/main/resources文件夹下新建generatorConfig.xml文件,配置文件如下代码所示。

  1. <generatorConfiguration>  
  2.     <properties resource="datasource.properties" />    
  3. <!--     数据库驱动包位置 配置在pom.xml文件中 -->  
  4.     <context id="MSSQLTables" targetRuntime="MyBatis3">  
  5.         <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>  
  6. <!--         <plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>  -->  
  7.         <plugin type="com.montnets.mybatis.generator.plugins.InsertAndUpdateBatch"></plugin>  
  8.         <!-- Pagination -->    
  9.         <plugin type="com.montnets.mybatis.generator.plugins.PaginationPlugin">  
  10.             <property name="pageQualifiedName" value="com.montnets.edusun.common.Page" />  
  11.             <property name="fromIndex" value="fromIndex" />  
  12.             <property name="toIndex" value="toIndex" />  
  13.             <property name="myBatisRepository" value="com.montnets.edusun.common.MyBatisRepository" />  
  14.         </plugin>  
  15.       
  16.         <commentGenerator>  
  17.             <!-- 是否去除自动生成的注释 true:是 : false:否 -->    
  18.             <property name="suppressAllComments" value="true" />  
  19.         </commentGenerator>  
  20.           
  21.         <!-- 数据库链接URL、用户名、密码 -->  
  22.         <jdbcConnection driverClass="${jdbc.driver}"   
  23.             connectionURL="${jdbc.url}"   
  24.             userId="${jdbc.username}"   
  25.             password="${jdbc.password}">  
  26.         </jdbcConnection>  
  27.           
  28.         <!--  默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer     
  29.             true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal  -->    
  30.         <javaTypeResolver>  
  31.             <property name="forceBigDecimals" value="false" />  
  32.         </javaTypeResolver>  
  33.        
  34.         <!-- 生成模型的包名和位置 -->  
  35.         <javaModelGenerator targetPackage="com.montnets.edusun.entity.test" targetProject="./src/main/java">  
  36.             <property name="enableSubPackages" value="true" />  
  37.             <!-- 从数据库返回的值被清理前后的空格  -->   
  38.             <property name="trimStrings" value="true" />  
  39.         </javaModelGenerator>  
  40.         <!-- 生成的映射文件包名和位置 -->  
  41.         <sqlMapGenerator targetPackage="sqlmaps.test" targetProject="./src/main/resources">  
  42.             <property name="enableSubPackages" value="true" />  
  43.         </sqlMapGenerator>  
  44.         <!-- 生成DAO的包名和位置 -->  
  45.         <javaClientGenerator type="XMLMAPPER" targetPackage="com.montnets.edusun.dao.test" targetProject="./src/main/java">  
  46.             <property name="enableSubPackages" value="true" />  
  47.         </javaClientGenerator>  
  48.         <!-- 要生成那些表(更改tableName和domainObjectName就可以) -->  
  49.         <table tableName="Edu_Notice" domainObjectName="EduNotice">  
  50.             <generatedKey column="id" sqlStatement="JDBC" identity="true"/>  
  51.         </table>  
  52.     </context>  
  53. </generatorConfiguration>  

对应的datasource.properties如下所示


  1. #sql server database settings  
  2. jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver  
  3. jdbc.url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test  
  4. jdbc.username=sa  
  5. jdbc.password=******  

第三步:运行mybatis-generator。命令:mybatis-generator:generate
详细介绍请参照:点击打开官网链接

-----------------------------------------------------------------------------------------------------------------------

下面介绍一下自定义的两个插件:InsertAndUpdateBatch和PaginationPlugin。这两个插件都被封装在mybatis-user-defined-plugin.jar包中。需要在maven的仓库中注册该jar包,pom.xml和generatorConfig.xml里的配置方式已经在前面有了。

InsertAndUpdateBatch: 配置后在生成代码时,会在接口和sqlmap文件中生成updateBySelectiveBatch、updateBatch、insertBatch三个方法和对应的sql语句。

PaginationPlugin:配置后在生成代码时,会在接口和sqlmap文件中生成countTotalData、pageQuery两个方法和对应的sql语句。需要注意的是该插件的四个参数,前三个参数为必需的,后一个参数为非必需的。

pageQualifiedName——分页类的全路径

fromIndex——分页查询中需要用到的起始索引名称

toIndex——分页查询中需要用到的结束索引名称

myBatisRepository——接口为mybatis提供的扫描注解类的全名。


源代码如下:

  1. import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;  
  2. import static org.mybatis.generator.internal.util.messages.Messages.getString;  
  3.   
  4. import java.util.List;  
  5.   
  6. import org.mybatis.generator.api.IntrospectedTable;  
  7. import org.mybatis.generator.api.PluginAdapter;  
  8. import org.mybatis.generator.api.dom.java.Field;  
  9. import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;  
  10. import org.mybatis.generator.api.dom.java.Interface;  
  11. import org.mybatis.generator.api.dom.java.JavaVisibility;  
  12. import org.mybatis.generator.api.dom.java.Method;  
  13. import org.mybatis.generator.api.dom.java.Parameter;  
  14. import org.mybatis.generator.api.dom.java.TopLevelClass;  
  15. import org.mybatis.generator.api.dom.xml.Attribute;  
  16. import org.mybatis.generator.api.dom.xml.Document;  
  17. import org.mybatis.generator.api.dom.xml.TextElement;  
  18. import org.mybatis.generator.api.dom.xml.XmlElement;  
  19.   
  20. /** 
  21.  * @author 罗勇 
  22.  * @date 2013年11月6日  下午2:45:26 
  23.  */  
  24. public class PaginationPlugin extends PluginAdapter {  
  25.       
  26.     private String pageQualifiedName;   //分页类的全名  
  27.     private String fromIndex;           //Page对象中,查询起始位置的属性名称  
  28.     private String toIndex;             //Page对象中,查询结束位置的属性名称  
  29.     private String myBatisRepository;   //接口注解全名  
  30.       
  31.     /** 
  32.      * 验证插件的配置是否正确 
  33.      */  
  34.     public boolean validate(List<String> warnings) {  
  35.           
  36.         pageQualifiedName = properties.getProperty("pageQualifiedName");  
  37.         fromIndex = properties.getProperty("fromIndex");  
  38.         toIndex = properties.getProperty("toIndex");  
  39.         myBatisRepository = properties.getProperty("myBatisRepository");  
  40.   
  41.         if (!stringHasValue(pageQualifiedName)) {  
  42.             warnings.add(getString("ValidationError.18""PaginationPlugin""pageQualifiedName"));  
  43.             return false;  
  44.         }  
  45.         if (!stringHasValue(fromIndex)) {  
  46.             warnings.add(getString("ValidationError.18""PaginationPlugin""fromIndex"));  
  47.             return false;  
  48.         }  
  49.         if (!stringHasValue(toIndex)) {  
  50.             warnings.add(getString("ValidationError.18""PaginationPlugin""toIndex"));  
  51.             return false;  
  52.         }  
  53.         return true;  
  54.     }  
  55.       
  56.     /** 
  57.      * 在接口中添加方法 
  58.      */  
  59.     @Override  
  60.     public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {  
  61.         String objectName = introspectedTable.getTableConfiguration().getDomainObjectName();//对象名称  
  62.   
  63.         interfaze.addImportedType(new FullyQualifiedJavaType("java.util.List"));  
  64.         interfaze.addImportedType(new FullyQualifiedJavaType(pageQualifiedName));  
  65.           
  66.         if (stringHasValue(myBatisRepository) && myBatisRepository.contains(".")) {  
  67.             int index = myBatisRepository.lastIndexOf('.');  
  68.             interfaze.addImportedType(new FullyQualifiedJavaType(myBatisRepository));  
  69.             interfaze.addAnnotation("@" + myBatisRepository.substring(index + 1));//接口添加注解  
  70.         }  
  71.           
  72.         Method method = new Method();//统计记录总条数方法  
  73.         method.setName("countTotalData");  
  74.         method.setReturnType(new FullyQualifiedJavaType("int"));  
  75.         interfaze.addMethod(method);  
  76.         method = new Method();//分页查询方法  
  77.         method.setName("pageQuery");  
  78.         method.addParameter(new Parameter(new FullyQualifiedJavaType(pageQualifiedName), "page"));  
  79.         method.setReturnType(new FullyQualifiedJavaType("java.util.List<" + objectName + ">"));  
  80.         interfaze.addMethod(method);  
  81.           
  82.         return super.clientGenerated(interfaze, topLevelClass, introspectedTable);  
  83.     }  
  84.       
  85.     /** 
  86.      * 在xml文件中添加需要的元素 
  87.      */  
  88.     @Override  
  89.     public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {  
  90.         XmlElement parentElement = document.getRootElement();  
  91.         String tableName = introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime();//数据库表名  
  92.           
  93.         // 产生统计记录数查询  
  94.         XmlElement countTotalDataElement = new XmlElement("select");  
  95.         countTotalDataElement.addAttribute(new Attribute("id""countTotalData"));  
  96.         countTotalDataElement.addAttribute(new Attribute("resultType""java.lang.Integer"));  
  97.         countTotalDataElement.addElement(new TextElement("select count(1) from " + tableName));  
  98.         parentElement.addElement(countTotalDataElement);  
  99.           
  100.         // 产生分页查询语句  
  101.         XmlElement pageQueryElement = new XmlElement("select");  
  102.         pageQueryElement.addAttribute(new Attribute("id""pageQuery"));  
  103.         pageQueryElement.addAttribute(new Attribute("resultMap""BaseResultMap"));  
  104.         pageQueryElement.addAttribute(new Attribute("parameterType", pageQualifiedName));  
  105.         XmlElement queryStart = new XmlElement("include");  
  106.         queryStart.addAttribute(new Attribute("refid""PageQueryPrefix"));  
  107.         pageQueryElement.addElement(queryStart);  
  108.         pageQueryElement.addElement(new TextElement("select "));  
  109.         XmlElement query = new XmlElement("include");  
  110.         query.addAttribute(new Attribute("refid""Base_Column_List"));  
  111.         pageQueryElement.addElement(query);  
  112.         pageQueryElement.addElement(new TextElement("from " + tableName));  
  113.         XmlElement queryEnd = new XmlElement("include");  
  114.         queryEnd.addAttribute(new Attribute("refid""PageQuerySuffix"));  
  115.         pageQueryElement.addElement(queryEnd);  
  116.         parentElement.addElement(pageQueryElement);  
  117.   
  118.         // 产生分页语句前半部分  
  119.         XmlElement paginationPrefixElement = new XmlElement("sql");  
  120.         paginationPrefixElement.addAttribute(new Attribute("id""PageQueryPrefix"));  
  121.         XmlElement pageStart = new XmlElement("if");  
  122.         pageStart.addAttribute(new Attribute("test""fromIndex != null and toIndex != null"));  
  123.         pageStart.addElement(new TextElement("select * from (select row_number() over (order by id desc) as rownum,* from( "));  
  124.         paginationPrefixElement.addElement(pageStart);  
  125.         parentElement.addElement(paginationPrefixElement);  
  126.   
  127.         // 产生分页语句后半部分  
  128.         XmlElement paginationSuffixElement = new XmlElement("sql");  
  129.         paginationSuffixElement.addAttribute(new Attribute("id""PageQuerySuffix"));  
  130.         XmlElement pageEnd = new XmlElement("if");  
  131.         pageEnd.addAttribute(new Attribute("test""fromIndex != null and toIndex != null"));  
  132.         pageEnd.addElement(new TextElement("<![CDATA[ ) as t1 ) as t2 where rownum <= #{" + toIndex + "} and rownum >= #{" + fromIndex + "} ]]>"));  
  133.         paginationSuffixElement.addElement(pageEnd);  
  134.         parentElement.addElement(paginationSuffixElement);  
  135.   
  136.         return super.sqlMapDocumentGenerated(document, introspectedTable);  
  137.     }  
  138.       
  139.     /** 
  140.      * 在Example配置为true时,在Example对象中添加get/set方法 
  141.      */  
  142.     @Override  
  143.     public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {  
  144.         String name = "page";  
  145.         topLevelClass.addImportedType(new FullyQualifiedJavaType(pageQualifiedName));  
  146.         Field field = new Field();  
  147.         field.setVisibility(JavaVisibility.PROTECTED);  
  148.         field.setType(new FullyQualifiedJavaType(pageQualifiedName));  
  149.         field.setName(name);  
  150.         topLevelClass.addField(field);  
  151.         char c = name.charAt(0);  
  152.         String camel = Character.toUpperCase(c) + name.substring(1);  
  153.         Method method = new Method();  
  154.         method.setVisibility(JavaVisibility.PUBLIC);  
  155.         method.setName("set" + camel);  
  156.         method.addParameter(new Parameter(new FullyQualifiedJavaType(pageQualifiedName), name));  
  157.         method.addBodyLine("this." + name + "=" + name + ";");  
  158.         topLevelClass.addMethod(method);  
  159.         method = new Method();  
  160.         method.setVisibility(JavaVisibility.PUBLIC);  
  161.         method.setReturnType(new FullyQualifiedJavaType(pageQualifiedName));  
  162.         method.setName("get" + camel);  
  163.         method.addBodyLine("return " + name + ";");  
  164.         topLevelClass.addMethod(method);  
  165.           
  166.         return super.modelExampleClassGenerated(topLevelClass, introspectedTable);  
  167.     }  
  168.   
  169.     /** 
  170.      * 在Example配置为true时,对生成的排除了大字段Example查询语句添加分页语句 
  171.      */  
  172.     @Override  
  173.     public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {  
  174.   
  175.         XmlElement pageStart = new XmlElement("include");   
  176.         pageStart.addAttribute(new Attribute("refid""PageQueryPrefix"));  
  177.         element.getElements().add(0, pageStart);  
  178.   
  179.         XmlElement isNotNullElement = new XmlElement("include");   
  180.         isNotNullElement.addAttribute(new Attribute("refid""PageQuerySuffix"));  
  181.         element.getElements().add(isNotNullElement);  
  182.   
  183.         return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element, introspectedTable);  
  184.     }  

  1. import java.util.ArrayList;  
  2. import java.util.Iterator;  
  3. import java.util.List;  
  4.   
  5. import org.mybatis.generator.api.IntrospectedColumn;  
  6. import org.mybatis.generator.api.IntrospectedTable;  
  7. import org.mybatis.generator.api.PluginAdapter;  
  8. import org.mybatis.generator.api.dom.OutputUtilities;  
  9. import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;  
  10. import org.mybatis.generator.api.dom.java.Interface;  
  11. import org.mybatis.generator.api.dom.java.Method;  
  12. import org.mybatis.generator.api.dom.java.Parameter;  
  13. import org.mybatis.generator.api.dom.java.TopLevelClass;  
  14. import org.mybatis.generator.api.dom.xml.Attribute;  
  15. import org.mybatis.generator.api.dom.xml.Document;  
  16. import org.mybatis.generator.api.dom.xml.TextElement;  
  17. import org.mybatis.generator.api.dom.xml.XmlElement;  
  18. import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;  
  19.   
  20. /** 
  21.  *  
  22.  * @author 罗勇 
  23.  * @date 2013年11月19日  下午3:47:25 
  24.  */  
  25. public class InsertAndUpdateBatch extends PluginAdapter {  
  26.       
  27.     private String item = "item";  
  28.       
  29.     /** 
  30.      * 验证插件的配置是否正确 
  31.      */  
  32.     public boolean validate(List<String> warnings) {  
  33.         return true;  
  34.     }  
  35.       
  36.     /** 
  37.      * 在接口中添加方法 
  38.      */  
  39.     @Override  
  40.     public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {  
  41.         String objectName = introspectedTable.getTableConfiguration().getDomainObjectName();//对象名称  
  42.           
  43.         interfaze.addImportedType(new FullyQualifiedJavaType("java.util.List"));  
  44.   
  45.         Method method = new Method();//  
  46.         method.addJavaDocLine("/**");  
  47.         method.addJavaDocLine(" * Batch update or insert. Parameters can not be more than 2100");  
  48.         method.addJavaDocLine(" * list of size not greater than 1000");  
  49.         method.addJavaDocLine(" */");  
  50.         method.setName("updateBySelectiveBatch");  
  51.         method.addParameter(new Parameter(new FullyQualifiedJavaType("java.util.List<" + objectName + ">"), "list"));  
  52.         method.setReturnType(new FullyQualifiedJavaType("void"));  
  53.           
  54.         /*该行代码的作用:当commentGenerator配置为false时,接口可以生成注释代码。 
  55.                   没有意义,所以注释,其他新加的方法已经删除*/  
  56.         //context.getCommentGenerator().addGeneralMethodComment(method, introspectedTable);  
  57.           
  58.         interfaze.addMethod(method);  
  59.         method = new Method();//  
  60.         method.setName("updateBatch");  
  61.         method.addParameter(new Parameter(new FullyQualifiedJavaType("java.util.List<" + objectName + ">"), "list"));  
  62.         method.setReturnType(new FullyQualifiedJavaType("void"));  
  63.         interfaze.addMethod(method);  
  64.         method = new Method();//  
  65.         method.setName("insertBatch");  
  66.         method.addParameter(new Parameter(new FullyQualifiedJavaType("java.util.List<" + objectName + ">"), "list"));  
  67.         method.setReturnType(new FullyQualifiedJavaType("void"));  
  68.         interfaze.addMethod(method);  
  69.           
  70.         return super.clientGenerated(interfaze, topLevelClass, introspectedTable);  
  71.     }  
  72.       
  73.     /** 
  74.      * 在xml文件中添加需要的元素 
  75.      */  
  76.     @Override  
  77.     public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {  
  78.         XmlElement parentElement = document.getRootElement();  
  79.         String tableName = introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime();//数据库表名  
  80.           
  81.         parentElement.addElement(getUpdateBatchBySelectiveElement(introspectedTable, tableName));  
  82.           
  83.         parentElement.addElement(getUpdateBatchElement(introspectedTable, tableName));//批量更新  
  84.   
  85.         parentElement.addElement(getInsertBatchElement(introspectedTable, tableName));//批量插入  
  86.   
  87.         return super.sqlMapDocumentGenerated(document, introspectedTable);  
  88.     }  
  89.       
  90.     /** 
  91.      * 批量修改BySelective 
  92.      * @param introspectedTable 
  93.      * @param tableName 
  94.      * @return 
  95.      */  
  96.     public XmlElement getUpdateBatchBySelectiveElement(IntrospectedTable introspectedTable, String tableName) {  
  97.         XmlElement updateBatchElement = new XmlElement("update");  
  98.         updateBatchElement.addAttribute(new Attribute("id""updateBySelectiveBatch"));  
  99.           
  100.         XmlElement foreachElement = NewForeachElement();  
  101.         XmlElement ifElement = NewIfElement(introspectedTable.getPrimaryKeyColumns());  
  102.   
  103.         /*该行代码的作用:当commentGenerator配置为false时,sql可以生成注释代码。 
  104.              没有意义,所以注释,其他新加的方法已经删除*/  
  105.         //context.getCommentGenerator().addComment(updateBatchElement);  
  106.   
  107.         StringBuilder sb = new StringBuilder();  
  108.         sb.append("update ").append(tableName);  
  109.         ifElement.addElement(new TextElement(sb.toString()));  
  110.   
  111.         XmlElement dynamicElement = new XmlElement("set");  
  112.         ifElement.addElement(dynamicElement);  
  113.   
  114.         for (IntrospectedColumn introspectedColumn : introspectedTable.getNonPrimaryKeyColumns()) {  
  115.             XmlElement isNotNullElement = new XmlElement("if");  
  116.             isNotNullElement.addAttribute(new Attribute("test", introspectedColumn.getJavaProperty(item + ".") + " != null"));  
  117.             dynamicElement.addElement(isNotNullElement);  
  118.   
  119.             sb.setLength(0);  
  120.             sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));  
  121.             sb.append(" = ");  
  122.             sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, item + "."));  
  123.             sb.append(',');  
  124.   
  125.             isNotNullElement.addElement(new TextElement(sb.toString()));  
  126.         }  
  127.   
  128.         boolean and = false;  
  129.         for (IntrospectedColumn introspectedColumn : introspectedTable.getPrimaryKeyColumns()) {  
  130.             sb.setLength(0);  
  131.             if (and) {  
  132.                 sb.append("  and ");  
  133.             } else {  
  134.                 sb.append("where ");  
  135.                 and = true;  
  136.             }  
  137.   
  138.             sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));  
  139.             sb.append(" = ");  
  140.             sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, item + "."));  
  141.             ifElement.addElement(new TextElement(sb.toString()));  
  142.         }  
  143.           
  144.         foreachElement.addElement(ifElement);  
  145.         updateBatchElement.addElement(foreachElement);  
  146.   
  147.         return updateBatchElement;  
  148.     }  
  149.       
  150.     /** 
  151.      * 批量修改 
  152.      * @param introspectedTable 
  153.      * @param tableName 
  154.      * @return 
  155.      */  
  156.     public XmlElement getUpdateBatchElement(IntrospectedTable introspectedTable, String tableName) {  
  157.         XmlElement updateBatchElement = new XmlElement("update");   
  158.         updateBatchElement.addAttribute(new Attribute("id""updateBatch"));  
  159.   
  160.         XmlElement foreachElement = NewForeachElement();  
  161.         XmlElement ifElement = NewIfElement(introspectedTable.getPrimaryKeyColumns());  
  162.   
  163.         StringBuilder sb = new StringBuilder();  
  164.         sb.append("update ").append(tableName);  
  165.         ifElement.addElement(new TextElement(sb.toString()));  
  166.   
  167.         // set up for first column  
  168.         sb.setLength(0);  
  169.         sb.append("set ");   
  170.   
  171.         Iterator<IntrospectedColumn> iter = introspectedTable.getNonPrimaryKeyColumns().iterator();  
  172.         while (iter.hasNext()) {  
  173.             IntrospectedColumn introspectedColumn = iter.next();  
  174.   
  175.             sb.append(MyBatis3FormattingUtilities.getAliasedEscapedColumnName(introspectedColumn));  
  176.             sb.append(" = ");  
  177.             sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, item + "."));  
  178.   
  179.             if (iter.hasNext()) {  
  180.                 sb.append(',');  
  181.             }  
  182.   
  183.             ifElement.addElement(new TextElement(sb.toString()));  
  184.   
  185.             // set up for the next column  
  186.             if (iter.hasNext()) {  
  187.                 sb.setLength(0);  
  188.                 OutputUtilities.xmlIndent(sb, 1);  
  189.             }  
  190.         }  
  191.           
  192.         boolean and = false;  
  193.         for (IntrospectedColumn introspectedColumn : introspectedTable.getPrimaryKeyColumns()) {  
  194.             sb.setLength(0);  
  195.             if (and) {  
  196.                 sb.append("  and ");  
  197.             } else {  
  198.                 sb.append("where ");  
  199.                 and = true;  
  200.             }  
  201.   
  202.             sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));  
  203.             sb.append(" = ");  
  204.             sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, item + "."));  
  205.             ifElement.addElement(new TextElement(sb.toString()));  
  206.         }  
  207.           
  208.         foreachElement.addElement(ifElement);  
  209.         updateBatchElement.addElement(foreachElement);  
  210.   
  211.         return updateBatchElement;  
  212.     }  
  213.       
  214.     /** 
  215.      * 批量添加 
  216.      * @param introspectedTable 
  217.      * @param tableName 
  218.      * @return 
  219.      */  
  220.     public XmlElement getInsertBatchElement(IntrospectedTable introspectedTable, String tableName) {  
  221.         XmlElement insertBatchElement = new XmlElement("insert");  
  222.         insertBatchElement.addAttribute(new Attribute("id""insertBatch"));  
  223.   
  224.         XmlElement foreachElement = NewForeachElement();  
  225.           
  226.         StringBuilder insertClause = new StringBuilder();  
  227.         StringBuilder valuesClause = new StringBuilder();  
  228.   
  229.         insertClause.append("insert into ");   
  230.         insertClause.append(tableName);  
  231.         insertClause.append(" (");  
  232.   
  233.         valuesClause.append("values (");  
  234.   
  235.         List<String> valuesClauses = new ArrayList<String>();  
  236.         Iterator<IntrospectedColumn> iter = introspectedTable.getAllColumns().iterator();  
  237.         while (iter.hasNext()) {  
  238.             IntrospectedColumn introspectedColumn = iter.next();  
  239.             if (introspectedColumn.isIdentity()) {  
  240.                 // cannot set values on identity fields  
  241.                 continue;  
  242.             }  
  243.   
  244.             insertClause.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));  
  245.             valuesClause.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, item + "."));  
  246.             if (iter.hasNext()) {  
  247.                 insertClause.append(", ");  
  248.                 valuesClause.append(", ");  
  249.             }  
  250.   
  251.             if (valuesClause.length() > 80) {  
  252.                 foreachElement.addElement(new TextElement(insertClause.toString()));  
  253.                 insertClause.setLength(0);  
  254.                 OutputUtilities.xmlIndent(insertClause, 1);  
  255.   
  256.                 valuesClauses.add(valuesClause.toString());  
  257.                 valuesClause.setLength(0);  
  258.                 OutputUtilities.xmlIndent(valuesClause, 1);  
  259.             }  
  260.         }  
  261.   
  262.         insertClause.append(')');  
  263.         foreachElement.addElement(new TextElement(insertClause.toString()));  
  264.   
  265.         valuesClause.append(')');  
  266.         valuesClauses.add(valuesClause.toString());  
  267.   
  268.         for (String clause : valuesClauses) {  
  269.             foreachElement.addElement(new TextElement(clause));  
  270.         }  
  271.           
  272.         insertBatchElement.addElement(foreachElement);  
  273.   
  274.         return insertBatchElement;  
  275.     }  
  276.       
  277.     /** 
  278.      * @return 
  279.      */  
  280.     public XmlElement NewForeachElement(){  
  281.         XmlElement foreachElement = new XmlElement("foreach");  
  282.         foreachElement.addAttribute(new Attribute("collection""list"));  
  283.         foreachElement.addAttribute(new Attribute("item", item));  
  284.         foreachElement.addAttribute(new Attribute("index""index"));  
  285.         foreachElement.addAttribute(new Attribute("separator"";"));  
  286.         return foreachElement;  
  287.     }  
  288.       
  289.     /** 
  290.      * @param primaryKeyColumns 
  291.      * @return 
  292.      */  
  293.     public XmlElement NewIfElement(List<IntrospectedColumn> primaryKeyColumns){  
  294.         StringBuilder sb = new StringBuilder();  
  295.         boolean flag = false;  
  296.         for (IntrospectedColumn introspectedColumn : primaryKeyColumns) {  
  297.             if (flag) {  
  298.                 sb.append(" and ");  
  299.                 sb.append(item).append(".");  
  300.                 sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));  
  301.                 sb.append(" != null");  
  302.             } else {  
  303.                 sb.append(item).append(".");  
  304.                 sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));  
  305.                 sb.append(" != null");  
  306.                 flag = true;  
  307.             }  
  308.         }  
  309.         XmlElement ifElement = new XmlElement("if");  
  310.         ifElement.addAttribute(new Attribute("test", sb.toString()));  
  311.         return ifElement;  
  312.     }  
  313. }  



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
mybatis
mybatis-generator Eclipse插件版 xml
一个生成json格式的类
一个ajax的例子(连动列表实现)
Java编程第43讲——实现前端后一体的Web服务器
源码分析 Mybatis 的 foreach 为什么会出现性能问题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服