前言
在传统的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();
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,方便通用.