MyBatis学习系列(三)--------Mapper动态代理开发DAO

前言

    在传统的DAO接口开发中,我们如果使用mybatis开发,存在以下问题:

  • DAO方法存在重复代码,在通过sqlSessionFactory创建sqlSession时,调用sqlSession来操作数据库.
  • 调用sqlSession操作数据库时,需要制定statement的id,存在硬编码,不利于维护.

    因此,我们可以使用mybatis的Mapper动态代理的方式来进行开发,下面来看看这种开发方式的具体过程.

正文

    Mapper接口开发需要程序员编写mapper接口,由Mybats框架根据接口定义创建接口的动态代理对象,代理对象的方法其实就是原始DAO开发时实现类的方法.
使用Mapper开发要遵循以下规范:
- Mapper.xml文件中的namespace要和mapper接口的类路径一致.
- Mapper接口的方法名称要和Mapper.xml中定义的statement的id相同.
- mapper接口的方法输入参数类型要和mapper.xml中每个sql的parameterType的类型相同
- mapper接口的方法的输出参数类型要和mapper.xml中每个sql的resultType的类型相同

首先,我们先创建一个名词为UserMapper的接口,并且按照以上的规范创建2个方法:

package com.mybatis.mapper;

import java.util.List;

import com.mybatis.po.User;

public interface UserMapper {


    public User findUserById(int id);

    public List<User> findUserByName(String username);

    public void insertUser(User user);
}

接着,我们将上文中的User.xml文件改名为UserMapper.xml,更改这个文件中的namespace

<mapper namespace="com.mybatis.mapper.UserMapper">
    ....
    ....
</mapper>

注意,这里的namespace对应的是前面创建接口的全路径.
接下来创建对应的测试类测试接口的方法:

package com.mybatis.test;

import static org.junit.Assert.*;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import com.mybatis.mapper.UserMapper;
import com.mybatis.po.User;

public class UserMapperTest {


    private  SqlSessionFactory sqlSessionFactory = null;

    @Before
    public void init() throws Exception {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }


    @Test
    public void testFindUserById() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.findUserById(8);
        System.out.println(user);
    }

    @Test
    public void testFindUserByName() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> list = mapper.findUserByName("张");
        for (User user : list) {
            System.out.println(user);
        }

    }

    @Test
    public void testInsertUser() {
    }

}

下面是查询的结果:
这里写图片描述
这里写图片描述
可以看到,已经查询出了我们需要的数据.

总结

  • 动态代理对象根据mapper接口的方法的返回值来决定调用sqlSession.selectOne()或者sqlSession.selectList(),如果返回单个对象,则调用selectOne(),如果返回多个对象,则返回selectList().
  • 在开发中,推荐使用mapper动态代理的方式来进行开发,我们不用编写接口的实现类,在使用这个方法时,输入参数可以选择pojo对象或者map,方便通用.

猜你喜欢

转载自blog.csdn.net/xiaoyao2246/article/details/81167680