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)

扫描二维码关注公众号,回复: 4451594 查看本文章
@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);
    }
}

  控制台打印:

      最后套用《图解设计模式》中一句话 “不要只使用具体类来编程,要优先使用抽象类和接口来编程”。如果只使用具体的类来解决问题,很容易导致类之间的强耦合,这些类也难以作为组件被再次利用。当还在读大学,刚接触到这些框架时,就产生这个疑问:为什么要使用抽象类和接口?直接调用具体类不是更方便吗?相信不止我一个有这样的疑问吧 。说到这,推荐两本书《图解设计模式》和《大话设计模式》;前者阅读起来需要些基础,后者由许许多多的小故事组成,通俗易懂,易于理解。感兴趣的可以了解了解。

      功夫讲究刚柔并济,内外兼修。

 
 
 

猜你喜欢

转载自blog.csdn.net/StarryaSky/article/details/83687757
今日推荐