SSM 封裝base(一) 公用增刪查改


大概

  • 對於一些業務邏輯操作,每個實體類會有很多重復的操作,如學生管理,教師管理,書本管理等都會需要用到增刪查改,就會出現大量的重復代碼,不優雅,不美觀,沒逼格。
  • 所以 我想法呢 就是將那些重復的代碼抽出來,放到一個公共的mapper中(學過mybatis的應該能明白吧),並慢慢加上分頁、級聯。
  • 實現呢就是封裝一個 base 層 ,將需要的數據在 service 層中處理好后 傳給 baseDao 的接口,然后在baseMapper 中使用動態語句來實現對數據庫的操作
  • 當然如果大牛覺得此方法有什么不妥 完全可以說出來,我可以調整,如果這個結構不妥,不符合java或者編程上的某些高深的思想,那就當是另外一種方式來學習吧。畢竟都是一種實現方式,沒有最好的,只有慢慢發掘更好,讓其更完善

先簡單實現一些公用方法.當前結構如下圖:

這里寫圖片描述

首先寫 service 層接口

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

service 層實現類 大部分在這里下功夫了

@Service
public abstract class BaseService<T> implements IBaseService<T>{
    //提供一個抽象方法 當前類的子類需要提供具體實現類的 Dao 
    public abstract IBaseDao<T> getBaseDao(); 
    //提供一個抽象方法  當前類的子類需要提供 entity的 Class 對象
    public abstract Class<T> getClasss();

    public Class<T> clsss;
    {
        clsss = getClasss();
    }

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

    /**
    * 添加一個 對象
    */
    @Override
    public int add(T t) {
        //獲取表名
        String tableName = clsss.getSimpleName().toLowerCase();
        List<Object> 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<Object> 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 <T> {

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

    List<HashMap<Object, Object>> 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
  • <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="base.dao.IBaseDao" >
        <!-- 按id查找一個 -->
        <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的實現類)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<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<Student> getBaseDao() {
        return mapper;
    }
    @Override
    public Class<Student> 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<Student> 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);
    }

}
  • 后面幾天會將 分頁的放上來·······


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM