最近在项目中用到springBoot+tkMybatis,在开发使用过程中遇到一些问题,现在做下记录总结。本文主要针对tkMybatis的使用进行总结。
一、新增
insert:根据对象T的属性,生成插入语句,并返回影响的行数
备注:NULL字段也会插入进行; 但是需要指定该字段的jdbcType,否则抛出错误(Oracle是个奇葩,其它好多数据库都可以,不抛错);如何指定字段的jdbcType,参见高级用法;如果T对象中有字段不想插入,可以配置注解insertable=false;如果T对象中有字段不想插入,可以配置注解Transient(该字段不参与自动生成语句);
User user = newUser();
user.setId(101);
user.setUsername("admin");
user.setPassword("123456");
user.setEmail("");
userDAO.insert(user);
相当于:insert into user(ID,username,password,email) values(101,'admin','123456','');
insertSelective:保存一个实体,null的属性不会保存,会使用数据库默认值
备注:NULL字段不会被插入进去,因此对象T的属性不要使用8大简单类型;需要使用其包装类,我们实际环境运用中常常是该函数(空属性不插入);其余特性和insert相同;
二、删除
delete:根据对象T的参数,进行绝对匹配,并删除该记录返回删除的行数
备注:该方法如果入参为null,则删除的是表的所有数;该方法如果入参为new T(),则删除的是表的所有数;条件采用的是绝对匹配;如果配置参数safeDelete没有指定,是不允许空条件删除,会抛错(参加高级参数配置部分);
deleteByPrimaryKey:根据主键对象,进行删除该主键所表述的记录,并返回删除的行数
备注: 如果<T>是单主键,那么直接传递主键对象即可,例如long、String等;如果<T>是复合主键,可以传递<T>对象,对象的复合主键都存在值;或者传递Map,其中key为复合主键的key,也是可以的;复合主键情况用的较少;
userDAO.deleteByPrimaryKey(101);
相当于:delete from user where id=101
三、修改
updateByPrimaryKey:根据对象T的参数的主键数据,进行更新该记录
备注:主键数据必须存在;如果T对象中的属性为NULL,也会更新到数据库中,但需要设置jdbcType;(Oracle是个奇葩,其它好多数据库都可以,不抛错);如何指定字段的jdbcType,参见高级用法;如果T对象中有字段不想更新,可以配置注解updateable=false;如果T对象中有字段不想更新,可以配置注解Transient(该字段不参与自动生成语句);
User user =new User();
user.setId(101);
user.setUsername("joe");
user.setPassword("joe");
user.setEmail("");
userDAO.updateByPrimaryKey(user);
相当于:update user set username='joe',password='joe',email='' where id=101
updateByPrimaryKeySelective :根据对象T的参数的主键数据,进行更新该记录
备注:主键数据必须存在;如果T对象中的属性为NULL,不会更新到数据库中;如果T对象中有字段不想更新,可以配置注解updateable=false;如果T对象中有字段不想更新,可以配置注解Transient(该字段不参与自动生成语句);需要使用其包装类,我们实际环境运用中常常是该函数(空属性不更新);
User user =new User();
user.setId(101);
user.setPassword("123456");
userDAO.updateByPrimaryKeySelective(user);
相当于:update user set password='123456' where id=101
updateByExample :
UserExample example =new UserExample();
Criteria criteria = example.createCriteria();
criteria.andIDEqualTo("101");
User user =new User();
user.setPassword("123");
userDAO.updateByExample (user,example);
相当于:updateuser set password='123' where ID='101'
四、查询
selectAll:查询表中所有记录,并返回<T>对象的集合
备注:该方法一般用于小表的全表查询,不适用于数据量达到或者超过K级别的情况
select:根据入参的条件,进行绝对匹配筛选,并返回<T>对象的集合
备注:该方法如果入参为null,则和selectAll的效果是一致的;该方法如果入参对象存在,但是其属性都是null,则和selectAll的效果是一致的;
selectByRowBounds :根据入参的条件进行分页,进行绝对匹配筛选,并返回<T>对象的集合
备注:该方法与select一样,只是重载了一个带RowBounds的参数(不允许为null);因Mapper本身不支持方法重名,因此就更换了函数名;如果外部分页查询是拦截RowBounds参数的,可以直接无缝对接;
selectOne :根据入参的条件,进行绝对匹配筛选,并返回<T>对象
备注:该方法如果查询到0-1个结果,则返回null或者<T>;如果该方法的条件查询到多个,则抛出TooManyResultsException错误;
selectCount :根据入参的条件,进行绝对匹配筛选,并返回符合条件的结果总数
备注:该方法如果入参为null,则返回的是表的记录总数;条件采用的是绝对匹配;
selectByPrimaryKey :根据主键对象,查询该主键所表示的<T>对象
备注:如果<T>是单主键,那么直接传递主键对象即可,例如long、String等;如果<T>是复合主键,可以传递<T>对象,对象的复合主键都存在值;或者传递Map,其中key为复合主键的key,也是可以的;复合主键情况用的较少;
User user = userDAO.selectByPrimaryKey(100);
相当于:select * from user where id = 100
existsWithPrimaryKey :根据主键对象,判断该主键所表示的<T>记录是否存在
备注:和selectByPrimaryKey函数作用一致,仅采用 0,1 结合rs.getBoolean来做返回值
5、时间查询
在使用example进行时间段查询时,需将时间转换成与DB中对应的时间格式字符串,然后再进行查询,否则会无法查询到结果。
例如:
Example.Criteria criteria = example.createCriteria();
if (null != layerBatchServiceDTO) {
SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (null != layerBatchServiceDTO.getStartTime()) {
criteria.andGreaterThanOrEqualTo("createTime", dateFormat.format(layerBatchServiceDTO.getStartTime()));
}
if (null != layerBatchServiceDTO.getEndTime()) {
criteria.andLessThanOrEqualTo("createTime", dateFormat.format(layerBatchServiceDTO.getEndTime()));
}
}
本文部分内容参考:https://blog.csdn.net/sinat_38419207/article/details/82907387