使用SSM创建一个空的开发环境,并配置好 .XML文件,这里就不详细给出了;特别注意的是SpringBoot现在还不支持阿里的Druid连接池,所以使用Driud需要手动添加配置。进入正题:
这里就简单的写了几个增、删、改、查。
package com.space.dao;
import java.util.List;
import java.util.Map;
public interface BaseDao {
//增
public int save(String mapper,Map parameter)throws Exception;
//改
public int update(String mapper,Map parameter)throws Exception;
//删
public int delete(String mapper,Map parameter)throws Exception;
//查
public T find(String mapper,Map parameter)throws Exception;
public List findList(String mapper,Map parameter)throws Exception;
}
在实现类上添加@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 implements BaseDao{
@Resource
private SqlSessionTemplate sqlSessionTemplate;
//增
@Override
public int save(String mapper, Map parameter) throws Exception {
return sqlSessionTemplate.insert(mapper,parameter);
}
//改
@Override
public int update(String mapper, Map parameter) throws Exception {
return sqlSessionTemplate.update(mapper,parameter);
}
//删
@Override
public int delete(String mapper, Map parameter) throws Exception {
return sqlSessionTemplate.delete(mapper,parameter);
}
//查
@Override
public T find(String mapper, Map parameter) throws Exception {
return sqlSessionTemplate.selectOne(mapper,parameter);
}
@Override
public List findList(String mapper, Map parameter) throws Exception {
return sqlSessionTemplate.selectList(mapper,parameter);
}
}
使用MyBatis逆向工程生成实体类和Mapper文件,需要注意的是XML文件配置了别名,需要修改xxxMapper.xml中的namespace属性,即去掉前面的包名。否则会报错。 以User为例
//根据id 获取user信息
public interface UserDao extends BaseDao {
public List findUserById(String mapper ,int id) throws Exception;
}
@Repository
public class UserDaoImpl extends BaseDaoImpl implements UserDao {
@Override
public List findUserById(String mapper ,int id) throws Exception {
Map parameter = new HashMap<>();
parameter.put("id",id);
return super.findList(mapper,parameter);
}
}
测试方法多种多样。注入UserDao,调用findUserById(),传入mapper及参数。主要代码:(使用开发工具是IDEA)
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest {
@Autowired
private UserDao userDao ;
@Test
public void findUserById() throws Exception{
List userList = userDao.findUserById("UserMapper.selectByPrimaryKey",1) ;
System.out.println(userList);
}
}
控制台打印:
最后套用《图解设计模式》中一句话 “不要只使用具体类来编程,要优先使用抽象类和接口来编程”。如果只使用具体的类来解决问题,很容易导致类之间的强耦合,这些类也难以作为组件被再次利用。当还在读大学,刚接触到这些框架时,就产生这个疑问:为什么要使用抽象类和接口?直接调用具体类不是更方便吗?相信不止我一个有这样的疑问吧 。说到这,推荐两本书《图解设计模式》和《大话设计模式》;前者阅读起来需要些基础,后者由许许多多的小故事组成,通俗易懂,易于理解。感兴趣的可以了解了解。
功夫讲究刚柔并济,内外兼修。