标题1@TOC定义一个简单异常
public class ServiceException extends RuntimeException {
private static final long serialVersionUID =
7793296502722655579L;
public ServiceException() {
super();
}
public ServiceException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public ServiceException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
}
标题 2.批量删除元素
在SysLogDao接口对应的映射文件中添加用于执行删除业务的delete元素,此元素内
部定义具体的SQL实现。
▪ 关键代码设计与实现
在SysLogMapper.xml文件添加delete元素,关键代码如下:
delete from sys_Logs
where id in
#{id}
FAQ分析:如上SQL实现可能会存在什么问题?(可靠性问题,性能问题)
从可靠性的角度分析,假如ids的值为null或长度为0时,SQL构建可能会出现语法问题
,可参考如下代码进行改进(先对ids的值进行判定):
delete from sys_logs
where id in
#{id}
where 1=2
从SQL执行性能角度分析,一般在SQL语句中不建议使用in表达式,可以参考如下代码进
行实现(重点是forearch中or运算符的应用):
delete from sys_logs
id=#{id}
where 1=2
说明:这里的choose元素也为一种选择结构,when元素相当于if,otherwise相当于
else的语法。
标题3 将主键赋值给对象属性,一对多插入
在SysRoleDao接口中定义数据持久化方法:
int insertObject(SysRole entity);
SysRoleMenuDao接口中方法定义(不存在则创建)
int insertObjects(
@Param(“roleId”)Integer roleId,
@Param(“menuIds”)Integer[] menuIds);
第一步:在SysRoleMapper.xml中添加insertObject元素,用于写入菜单信息。其中
useGeneratedKeys 表示使用insert操作的自增主键值,keyProperty表示将获取的自
增主键值赋值给参数对象的id属性,关键代码如下:
insert into sys_roles
(id,name,note,createdTime,modifiedTime,
createdUser,modifiedUser)
values
(null,#{name},#{note},now(),now(),
#{createdUser},#{modifiedUser})
第二步:在SysRoleMenuMapper中元素定义,关键代码如下:
insert into sys_role_menus
(role_id,menu_id)
values
(#{roleId},#{item})
Service接口定义及实现
▪ 业务描述与设计实现
基于控制层请求,调用数据层对象将角色以及对应的菜单信息写入到数据库中。
▪ 关键代码设计与实现
第一步:在SysRoleService接口中,添加用于保存角色对象的方法。关键代码如下
:
int saveObject(SysRole entity,Integer[]menuIds);
第二步:在SysRoleServiceImpl类中,实现菜单保存操作。关键代码如下:
@Override
public int saveObject(SysRole entity, Integer[] menuIds) {
//1.参数有效性校验
if(entitynull)
throw new IllegalArgumentException("保存对象不能为空
");
if(StringUtils.isEmpty(entity.getName()))
throw new IllegalArgumentException("角色名不允许为空
");
if(menuIdsnull||menuIds.length==0)
throw new ServiceException(“必须为角色分配权限”);
//2.保存角色自身信息
int rows=sysRoleDao.insertObject(entity);
//3.保存角色菜单关系数据
sysRoleMenuDao.insertObjects(entity.getId(), menuIds);
//4.返回业务结果
return rows;
}
标题4 一对多,嵌套查询 06章25页
第一步:在SysRoleMapper.xml中添加findObjectById元素,关键代码如下:
select id,name,note
from sys_roles
where id=#{id}
第二步:在SysRoleMapper.xml中添加第一步中resultMap属性定义的结果映射元素
,关键代码如下:
标题5 一对多设计的修改 06章30页
int updateObject(SysRole entity,Integer[] menuIds)
第二步:在SysRoleServiceImpl类中,实现更新角色操作。关键代码如下:
@Override
public int updateObject(SysRole entity,Integer[] menuIds) {
//1.合法性验证
if(entitynull)
throw new IllegalArgumentException(“更新的对象不能为空”);
if(entity.getId()null)
throw new IllegalArgumentException(“id的值不能为空”);
if(StringUtils.isEmpty(entity.getName()))
throw new IllegalArgumentException(“角色名不能为空”);
if(menuIdsnull||menuIds.length0)
throw new IllegalArgumentException(“必须为角色指定一个权限”);
//2.更新数据
int rows=sysRoleDao.updateObject(entity);
if(rows==0)
throw new ServiceException(“对象可能已经不存在”);
sysRoleMenuDao.deleteObjectsByRoleId(entity.getId());
sysRoleMenuDao.insertObject(entity.getId(),menuIds);
//3.返回结果
return rows;
}
controller
@RequestMapping(“doUpdateObject”)
public JsonResult doUpdateObject(SysRole entity,
Integer[] menuIds){
sysRoleService.updateObject(entity,menuIds);
return new JsonResult(“update ok”);
标题6 一对一查询 07章10页
第四步:在映射文件中添加id为findPageObjects元素,实现分页查询。代码如下:
select *
order by createdTime desc
limit #{startIndex},#{pageSize}
第五步:定义查询结果映射元素。代码如下:
标题6 pojo相关注解 ****
package com.jt.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.experimental.Accessors;
@JsonIgnoreProperties(ignoreUnknown=true) //表示JSON转化时忽略未知属性
@TableName(“tb_item”)
@Data
@Accessors(chain=true)
public class Item extends BasePojo{
@TableId(type=IdType.AUTO) //主键自增
private Long id; //商品id
private String title; //商品标题
private String sellPoint; //商品卖点信息
private Long price; //商品价格 double精度问题 num *100 /100 long
private Integer num; //商品数量
private String barcode; //条形码
private String image; //商品图片信息 1.jpg,2.jpg,3.jpg
private Long cid; //表示商品的分类id
private Integer status; //1正常,2下架
//为了满足页面调用需求,添加get方法
public String[] getImages(){
return image.split(",");
}
}