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