Mybatis 通用Crud

前言(说明)

源码地址:https://github.com/LittleNewbie/portal

mybatis版本 3.2.6

mybatis crud 较为简陋,请移步至mybatis jpa :https://my.oschina.net/LittleNewbie/blog/895198

实现功能:

1.对单条数据的查询、插入、更新、删除。

2.批量插入,根据条件删除,根据条件更新指定的列名-字段值。

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

1 主键类型不做限制;

2 增加对Boolean类型、Number类型、Date类型的处理;

3 代码优化;

<!-- 2017-02-18更新  end--> <!-- 2016-11-13更新  start-->

1 新增批量操作数据方法:批量插入,根据条件删除,根据条件更新指定的列名-字段值。

2 新增高级查询方法:可设置查询列,查询条件,排序,分页。

3 根据1、2更新接口。

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

感谢@疯狂的逍遥 提出的问题和建议

1. GeneralMapper.xml文件移动至resources/mapping目录下。

问题描述:

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

原因:IDEA编译时,src/java目录下非.java文件不会写入到容器。

2. GeneralMapper.xml文件修改,修复错误代码。

原因:原因是笔者提交了测试代码。

代码明细:

1<!-- 原代码 --> 2<insert id="insertSelective" parameterType="link"> 3<insert id="insertBatch" parameterType="link"> 4 5<!-- 修改后代码 --> 6<insert id="insertSelective" parameterType="map"> 7<insert id="insertBatch" parameterType="map">
<!-- 2016-11-17更新  end-->

约束

1.全面支持MySQL数据库,Oracle目前只支持selectByPrimaryKey(),insert()。

2.java 实体类字段名为驼峰风格,数据库字段名为下划线风格。

3.每张表都必须要有一个主键字段,字段类型无限制。

4.必须在实体类中注明主键,表名(可选),使用JPA注解。

5.对于枚举类型的处理,以枚举ordinal()值,存取到数据库中。

1/** 2*需引入JPA jar包 javax.persistence 3*/ 4@Table(name="user") 5public class User { 6 7 @Id 8 private Integer userId; 9 ... 10}

接口预览

1public interface CrudServiceInter { 2 3 /** 4 * 根据主键查询 5 * @param <T> pojo类 6 * @param clazz pojo类-class对象 7 * @param primaryValue 主键值 8 * @return pojo对象 9 */ 10 <T> T selectByPrimaryKey(Class<T> clazz, Object primaryValue) throws Exception; 11 12 /** 13 * 插入数据 14 * <p>实际调用insertSelective</p> 15 * @param <T> pojo类 16 * @param t pojo对象 17 * @return 数据条数 18 */ 19 <T> int insert(T t) throws Exception; 20 21 /** 22 * 插入数据 23 * @param <T> pojo类 24 * @param t pojo对象 25 * @return 数据条数 26 */ 27 <T> int insertSelective(T t) throws Exception; 28 29 /** 30 * 删除 31 * <p>根据主键删除 </p> 32 * @param <T> pojo类 33 * @param clazz pojo类-class对象 34 * @param primaryValue 主键值 35 * @return 数据条数 36 */ 37 <T> int deleteByPrimaryKey(Class<T> clazz, Object primaryValue); 38 39 /** 40 * 更新 41 * <p> 根据主键更新 </p> 42 * <p> 更新pojo的所有字段,包括空值(null值)字段 </p> 43 * @param <T> pojo类 44 * @param t pojo对象 45 * @return 数据条数 46 */ 47 <T> int updateByPrimaryKey(T t) throws Exception; 48 49 /** 50 * 更新 51 * <p>根据主键更新</p> 52 * <p> 更新pojo的非空字段 </p> 53 * @param <T> pojo类 54 * @param t pojo对象 55 * @return 数据条数 56 */ 57 <T> int updateByPrimaryKeySelective(T t) throws Exception; 58 59 //2016-11-13更新 60 /** 61 * 批量插入 62 *@param list 数据集 63 *@return 数据条数 64 *@throws Exception 65 */ 66 <T> int insertBatch(List<T> list) throws Exception; 67 68 /** 69 * 删除 70 * <p> 根据条件删除</p> 71 * @param <T> pojo类 72 * @param clazz pojo类-class对象 73 * @param conditionExp 查询条件 where 表达式 @see GeneralQueryParam 74 * @param conditionParam 查询条件 where 表达式中的参数集 @see GeneralQueryParam 75 * @return 数据条数 76 */ 77 <T> int deleteByCondition(Class<T> clazz, String conditionExp, Map<String, Object> conditionParam); 78 79 /** 80 * 更新 81 * <p>根据条件更新 </p> 82 * <p> 更新pojo的指定字段集</p> 83 * @param clazz pojo类-class对象 84 * @param columnValueMapping 需要更新的列名-值,注意列名必须与数据库中列名一致 85 * @param conditionExp 查询条件 where 表达式 @see GeneralQueryParam 86 * @param conditionParam 查询条件 where 表达式中的参数集 @see GeneralQueryParam 87 * @return 数据条数 88 */ 89 <T> int updateByConditionSelective(Class<T> clazz, Map<String, Object> columnValueMapping, String conditionExp, 90 Map<String, Object> conditionParam) throws Exception; 91 92 /** 93 * 高级查询 94 * @param clazz pojo类-class对象 95 * @param queryParam 查询参数 96 */ 97 <T> List<T> selectAdvanced(Class<T> clazz, GeneralQueryParam queryParam) throws Exception; 98 99 /** 100 * 高级查询,指定返回列 101 * 102 * @param clazz pojo类-class对象 103 * @param queryParam 查询参数 104 */ 105 <T> List<Map<String, Object>> selectAdvancedByColumn(Class<T> clazz, GeneralQueryParam queryParam) throws Exception; 106}

使用中遇到的问题归纳

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](https://my.oschina.net/LittleNewbie/blog/786783) 欢迎探讨!
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )