王富贵之旅游吧-day01-log
日志管理模块的设计说明
本模块主要是实现用户的行为日志信息
(例如谁在什么时间地点执行了什么操作,访问了那些方法,传递了那些参数)
功能实现
日志模块的添加功能实现
关键代码实现
entity:
package com.db.pj.sys.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class SysLog implements Serializable {
private Integer id;
private String username;
private String operation;
private String method;
private String params;
private Long time;
private String ip;
private Date createdTime;
}
dao层 : SysLogDao
int insertObject(SysLog sysLog);
mapper: SysLogDaoMapper.xml
<insert id="insertObject">
insert into sys_logs(username,operation,method,params,time,ip,createdTime)
values(
#{username},#{operation},#{method},#{params},#{time},#{ip},#{createdTime}
)
</insert>
service层:SysLogService
void saveObject(SysLog sysLog);
SysLogServiceImpl.class
/**
* 添加日志信息
* @param sysLog
*/
@Override
public void saveObject(SysLog sysLog) {
sysLogDao.insertObject(sysLog);
}
自定义注解
package com.db.pj.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequiredLog {
String operation() default "";
}
实现切面类
package com.db.pj.sys.service.impl;
import com.db.pj.common.exception.ServiceException;
import com.db.pj.common.vo.PageObject;
import com.db.pj.sys.dao.SysLogDao;
import com.db.pj.sys.entity.SysLog;
import com.db.pj.sys.service.SysLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SysLogServiceImpl implements SysLogService {
@Autowired
private SysLogDao sysLogDao;
/**
* 这个是根据用户名和当前页码值进行查询的方法
* @param username
* @param pageCurrent
* @return
*/
@Override
public PageObject<SysLog> findPageObjects(String username, Integer pageCurrent) {
//1.验证参数的合法性
//1.1 验证页码值的合法性
if( pageCurrent==null || pageCurrent<1){
throw new IllegalArgumentException("查询的页码值参数不正确奥");
}
//2.给予套件查询总记录数
//2.1执行查询
long rowCount = sysLogDao.getRowCount(username);
//3.查询当前页面的数据记录
Integer pageSize = 8;
Integer startIndex = (pageCurrent-1)*pageSize;
List<SysLog> records = sysLogDao.findPageObjects(username, startIndex, pageSize);
//4.封装当前页信息
PageObject<SysLog> pageObject = new PageObject<SysLog>(pageCurrent,pageSize,rowCount,records);
return pageObject;
}
/**
* 这个是根据id的值进行删除相应的记录的方法
* @param ids
* @return
*/
@Override
public int doDeleteObjects(Integer... ids) {
// 参数校验
if( ids==null || ids.length==0){
throw new IllegalArgumentException("要删除的参数为空奥");
}
//执行方法
int rows ;
try{
rows = sysLogDao.doDeleteObjects(ids);
}catch (Exception e){
//告知后台维护人员报错信息
throw new ServiceException("调用Dao层根据id删除记录方法异常,请尽快处理");
}
//对删除的之后返回的参数进行校验
if(rows == 0){
throw new ServiceException("记录可能已经不存在了");
}
return rows;
}
/**
* 添加日志信息
* @param sysLog
*/
@Override
public void saveObject(SysLog sysLog) {
sysLogDao.insertObject(sysLog);
}
}
异常集
如果是bindException
- 查看xml文件和类名的包路径是否相同
- 查看xml中的id值是否和方法名相同
- 查看xml中的sql语句中的参数是否和方法中对应的参数名字相同
- 检测映射文件的路径与application.properties或者application.yml中的配置是否一致。
- 以上都没有问题时,检测你的类和映射文件是否正常编译。
如果是不能创建bean 异常
- 查看是否添加了相应的注解@Mapper @Service
- 检测key的名字写的是否正确。
- 以上都正确,要检测是否编译了。
反射异常
1.映射文件中动态sql中使用的参数在接口方法中没有使用@Param注解修饰
2.假如使用了注解修饰还要检测名字是否一致。
说明:当动态sql的参数在接口中没有使用@Param注解修饰,还可以借助_parameter这个变量获取参数的值(mybatis中的一种规范)。