1. 程式人生 > >SpringBoot+Mybatis:(一)BaseDao的簡單抽取及使用

SpringBoot+Mybatis:(一)BaseDao的簡單抽取及使用

一、BaseDao的抽取

使用SSM建立一個空的開發環境,並配置好 .XML檔案,這裡就不詳細給出了;特別注意的是SpringBoot現在還不支援阿里的Druid連線池,所以使用Driud需要手動新增配置。進入正題:

1、新建 BaseDao的介面

  這裡就簡單的寫了幾個增、刪、改、查。

package com.space.dao;

import java.util.List;
import java.util.Map;

public interface BaseDao<T> {

    //增
    public  int save(String mapper,Map<String ,Object> parameter)throws Exception;

    //改
    public int update(String mapper,Map<String ,Object> parameter)throws Exception;

    //刪
    public int delete(String mapper,Map<String ,Object> parameter)throws Exception;

    //查
    public T find(String mapper,Map<String ,Object> parameter)throws Exception;
    public List<T> findList(String mapper,Map<String ,Object> parameter)throws Exception;

}

 

 2、新建BaseDaoImpl類並實現BaseDao介面

在實現類上新增@Repository 註解,並注入SqlSessionTemplate。在這裡是否注意到該類是個抽象類,這樣寫的好處主要有兩點:

 1.  抽象類實現介面,可以不實現介面中的所有方法。方便根據需求去使用

 2. 抽象類的概念是 把想法從具體例項中分離出來,根據功能而不是細節來建立類。抽象類不能建立物件,只能通過繼承的方式使用抽象類(可以理解為 設計抽象類就是為了繼承)。抽象類作為父類被多個子類(如TeacherDao、StudentsDao等)繼承,不同子類需求肯定不會是完全相同,所以根據不同的需求只需要修改父類同時保證各個子類互不干擾。很好的體現出面向物件程式設計思想。(這一點在後續BaseDao的具體使用上會有更好的理解)

package com.space.dao.impl;


import com.space.dao.BaseDao;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/*
* BaseDao實現類,使用SqlSessionTemplate 模版
* */
@Repository
public abstract class BaseDaoImpl<T> implements BaseDao<T>{
    @Resource
    private SqlSessionTemplate sqlSessionTemplate;

    //增
    @Override
    public int save(String mapper, Map<String, Object> parameter) throws Exception {
        return sqlSessionTemplate.insert(mapper,parameter);
    }

    //改
    @Override
    public int update(String mapper, Map<String, Object> parameter) throws Exception {
        return sqlSessionTemplate.update(mapper,parameter);
    }

    //刪
    @Override
    public int delete(String mapper, Map<String, Object> parameter) throws Exception {
        return sqlSessionTemplate.delete(mapper,parameter);
    }

    //查
    @Override
    public T find(String mapper, Map<String, Object> parameter) throws Exception {
        return sqlSessionTemplate.selectOne(mapper,parameter);
    }

    @Override
    public List<T> findList(String mapper, Map<String, Object> parameter) throws Exception {
        return sqlSessionTemplate.selectList(mapper,parameter);
    }

}

 

一、BaseDao的使用

使用MyBatis逆向工程生成實體類和Mapper檔案,需要注意的是XML檔案配置了別名,需要修改xxxMapper.xml中的namespace屬性,即去掉前面的包名。否則會報錯。 以User為例

 

1. 新建UserDao介面,同時繼承BaseDao

//根據id 獲取user資訊
public interface UserDao extends BaseDao<User> {
    public List<User> findUserById(String mapper ,int id) throws Exception;
}

2. 新建UserDaoImpl類,繼承BaseDaoImpl抽象類並實現UserDao介面

@Repository
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
    @Override
    public List<User> findUserById(String mapper ,int id) throws Exception {
        Map<String,Object> parameter = new HashMap<>();
        parameter.put("id",id);
        return super.findList(mapper,parameter);
    }
}

3. 測試

測試方法多種多樣。注入UserDao,呼叫findUserById(),傳入mapper及引數。主要程式碼:(使用開發工具是IDEA)

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest {
    @Autowired
    private UserDao userDao ;

    @Test
    public void findUserById() throws Exception{
       List<User> userList = userDao.findUserById("UserMapper.selectByPrimaryKey",1) ;
        System.out.println(userList);
    }
}

  控制檯列印:

 

      最後套用《圖解設計模式》中一句話 “不要只使用具體類來程式設計,要優先使用抽象類和介面來程式設計”。如果只使用具體的類來解決問題,很容易導致類之間的強耦合,這些類也難以作為元件被再次利用。當還在讀大學,剛接觸到這些框架時,就產生這個疑問:為什麼要使用抽象類和介面?直接呼叫具體類不是更方便嗎?相信不止我一個有這樣的疑問吧 。說到這,推薦兩本書《圖解設計模式》和《大話設計模式》;前者閱讀起來需要些基礎,後者由許許多多的小故事組成,通俗易懂,易於理解。感興趣的可以瞭解瞭解。

      功夫講究剛柔並濟,內外兼修。