实例化对象.deleteById()
@Override
protected Serializable pkVal() {
/**
* AR 模式这个必须有,否则 xxById 的方法都将失效!
* 另外 UserMapper 也必须 AR 依赖该层注入,有可无 XML
*/
return id;
}
@TableId(value = "id", type = IdType.AUTO)
该注解,效果等同上面transient
修饰词,否则逻辑删除也会不生效@TableField(fill = FieldFill.INSERT)
,这里FieldFill
有四种选择,如下,它默认是不做处理的,所以一定要填个public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入填充字段
*/
INSERT,
/**
* 更新填充字段
*/
UPDATE,
/**
* 插入和更新填充字段
*/
INSERT_UPDATE
}
//可直接在这里定义方法列表,默认只有在类上加注解才会支持方法
@QuerySupport("selectPageByCustomWithXml")
public interface UserMapper extends BaseMapper<User> {
String JOIN_SQL = "SELECT user.*, role.name as role_name, role.create_time as role_create_time FROM user as user LEFT JOIN role as role ON user.role_id = role.id";
@QuerySupport
@Select("SELECT user.*, role.name as role_name, role.create_time as role_create_time FROM user as user LEFT JOIN role as role ON user.role_id = role.id")
List<UserRoleVO> findUserWithRoleByVoWithQueryList(@Param(Constants.WRAPPER) QueryWrapper<UserRoleVO> wrapper);
@QuerySupport
@Select(JOIN_SQL)
List<User> selectListByCustom(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
/**
* 使用mybatis-plus自定义分页查询,使用resultMap将结果解析到关联对象中
*
* @param page 必须为第一个参数
* @param wrapper
* @return
*/
//类型优先级 (若未存在注解,当类型与mapper泛型不一致时使用其本身) @ResultType > @ResultMap > @Table(在类型一致时应用存在的resultMap)
@ResultMap("userCascadeResult")
@QuerySupport
@Select({"<script>", JOIN_SQL, "</script>"})
Page<User> selectPageByCustom(Page<User> page, @Param(Constants.WRAPPER) Wrapper<User> wrapper);
@QuerySupport
Page<User> selectPageByCustomWithXml(Page<User> page, @Param(Constants.WRAPPER) Wrapper<User> wrapper);
@QuerySupport
@Select({JOIN_SQL, "WHERE user.id = #{id}"})
User selectCascadeById(Serializable id);
@ResultMap("userCascadeResult")
@Select({JOIN_SQL, "WHERE user.id = #{id}"})
User selectCascadeById2(Serializable id);
@QuerySupport
@Select({"${text}"})
List<User> selectByText(@Param("text") String text, @Param(Constants.WRAPPER) Wrapper<User> wrapper);
/**
* Wrapper支持select指定列的方式
* @param wrapper
* @return
*/
@QuerySupport
@Select("SELECT %s FROM user as user LEFT JOIN role as role ON user.role_id = role.id")
List<UserRoleVO> findUserWithRoleByVoWithQueryListAndColumns(@Param(Constants.WRAPPER) Wrapper<UserRoleVO> wrapper);
@ResultMap("userNotCascadeResult")
@QuerySupport
@Select("SELECT %s FROM user")
Page<User> selectPageByCustomWithAssociationAndColumns(Page<User> page, @Param(Constants.WRAPPER) Wrapper<User> wrapper);
}
<select id="selectPageByCustomWithXml" resultMap="userCascadeResult">
SELECT user.*,
role.name as role_name,
role.create_time as role_create_time
FROM user as user
LEFT JOIN role as role
ON user.role_id = role.id
</select>
@Resource
private UserMapper mapper;
mapper.insert(
new User().setId(10086L)
.setName("miemie")
.setEmail("miemie@baomidou.com")
.setAge(3));
mapper.delete(new QueryWrapper<User>()
.lambda().eq(User::getName, "Sandy"))
mapper.update(
new User().setEmail("miemie@baomidou.com"),
new QueryWrapper<User>()
.lambda().eq(User::getId, 2)
);
User user = mapper.selectOne(new QueryWrapper<User>().lambda().eq(User::getId, 10086));
List<User> users = mapper.selectList(Wrappers.<User>query().orderByAsc("age"));
transient
,利用jackson或fastjson,在返回前端的时候对它做处理去掉对应的字段,但同时我们又遇到个问题,比如del_flag
,该字段往往前端不需要,但又不能加transient
,原因上面也说了会导致逻辑删除功能失效,这时,还有个办法解决@TableField(select = false)
,表示在进行sql查询时,去掉该字段的查询,这是在sql层面去掉该字段的查询,当然,如果你明确sql要查询这个字段还是可以查的 /**
* 添加transient会导致逻辑删除模式失效
*/
@ApiModelProperty(value = "是否删除:0-正常 1-软删除")
@TableLogic
@TableField(select = false)
private Integer delFlag;
System.out.println("----- 带子查询(sql注入) ------");
List<User> plainUsers2 = userMapper.selectList(new QueryWrapper<User>()
.inSql("role_id", "select id from role where id = 2"));
List<User> lambdaUsers2 = userMapper.selectList(new QueryWrapper<User>().lambda()
.inSql(User::getRoleId, "select id from role where id = 2"));
Assert.assertEquals(plainUsers2.size(), lambdaUsers2.size());
print(plainUsers2);
System.out.println("----- 带嵌套查询 ------");
List<User> plainUsers3 = userMapper.selectList(new QueryWrapper<User>()
.nested(i -> i.eq("role_id", 2L).or().eq("role_id", 3L))
.and(i -> i.ge("age", 20)));
List<User> lambdaUsers3 = userMapper.selectList(new QueryWrapper<User>().lambda()
.nested(i -> i.eq(User::getRoleId, 2L).or().eq(User::getRoleId, 3L))
.and(i -> i.ge(User::getAge, 20)));
Assert.assertEquals(plainUsers3.size(), lambdaUsers3.size());
print(plainUsers3);
----- 带子查询(sql注入) ------
SELECT id,name,age,email,role_id FROM user WHERE role_id IN (select id from role where id = 2)
----- 带嵌套查询 ------
SELECT id,name,age,email,role_id FROM user WHERE ( role_id = ? OR role_id = ? ) AND ( age >= ? )
MetaObjectHandler
的使用,并不是只能把值放返回对象,它是可以直接插入数据库的扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有