1. 程式人生 > >整合maven+mybatis+generator生成java自定義model實體類,dao介面和mapper對映檔案

整合maven+mybatis+generator生成java自定義model實體類,dao介面和mapper對映檔案

通過繼承PluginAdapter類,開發自定義外掛,生成自定義的中文註解的java實體類,dao介面和mapper對映檔案.

1.pom.xml新增依賴的jar包:

	<dependencies>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.30</version>
        </dependency>
        <!--Mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!-- Mybatis Generator -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>
	</dependencies>

2.配置generatorConfig.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>
	<!-- 引入配置檔案 -->
	<properties resource="jdbc.properties" />

	<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
		<property name="beginningDelimiter" value="`" />
		<property name="endingDelimiter" value="`" />
		<!-- 生成的檔案編碼 -->
		<property name="javaFileEncoding" value="utf-8"/>
		<!-- 通過自定義外掛類生成自定義註解和介面 -->
		<plugin type="com.xe.demo.common.generator.GenPlugin">
			<property name="mappers" value="com.xe.demo.mapper.BaseMapper" />
		</plugin>
		<commentGenerator>
			<!-- 取消生成註釋 -->
			<property name="suppressAllComments" value="true"/>
		</commentGenerator>
		<!-- 資料庫連線屬性 -->
		<jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}" />
		<!-- 生成實體類配置 -->
		<javaModelGenerator targetPackage="com.xe.demo.model" targetProject="src/main/java" />
		<!-- 生成對映檔案配置 -->
		<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources" />
		<!-- 生成對映介面配置 -->
		<javaClientGenerator targetPackage="com.xe.demo.mapper" targetProject="src/main/java" type="XMLMAPPER" />
		
		<table tableName="%">
			<!--mysql 配置 -->
			<generatedKey column="id" sqlStatement="Mysql" identity="true" />
		</table>
	</context>
</generatorConfiguration>
以上配置完成,其實就通過generator可以生成預設的程式碼了,但是我們想生成我們自定義的程式碼,就需要繼承PluginAdapter開發自定義外掛來實現:
3.建立GenPlugin.java繼承PluginAdapter:

1).把資料庫欄位的註釋作為生成的實體類欄位註釋,建立GenCommentGenerator.java類,實現CommentGenerator.java,具體實現如下:

	/**
	 * 給欄位新增資料庫備註
	 * @param field
	 * @param introspectedTable
	 * @param introspectedColumn
	 */
	@Override
	public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
		if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
			field.addJavaDocLine("//" + introspectedColumn.getRemarks());
		}
	}
	/**
	 * getter方法註釋
	 * @param method
	 * @param introspectedTable
	 * @param introspectedColumn
	 */
	@Override
	public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
		StringBuilder sb = new StringBuilder();
		method.addJavaDocLine("/**");
		if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
			sb.append(" * 獲取");
			sb.append(introspectedColumn.getRemarks());
			method.addJavaDocLine(sb.toString());
			method.addJavaDocLine(" *");
		}
		sb.setLength(0);
		sb.append(" * @return ");
		sb.append(introspectedColumn.getActualColumnName());
		if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
			sb.append(" - ");
			sb.append(introspectedColumn.getRemarks());
		}
		method.addJavaDocLine(sb.toString());
		method.addJavaDocLine(" */");
	}
	/**
	 * setter方法註釋
	 * @param method
	 * @param introspectedTable
	 * @param introspectedColumn
	 */
	@Override
	public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
		StringBuilder sb = new StringBuilder();
		method.addJavaDocLine("/**");
		if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
			sb.append(" * 設定");
			sb.append(introspectedColumn.getRemarks());
			method.addJavaDocLine(sb.toString());
			method.addJavaDocLine(" *");
		}
		Parameter parm = method.getParameters().get(0);
		sb.setLength(0);
		sb.append(" * @param ");
		sb.append(parm.getName());
		if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
			sb.append(" ");
			sb.append(introspectedColumn.getRemarks());
		}
		method.addJavaDocLine(sb.toString());
		method.addJavaDocLine(" */");
	}
在GenPlugin.java重寫方法setContext:
	// 註釋生成器
	private CommentGeneratorConfiguration commentCfg;
	@Override
	public void setContext(Context context) {
		super.setContext(context);
		// 設定預設的註釋生成器
		commentCfg = new CommentGeneratorConfiguration();
		commentCfg.setConfigurationType(GenCommentGenerator.class.getCanonicalName());
		context.setCommentGeneratorConfiguration(commentCfg);
		// 支援oracle獲取註釋#114
		context.getJdbcConnectionConfiguration().addProperty("remarksReporting", "true");
	}
2).建立基礎mapper介面BaseMapper.java,重寫clientGenerated方法,讓generator自動生成的介面繼承BaseMapper.java:
package com.xe.demo.mapper;

import java.io.Serializable;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.xe.demo.common.pojo.PageModel;

/**
 * Mybatis基礎DAO
 * @author 蔡澤華
 */
public interface BaseMapper<T> {

	/**
	 * 通過ID查詢
	 * @param id
	 * @return
	 */
	Object selectById(Serializable id);
	
	/**
	 * 查詢單條記錄
	 * @param entity
	 * @return
	 */
	Object selectOne(@Param("item")Object obj);

	/**
	 * 查詢記錄集合
	 * @param entity
	 * @return
	 */
	List<?> selectList(@Param("item")Object obj);
	
	/**
	 * 分頁查詢
	 * @param t
	 * @param page
	 * @return
	 */
	List<T> selectPage(@Param("item")Object obj, @Param("page")PageModel page);

	/**
	 * 通用的儲存方法
	 * @param <T>
	 * @param entity
	 */
	void save(@Param("item")Object obj);
	
	/**
	 * 批量儲存
	 * @param list
	 */
	int batchSave(List<?> list);

	/**
	 * 通用的修改方法
	 * @param <T>
	 * @param entity
	 */
	int update(@Param("item")Object obj);
	
	/**
	 * 批量更新
	 * @param list
	 * @return
	 */
	int batchUpdate(List<?> list);

	/**
	 * 刪除方法
	 * @param id
	 */
	int delById(Serializable id);
	
	/**
	 * 批量刪除
	 * @param list
	 * @return
	 */
	int delList(List<?> list);

	/**
	 * 批量刪除方法
	 * @param ids
	 */
	int delArray(int[] ids);

	/**
	 * 統計查詢
	 * @param <T>
	 * @param params 查詢引數
	 * @return 總記錄條數
	 */
	int count(Object obj);

}
	private Set<String> mappers = new HashSet<String>();
	@Override
	public void setProperties(Properties properties) {
		super.setProperties(properties);
		String mappers = this.properties.getProperty("mappers");
		for (String mapper : mappers.split(",")) {
			this.mappers.add(mapper);
		}
	}

	/**
	 * 生成的Mapper介面
	 * @param interfaze
	 * @param topLevelClass
	 * @param introspectedTable
	 * @return
	 */
	@Override
	public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
		// 獲取實體類
		FullyQualifiedJavaType entityType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
		// import介面
		for (String mapper : mappers) {
			interfaze.addImportedType(new FullyQualifiedJavaType(mapper));
			interfaze.addSuperInterface(new FullyQualifiedJavaType(mapper + "<" + entityType.getShortName() + ">"));
		}
		// import實體類
		interfaze.addImportedType(entityType);
		return true;
	}
3).重寫sqlMapDocumentGenerated方法,讓生成BaseMapper.java介面對應的對映檔案:
	/**
	 * 拼裝SQL語句生成Mapper介面對映檔案
	 */
	@Override
	public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
		XmlElement rootElement = document.getRootElement();
		// 資料庫表名
		String tableName = introspectedTable.getFullyQualifiedTableNameAtRuntime();
		// 主鍵
		IntrospectedColumn pkColumn = introspectedTable.getPrimaryKeyColumns().get(0);

		// 公共欄位
		StringBuilder columnSQL = new StringBuilder();
		// IF判斷語句
		StringBuilder ifSQL = new StringBuilder();
		// 要插入的欄位(排除自增主鍵)
		StringBuilder saveColumn = new StringBuilder("insert into ").append(tableName).append("(\n");
		// 要儲存的值
		StringBuilder saveValue = new StringBuilder("(\n");
		// 拼裝更新欄位
		StringBuilder updateSQL = new StringBuilder("update ").append(tableName).append(" set ").append(pkColumn.getActualColumnName())
				.append(" = #{item.").append(pkColumn.getJavaProperty()).append("}\n");

		// 資料庫欄位名
		String columnName = null;
		// java欄位名
		String javaProperty = null;
		for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
			columnName = MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn);
			javaProperty = introspectedColumn.getJavaProperty();
			// 拼接欄位
			columnSQL.append(columnName).append(",");
			// 拼接IF語句
			ifSQL.append("      <if test=\"null != item.").append(javaProperty).append(" and '' != item.").append(javaProperty).append("\">");
			ifSQL.append("and ").append(columnName).append(" = #{item.").append(javaProperty).append("}</if>\n");

			// 拼接SQL
			if (!introspectedColumn.isAutoIncrement()) {
				saveColumn.append("\t  <if test=\"null != item.").append(javaProperty).append("\">, ").append(columnName).append("</if>\n");

				saveValue.append("\t  <if test=\"null != item.").append(javaProperty).append("\">, ").append("#{item.").append(javaProperty)
						.append("}</if>\n");

				updateSQL.append("      <if test=\"null != item.").append(javaProperty).append("\">");
				updateSQL.append(", ").append(columnName).append(" = #{item.").append(javaProperty).append("}</if>\n");
			}
		}
		String columns = columnSQL.substring(0, columnSQL.length() - 1);
		rootElement.addElement(createSql("sql_columns", columns));

		String whereSQL = MessageFormat.format("<where>\n{0}\t</where>", ifSQL.toString());
		rootElement.addElement(createSql("sql_where", whereSQL));

		rootElement.addElement(createSelect("selectById", tableName, pkColumn));
		rootElement.addElement(createSelect("selectOne", tableName, null));
		rootElement.addElement(createSelect("selectList", tableName, null));
		rootElement.addElement(createSelect("selectPage", tableName, null));

		rootElement.addElement(createSql("sql_save_columns", saveColumn.append("\t) values").toString().replaceFirst(",", "")));
		rootElement.addElement(createSql("sql_save_values", saveValue.append("\t)").toString().replaceFirst(",", "")));
		rootElement.addElement(createSave("save", pkColumn));
		rootElement.addElement(createSave("batchSave", null));

		updateSQL.append("\twhere ").append(pkColumn.getActualColumnName()).append(" = #{item.").append(pkColumn.getJavaProperty()).append("}");
		rootElement.addElement(createSql("sql_update", updateSQL.toString()));

		rootElement.addElement(createUpdate("update"));
		rootElement.addElement(createUpdate("batchUpdate"));

		rootElement.addElement(createDels(tableName, pkColumn, "delArray", "array"));
		rootElement.addElement(createDels(tableName, pkColumn, "delList", "list"));
		return super.sqlMapDocumentGenerated(document, introspectedTable);
	}

	/**
	 * 公共SQL
	 * @param id
	 * @param sqlStr
	 * @return
	 */
	private XmlElement createSql(String id, String sqlStr) {
		XmlElement sql = new XmlElement("sql");
		sql.addAttribute(new Attribute("id", id));
		sql.addElement(new TextElement(sqlStr));
		return sql;
	}

	/**
	 * 查詢
	 * @param id
	 * @param tableName
	 * @param pkColumn
	 * @return
	 */
	private XmlElement createSelect(String id, String tableName, IntrospectedColumn pkColumn) {
		XmlElement select = new XmlElement("select");
		select.addAttribute(new Attribute("id", id));
		select.addAttribute(new Attribute("resultMap", "BaseResultMap"));

		StringBuilder selectStr = new StringBuilder("select <include refid=\"sql_columns\" /> from ").append(tableName);
		if (null != pkColumn) {
			selectStr.append(" where ").append(pkColumn.getActualColumnName()).append(" = #{").append(pkColumn.getJavaProperty()).append("}");
		} else {
			selectStr.append(" <include refid=\"sql_where\" />");
		}
		if ("selectPage".equals(id)) {
			selectStr.append(" limit #{page.startRow}, #{page.pageSize}");
		}
		select.addElement(new TextElement(selectStr.toString()));
		return select;
	}

	/**
	 * 儲存
	 * @param id
	 * @param pkColumn
	 * @return
	 */
	private XmlElement createSave(String id, IntrospectedColumn pkColumn) {
		XmlElement save = new XmlElement("insert");
		save.addAttribute(new Attribute("id", id));
		if (null != pkColumn) {
			save.addAttribute(new Attribute("keyProperty", "item." + pkColumn.getJavaProperty()));
			save.addAttribute(new Attribute("useGeneratedKeys", "true"));
			save.addElement(new TextElement("<include refid=\"sql_save_columns\" /><include refid=\"sql_save_values\" />"));
		} else {
			StringBuilder saveStr = new StringBuilder(
					"<foreach collection=\"list\" index=\"index\" item=\"item\" open=\"\" separator=\";\" close=\"\">\n\t  ")
							.append("<include refid=\"sql_save_columns\" /><include refid=\"sql_save_values\" />\n\t</foreach>");
			save.addElement(new TextElement(saveStr.toString()));
		}
		return save;
	}

	/**
	 * 更新
	 * @param id
	 * @return
	 */
	private XmlElement createUpdate(String id) {
		XmlElement update = new XmlElement("update");
		update.addAttribute(new Attribute("id", id));
		if ("update".equals(id)) {
			update.addElement(new TextElement("<include refid=\"sql_update\" />"));
		} else {
			update.addElement(new TextElement(
					"<foreach collection=\"list\" index=\"index\" item=\"item\" open=\"\" separator=\";\" close=\"\">\n\t  <include refid=\"sql_update\" />\n\t</foreach>"));
		}
		return update;
	}

	/**
	 * 刪除
	 * @param tableName
	 * @param pkColumn
	 * @param method
	 * @param type
	 * @return
	 */
	private XmlElement createDels(String tableName, IntrospectedColumn pkColumn, String method, String type) {
		XmlElement delete = new XmlElement("delete");
		delete.addAttribute(new Attribute("id", method));
		StringBuilder deleteStr = new StringBuilder("delete from ").append(tableName).append(" where ").append(pkColumn.getActualColumnName())
				.append(" in\n\t")
				.append("<foreach collection=\"").append(type)
				.append("\" index=\"index\" item=\"item\" open=\"(\" separator=\",\" close=\")\">#{item}</foreach>");
		delete.addElement(new TextElement(deleteStr.toString()));
		return delete;
	}
4.執行GenMain.java方法:
package com.xe.demo;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

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

public class GenMain {
	public static void main(String[] args) {
		//讀取檔案
		File configFile = new File(GenMain.class.getResource("/generatorConfig.xml").getFile());
		List<String> warnings = new ArrayList<String>();
		ConfigurationParser cp = new ConfigurationParser(warnings);
		Configuration config = null;
		//true:覆蓋生成
		DefaultShellCallback callback = new DefaultShellCallback(true);
		MyBatisGenerator myBatisGenerator = null;
		try {
			config = cp.parseConfiguration(configFile);
			myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
			myBatisGenerator.generate(null);
			System.err.println("程式碼成功生成!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
執行完重新整理專案,專案結構前後對比:

下面是自動生成的程式碼:

package com.xe.demo.model;

import java.math.BigDecimal;

public class IMemberOrders {
    private Long oid;

    //訂單號
    private String ordercode;

    //暱稱
    private String nickname;

    //商品名
    private String shopname;

    //購買數量
    private Short buycount;

    //當次花費
    private BigDecimal paycount;

    //購買時間
    private String buytime;

    /**
     * @return oid
     */
    public Long getOid() {
        return oid;
    }

    /**
     * @param oid
     */
    public void setOid(Long oid) {
        this.oid = oid;
    }

    /**
     * 獲取訂單號
     *
     * @return ordercode - 訂單號
     */
    public String getOrdercode() {
        return ordercode;
    }

    /**
     * 設定訂單號
     *
     * @param ordercode 訂單號
     */
    public void setOrdercode(String ordercode) {
        this.ordercode = ordercode;
    }

    /**
     * 獲取暱稱
     *
     * @return nickname - 暱稱
     */
    public String getNickname() {
        return nickname;
    }

    /**
     * 設定暱稱
     *
     * @param nickname 暱稱
     */
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    /**
     * 獲取商品名
     *
     * @return shopname - 商品名
     */
    public String getShopname() {
        return shopname;
    }

    /**
     * 設定商品名
     *
     * @param shopname 商品名
     */
    public void setShopname(String shopname) {
        this.shopname = shopname;
    }

    /**
     * 獲取購買數量
     *
     * @return buycount - 購買數量
     */
    public Short getBuycount() {
        return buycount;
    }

    /**
     * 設定購買數量
     *
     * @param buycount 購買數量
     */
    public void setBuycount(Short buycount) {
        this.buycount = buycount;
    }

    /**
     * 獲取當次花費
     *
     * @return paycount - 當次花費
     */
    public BigDecimal getPaycount() {
        return paycount;
    }

    /**
     * 設定當次花費
     *
     * @param paycount 當次花費
     */
    public void setPaycount(BigDecimal paycount) {
        this.paycount = paycount;
    }

    /**
     * 獲取購買時間
     *
     * @return buytime - 購買時間
     */
    public String getBuytime() {
        return buytime;
    }

    /**
     * 設定購買時間
     *
     * @param buytime 購買時間
     */
    public void setBuytime(String buytime) {
        this.buytime = buytime;
    }
}
package com.xe.demo.mapper;

import com.xe.demo.model.IMemberOrders;

public interface IMemberOrdersMapper extends BaseMapper<IMemberOrders> {
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xe.demo.mapper.IMemberOrdersMapper">
  <resultMap id="BaseResultMap" type="com.xe.demo.model.IMemberOrders">
    <id column="oid" jdbcType="BIGINT" property="oid" />
    <result column="ordercode" jdbcType="VARCHAR" property="ordercode" />
    <result column="nickname" jdbcType="VARCHAR" property="nickname" />
    <result column="shopname" jdbcType="VARCHAR" property="shopname" />
    <result column="buycount" jdbcType="SMALLINT" property="buycount" />
    <result column="paycount" jdbcType="DECIMAL" property="paycount" />
    <result column="buytime" jdbcType="VARCHAR" property="buytime" />
  </resultMap>
  <sql id="sql_columns">
    oid,ordercode,nickname,shopname,buycount,paycount,buytime
  </sql>
  <sql id="sql_where">
    <where>
      <if test="null != item.oid and '' != item.oid">and oid = #{item.oid}</if>
      <if test="null != item.ordercode and '' != item.ordercode">and ordercode = #{item.ordercode}</if>
      <if test="null != item.nickname and '' != item.nickname">and nickname = #{item.nickname}</if>
      <if test="null != item.shopname and '' != item.shopname">and shopname = #{item.shopname}</if>
      <if test="null != item.buycount and '' != item.buycount">and buycount = #{item.buycount}</if>
      <if test="null != item.paycount and '' != item.paycount">and paycount = #{item.paycount}</if>
      <if test="null != item.buytime and '' != item.buytime">and buytime = #{item.buytime}</if>
	</where>
  </sql>
  <select id="selectById" resultMap="BaseResultMap">
    select <include refid="sql_columns" /> from i_member_orders where oid = #{oid}
  </select>
  <select id="selectOne" resultMap="BaseResultMap">
    select <include refid="sql_columns" /> from i_member_orders <include refid="sql_where" />
  </select>
  <select id="selectList" resultMap="BaseResultMap">
    select <include refid="sql_columns" /> from i_member_orders <include refid="sql_where" />
  </select>
  <select id="selectPage" resultMap="BaseResultMap">
    select <include refid="sql_columns" /> from i_member_orders <include refid="sql_where" /> limit #{page.startRow}, #{page.pageSize}
  </select>
  <sql id="sql_save_columns">
    insert into i_member_orders(
	  <if test="null != item.ordercode"> ordercode</if>
	  <if test="null != item.nickname">, nickname</if>
	  <if test="null != item.shopname">, shopname</if>
	  <if test="null != item.buycount">, buycount</if>
	  <if test="null != item.paycount">, paycount</if>
	  <if test="null != item.buytime">, buytime</if>
	) values
  </sql>
  <sql id="sql_save_values">
    (
	  <if test="null != item.ordercode"> #{item.ordercode}</if>
	  <if test="null != item.nickname">, #{item.nickname}</if>
	  <if test="null != item.shopname">, #{item.shopname}</if>
	  <if test="null != item.buycount">, #{item.buycount}</if>
	  <if test="null != item.paycount">, #{item.paycount}</if>
	  <if test="null != item.buytime">, #{item.buytime}</if>
	)
  </sql>
  <insert id="save" keyProperty="item.oid" useGeneratedKeys="true">
    <include refid="sql_save_columns" /><include refid="sql_save_values" />
  </insert>
  <insert id="batchSave">
    <foreach collection="list" index="index" item="item" open="" separator=";" close="">
	  <include refid="sql_save_columns" /><include refid="sql_save_values" />
	</foreach>
  </insert>
  <sql id="sql_update">
    update i_member_orders set oid = #{item.oid}
      <if test="null != item.ordercode">, ordercode = #{item.ordercode}</if>
      <if test="null != item.nickname">, nickname = #{item.nickname}</if>
      <if test="null != item.shopname">, shopname = #{item.shopname}</if>
      <if test="null != item.buycount">, buycount = #{item.buycount}</if>
      <if test="null != item.paycount">, paycount = #{item.paycount}</if>
      <if test="null != item.buytime">, buytime = #{item.buytime}</if>
	where oid = #{item.oid}
  </sql>
  <update id="update">
    <include refid="sql_update" />
  </update>
  <update id="batchUpdate">
    <foreach collection="list" index="index" item="item" open="" separator=";" close="">
	  <include refid="sql_update" />
	</foreach>
  </update>
  <delete id="delArray">
    delete from i_member_orders where oid in
	<foreach collection="array" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
  </delete>
  <delete id="delList">
    delete from i_member_orders where oid in
	<foreach collection="list" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
  </delete>
</mapper>
原始碼下載地址: