Mybatis 通用Crud

前言(說明)

源碼地址:https://github.com/LittleNewbie/portaljava

mybatis版本 3.2.6mysql

mybatis crud 較爲簡陋,請移步至mybatis jpa :https://my.oschina.net/LittleNewbie/blog/895198git

實現功能:github

1.對單條數據的查詢、插入、更新、刪除。sql

2.批量插入,根據條件刪除,根據條件更新指定的列名-字段值。數據庫

<!-- 2017-02-18更新  start-->mybatis

1 主鍵類型不作限制;app

2 增長對Boolean類型、Number類型、Date類型的處理;測試

3 代碼優化;優化

<!-- 2017-02-18更新  end-->

<!-- 2016-11-13更新  start-->

1 新增批量操做數據方法:批量插入,根據條件刪除,根據條件更新指定的列名-字段值。

2 新增高級查詢方法:可設置查詢列,查詢條件,排序,分頁。

3 根據一、2更新接口。

<!-- 2016-11-13更新  end-->

<!-- 2016-11-17更新  start-->

感謝@瘋狂的逍遙 提出的問題和建議

1. GeneralMapper.xml文件移動至resources/mapping目錄下。

問題描述:

[classpath:com/svili/portal/mapping/*.xml]:
 class path resource [com/svili/portal/mapping/] cannot be resolved to URL because it does not exist

緣由:IDEA編譯時,src/java目錄下非.java文件不會寫入到容器。

2. GeneralMapper.xml文件修改,修復錯誤代碼。

緣由:緣由是筆者提交了測試代碼。

代碼明細:

<!-- 原代碼 -->
<insert id="insertSelective" parameterType="link">
<insert id="insertBatch" parameterType="link">

<!-- 修改後代碼 -->
<insert id="insertSelective" parameterType="map">
<insert id="insertBatch" parameterType="map">

<!-- 2016-11-17更新  end-->

約束

1.全面支持MySQL數據庫,Oracle目前只支持selectByPrimaryKey(),insert()。

2.java 實體類字段名爲駝峯風格,數據庫字段名爲下劃線風格。

3.每張表都必需要有一個主鍵字段,字段類型無限制。

4.必須在實體類中註明主鍵,表名(可選),使用JPA註解。

5.對於枚舉類型的處理,以枚舉ordinal()值,存取到數據庫中。

/**
*需引入JPA jar包 javax.persistence
*/
@Table(name="user")
public class User {
	
	@Id
	private Integer userId;
    ...
}

接口預覽

public interface CrudServiceInter {

	/**
	 * 根據主鍵查詢
	 * @param <T> pojo類
	 * @param clazz pojo類-class對象
	 * @param primaryValue  主鍵值
	 * @return pojo對象
	 */
	<T> T selectByPrimaryKey(Class<T> clazz, Object primaryValue) throws Exception;

	/**
	 * 插入數據
	 * <p>實際調用insertSelective</p>
	 * @param <T> pojo類
	 * @param t  pojo對象
	 * @return 數據條數
	 */
	<T> int insert(T t) throws Exception;

	/**
	 * 插入數據
	 * @param <T>  pojo類
	 * @param t  pojo對象
	 * @return 數據條數
	 */
	<T> int insertSelective(T t) throws Exception;

	/**
	 * 刪除
	 * <p>根據主鍵刪除 </p>
	 * @param <T> pojo類
	 * @param clazz  pojo類-class對象
	 * @param primaryValue 主鍵值
	 * @return 數據條數
	 */
	<T> int deleteByPrimaryKey(Class<T> clazz, Object primaryValue);

	/**
	 * 更新
	 * <p> 根據主鍵更新 </p>
	 * <p> 更新pojo的全部字段,包括空值(null值)字段 </p>
	 * @param <T>  pojo類
	 * @param t  pojo對象
	 * @return 數據條數
	 */
	<T> int updateByPrimaryKey(T t) throws Exception;

	/**
	 * 更新
	 * <p>根據主鍵更新</p>
	 * <p> 更新pojo的非空字段 </p>
	 * @param <T> pojo類
	 * @param t  pojo對象
	 * @return 數據條數
	 */
	<T> int updateByPrimaryKeySelective(T t) throws Exception;

   //2016-11-13更新
   /**
	 * 批量插入
	 *@param list 數據集
	 *@return 數據條數
	 *@throws Exception
	 */
	<T> int insertBatch(List<T> list) throws Exception;

   /**
	 * 刪除
	 * <p> 根據條件刪除</p>
	 * @param <T> pojo類
	 * @param clazz pojo類-class對象
	 * @param conditionExp 查詢條件 where 表達式 @see GeneralQueryParam
	 * @param conditionParam 查詢條件 where 表達式中的參數集 @see GeneralQueryParam
	 * @return 數據條數
	 */
	<T> int deleteByCondition(Class<T> clazz, String conditionExp, Map<String, Object> conditionParam);
   
   /**
	 * 更新
	 * <p>根據條件更新 </p>
	 * <p> 更新pojo的指定字段集</p>
	 * @param clazz  pojo類-class對象
	 * @param columnValueMapping   須要更新的列名-值,注意列名必須與數據庫中列名一致
	 * @param conditionExp  查詢條件 where 表達式 @see GeneralQueryParam
	 * @param conditionParam  查詢條件 where 表達式中的參數集 @see GeneralQueryParam
	 * @return 數據條數
	 */
	<T> int updateByConditionSelective(Class<T> clazz, Map<String, Object> columnValueMapping, String conditionExp,
			Map<String, Object> conditionParam) throws Exception;

   /**
	 * 高級查詢
	 * @param clazz pojo類-class對象
	 * @param queryParam 查詢參數
	 */
	<T> List<T> selectAdvanced(Class<T> clazz, GeneralQueryParam queryParam) throws Exception;

	/**
	 * 高級查詢,指定返回列
	 * 
	 * @param clazz pojo類-class對象
	 * @param queryParam 查詢參數
	 */
	<T> List<Map<String, Object>> selectAdvancedByColumn(Class<T> clazz, GeneralQueryParam queryParam) throws Exception;
}

使用中遇到的問題概括

1.java.lang.IllegalArgumentException:

Can not set java.lang.Integer field com.svili.portal.pojo.User.userId to java.lang.Long

緣由:mysql 中INT() UNSIGNED 無符號整型 會被mybatis自動映射爲Long類型,爲何?算下長度哈。

<!-- 2017-02-18更新start -- >

代碼對Number類型作了處理,會根據java實體類字段類型進行匹配。

<!-- 2017-02-18更新 end  -- >

2.查詢數據時,枚舉類型不能匹配。

緣由:mysql TINYINT(1) 會被mybatis自動映射爲boolean值,也就是說0-false,1-true。

布爾值怎麼和枚舉匹配噢!

解決方案:改下長度,如改成TINYINT(2),不要把TINYINT類型的長度設爲1。

 

關於設計思路

設計思路博文地址:https://my.oschina.net/LittleNewbie/blog/786783

歡迎探討!

相關文章
相關標籤/搜索