MyBatis之Dao层实现

文章目录

    • 1、传统开发方式
    • 2、代理开发方式

我们在了解 MyBatis 的映射文件和配置文件时,所举例的实例都是通过单元测试的方式实现。但在实际开发中,我们需要将 MyBatis 的实现写到 Dao 层中。所以下面我们具体了解两种 Dao 层的实现方式

1、传统开发方式

在传统 web 开发中,我们首先需要定义 Dao 接口,然后定义 DaoIImpl 类实现接口。

定义 UserDao 接口:

public interface UserDao {
    // 1、 根据用户ID查询用户信息
    public User findUserById(int id) throws IOException;// 2、 根据用户ID和用户名称查询用户信息
    public User findByUserIdAndName(User user) throws IOException;
}

定义 UserDao 接口的实现类 UserDaoImpl :

public class UserDaoImpl implements UserDao {
    // 依赖注入,将工程在外面创建
    private SqlSessionFactory sqlSessionFactory;
    
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {//将外面创建的工厂传递进来(以后spring)
        this.sqlSessionFactory = sqlSessionFactory;
    }@Override
    public User findUserById(int id) throws IOException {
        // 创建SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 调用SqlSession的增删改查方法
        User user = sqlSession.selectOne("userMapper.findByUserId", id);
        System.out.println(user);
        // 关闭资源
        sqlSession.close();
        return user;
    }@Override
    public User findByUserIdAndName(User user)  throws IOException {
        // 创建SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 调用SqlSession的增删改查方法
        User user= sqlSession.selectOne("userMapper.findByIdAndName", user);
        System.out.println(user);
        // 关闭资源
        sqlSession.close();
        return list;
    }
}

模拟业务层调用:

public static void main(String [] args) throws Exception {
   InputStream inputStream = Resources.getResourceAsStream(resource);
   // 创建SqlSessionFactory
   SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
   UserDao dao = new UserDaoImpl(sqlSessionFactory);
   User user = dao.findUserById(1);
   System.out.println(user);
}

这种方式其实大家都会,在学习 javaweb 的时候我们就是使用这种方式实现 Dao 层,只是连接数据库的方式改变了。

2、代理开发方式

分析第一种方式的代码会发现有大量的重复的模板代码。为了简化开发,Mybatis 提供了一种代理开发的方式,这种方式是项目开发中 Mybatis 实现 Dao 层的主流。

代理开发方式只需要程序员编写Mapper 接口(相当于Dao 接口),然后由 Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。 代理开发方式使用的是动态代理的 JDK 代码实现的。

Mapper 接口需要遵循以下规范:

  • 映射文件中的mapper标签的namespace属性与 mapper 接口的全限定名相同
    MyBatis之Dao层实现_第1张图片

  • 映射文件中的每条映射语句中id的属性值与 mapper 接口中方法名相同
    MyBatis之Dao层实现_第2张图片

  • 映射文件中的每条映射语句的parameterType属性与 mapper 接口中方法的形参相同
    MyBatis之Dao层实现_第3张图片

  • 映射文件中的每条映射语句的resultType属性与 mapper 接口中方法的返回值类型相同
    MyBatis之Dao层实现_第4张图片

如果 Mapper 接口已经遵循上述规范,那么不需要创建 Dao 层的实现类了,可以直接进行使用:

public static void main(String [] args) throws Exception {
   InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
   // 创建SqlSessionFactory
   SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
   // 创建SqlSession
   SqlSession sqlSession = sqlSessionFactory.openSession();
   UserDao dao = sqlSession.getMapper(UserDao.class);
   User user = dao.findByUserId(1);
   System.out.println(user);
}

你可能感兴趣的:(MyBatis,mybatis)