SSM 封装base(一) 公用增删查改

大概

  • 对于一些业务逻辑操作,每个实体类会有很多重复的操作,如学生管理,教师管理,书本管理等都会需要用到增删查改,就会出现大量的重复代码,不优雅,不美观,没逼格。
  • 所以 我想法呢 就是将那些重复的代码抽出来,放到一个公共的mapper中(学过mybatis的应该能明白吧),并慢慢加上分页、级联。
  • 实现呢就是封装一个 base 层 ,将需要的数据在 service 层中处理好后 传给 baseDao 的接口,然后在baseMapper 中使用动态语句来实现对数据库的操作
  • 当然如果大牛觉得此方法有什么不妥 完全可以说出来,我可以调整,如果这个结构不妥,不符合java或者编程上的某些高深的思想,那就当是另外一种方式来学习吧。毕竟都是一种实现方式,没有最好的,只有慢慢发掘更好,让其更完善

先简单实现一些公用方法.当前结构如下图:

SSM 封装base(一) 公用增删查改_第1张图片

首先写 service 层接口

public interface IBaseService {
    void del( int id );
    List queryAll();
    int add( T t );
    void update ( T t );
}

service 层实现类 大部分在这里下功夫了

@Service
public abstract class BaseService<T> implements IBaseService<T>{
    //提供一个抽象方法 当前类的子类需要提供具体实现类的 Dao 
    public abstract IBaseDao getBaseDao(); 
    //提供一个抽象方法  当前类的子类需要提供 entity的 Class 对象
    public abstract Class getClasss();

    public Class clsss;
    {
        clsss = getClasss();
    }

    /**
    * 根据 id 查找一个对象
    */
    @Override
    public T queryOne(int id) {
        String name = clsss.getSimpleName().toLowerCase();
        Map map =  getBaseDao().queryOne(name,id).get(0);
        T t = hashMapToEntity(map);
        return t;
    }
    /**
    * 查找所有对象
    */
    @Override
    public List queryAll() {
        List ts = new ArrayList<>();
        String name = clsss.getSimpleName().toLowerCase();
        List> list =  getBaseDao().queryAll( name );
        for (HashMap hashMap : list) {
            ts.add( hashMapToEntity( hashMap ) );
        }
        return ts;
    }

    /**
    * 添加一个 对象
    */
    @Override
    public int add(T t) {
        //获取表名
        String tableName = clsss.getSimpleName().toLowerCase();
        List list= new ArrayList<>();
        //将参数放入数组中
        for (Field field : t.getClass().getDeclaredFields()) {
            field.setAccessible(true);//权限
            try {
                list.add(field.get(t));
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return getBaseDao().add( tableName , list.toArray() );
    }

    /**
    * 更新一个对象
    */
    @Override
    public void update(T t) {
        int id = 0;
        String tableName = getTableName();
        List list= new ArrayList<>();
        for (Field field : t.getClass().getDeclaredFields()) {
            field.setAccessible(true);//权限
            try {
                if ( field.get(t) == null ) {
                    continue;
                }
                if (("id").equals( field.getName()) ) { 
                    id = (Integer) field.get(t);
                    continue ;
                }
                //拼接成 :变量名='值' 的形式
                list.add( field.getName()+"="+ "'" + field.get(t) + "'" );
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        getBaseDao().update( id, tableName , list.toArray() );

    }
    /**
    * 根据id 删除 一个对象
    */
    @Override
    public void del(int id) {
        String name = clsss.getSimpleName();
        name = name.toLowerCase();
        getBaseDao().del(name, id);
    }   
} 
  

接下来是 Dao 层接口

  • mybatis 中 一个多个参数时需要用 @Param(” xxx “) 设置别名以区分
public interface IBaseDao  {

    List> queryOne( @Param("name") String name,@Param("id")int id );

    List> queryAll( @Param("name") String name );

    int add( @Param("name")String name ,@Param("params") Object ...params );

    void update ( @Param("id") int id, @Param("name") String name, @Param("params")Object []params );

    void del(@Param("name")String lowerCase, @Param("id")int id);
}

Dao 的实现类

  • 在service中将参数处理好 然后在此 mapper 中使用动态SQL语句进行操作
  • 因为不知道查询的时候返回的是啥子 所以 返回类型是一个 hashmap 接收需要用 List



<mapper namespace="base.dao.IBaseDao" >
    
    <select id="queryOne" resultType="hashmap">
        select * from ${name} where id=#{id}
    select>

    
    <select id="queryAll" resultType="hashmap">
        select * from ${name}
    select>

    <insert id="add" >
        insert into ${name} values
        <foreach collection="params"  item="param" open="(" separator="," close=")" >
            #{param}
        foreach>
    insert>

    <update id="update">
        update ${name} 
        <set>
            <foreach collection="params"  item="param" >
                ${param}, 
            foreach>
        set>
        where id=#{id}
    update>

mapper>

使用

  • 自己的Dao 层接口 需要继承 base 层的Dao接口
//IStudentDao
public interface StudentMapper extends IBaseDao<Student> {

}
  • 自己的Mapper(dao的实现类)



<mapper namespace="com.huang.ssm.mapper.IStudentDao" >

mapper>
  • 自己的Service 曾 需要继承 base层的 service 接口
public interface IStudentService extends IBaseService<Student> {

}
  • 自己的Service层的实现类 需要继承 base 的service实现类

  • 并需要提供 实现类的dao 和 实体类的 class 对象

@Service
public class StudentService extends BaseService<Student> implements IStudentService {
    @Autowired
    private IStudentDao mapper;
    @Override
    public void test() {
        System.out.println("测试");
    }
    @Override
    public IBaseDao getBaseDao() {
        return mapper;
    }
    @Override
    public Class getClasss() {
        return Student.class;
    }

}
  • controller 层
@Controller 
@RequestMapping("/stu")
public class StuController {

    @Autowired
    private  IStudentService studentService  ;

    @RequestMapping("/add")
    public String addStu() {
        Student stu = new Student(0,"测试1",21,1);
        studentService.add(stu);
        return "home";
    }

    @RequestMapping("/queryAll")
    public String queryAll() {
        List list = studentService.queryAll();
        System.out.println(list);
        return "home";
    }

    @RequestMapping("/update")
    public String update() {
        Student stu = new Student(34,"修改",15,2);
        studentService.update(stu);
        return "home";
    }

    @RequestMapping("/queryOne")
    public String queryById(){
        Student stu = studentService.queryOne(12);
        System.out.println(stu);
        return "home";
    }

    @RequestMapping("/del")
    public void del( Integer id ) {
        studentService.del(id);
    }

}
  • 后面几天会将 分页的放上来·······

你可能感兴趣的:(学习)