源碼地址: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
歡迎探討!