1、本篇博客的背景和目的
目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。目前已经阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,认识了框架,回顾了JDBC连接数据库,介绍了MyBatis框架,初步建立了使用MyBatis和MySQL的Maven项目,简单解释了STDOUT_LOGGING日志和INSERT语句手动提交事务,记录了MyBatis中#占位符的使用方法,回顾了MyBatis执行SQL语句的过程和使用到的一些重要类和接口,记录了将固定化的代码整合到一个工具类MyBatisUtil中,以减少代码量。本篇博客记录一下dao层接口的实现以及为什么要实现它。
2、我的上一篇博文
我上一篇博文记录的是工具类MyBatisUtil的实现,用以简化代码量,实现高内聚低耦合;一处修改,处处生效。链接如下所示:
3、为什么要实现dao层接口。
我上一篇博文中的代码,里面有一个dao层的接口,之所以写这个接口,是因为在今后的实际开发中,写dao层的接口是编程规范,是必须写的。但是,实际上,上一篇博文的代码中,dao层接口是没有实际作用的,也就是可以没有。
上一篇博文的代码中,我们执行SQL语句的时候,需要在业务逻辑代码中给出要执行的SQL语句的“地址”,然后使用由MyBatisUtil类的方法得到的SqlSession对象的方法执行SQL语句,这明显还是很麻烦的啊!!
我们想要的是:直接调用dao层类的方法,调用某一个方法,就可以直接执行某一个SQL语句,然后得到返回结果。这也是dao层设计的初衷。
4、项目代码文件结构
相比于上一篇博文的项目结构,项目在dao包下面新建了impl包,写了继承StudentDao接口的类,会在这个类里面写执行SQL语句的代码,方便后面可以直接在业务逻辑类中调用。
5、实现dao层StudentDao接口的StudentDaoImpl类的代码
代码如下所示:
package com.dcy.dao.impl;
import com.dcy.dao.StudentDao;
import com.dcy.domain.Student;
import com.dcy.utils.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class StudentDaoImpl implements StudentDao {
@Override
public Student selectById(Integer id) {
SqlSession sqlSession= MyBatisUtil.getSqlSession();
String SqlId="com.dcy.dao.StudentDao.selectById";
Student student=sqlSession.selectOne(SqlId,"1001");
sqlSession.close();
return student;
}
@Override
public List<Student> selectStudents() {
SqlSession sqlSession=MyBatisUtil.getSqlSession();
String SqlId="com.dcy.dao.StudentDao.selectStudents";
List<Student> students=sqlSession.selectList(SqlId);
sqlSession.close();
return students;
}
@Override
public int insertStudent(Student student) {
SqlSession sqlSession=MyBatisUtil.getSqlSession();
String SqlId="com.dcy.dao.StudentDao.insertStudent";
int i = sqlSession.insert(SqlId, student);
sqlSession.close();
return i;
}
}
代码比较简单,每一个方法都是调用了工具类MyBatisUtil的方法,获得SqlSession对象以后,执行对应的SQL语句,然后返回结果。
6、在Main方法中测试
上面实现dao层的接口以后,我们在Main方法中进行测试,代码如下:
package com.dcy;
import com.dcy.dao.impl.StudentDaoImpl;
import com.dcy.domain.Student;
import java.util.List;
public class starter02 {
public static void main(String[] args) {
StudentDaoImpl studentDao=new StudentDaoImpl();
List<Student> students = studentDao.selectStudents();
System.out.println(students);
}
}
执行结果如下图所示: