一、介绍
Mapper代理的方式只需要程序员编写 Mapper.xml 文件及 Mapper接口。
本文是基于上一篇文章:Mybatis 学习笔记——原生DAO实现数据增删改查,所以接下来的内容是以其为基础的,如果有什么不懂的请留言或查看上一篇。所以SqlMapConfig.xml 文件、User.xml文件延用不编写,我们需要编写UserMapper.java接口和测试类。
二、使用Mapper代理的开发规范
程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
使用Mapper代理开发规范:
1、在 Mapper.xml 中 namespace 等于 mapper 接口地址;
2、Mapper.java 接口中的方法名 和 Mapper.xml 中 statement 的 id 一致;
3、Mapper.java 接口中的方法输入参数类型和 Mapper.xm l中 statement 的parameterType 指定的类型一致;
4、Mapper.java 接口中的方法返回值类型和 Mapper.xml 中 statement 的 resultType 指定的类型一致。
三、根据开发规范编写UserMapper.java接口
package com.mapper;
import java.util.List;
import com.po.User;
/**
* 描述:mapper代理接口,管理用户
* @author 欧阳
* @since 2018年10月9日
*/
public interface UserMapper {
//根据id查询用户信息
public User findUserById(int id) throws Exception;
//根据username查询用户信息
public List<User> findUserByName(String name) throws Exception;
//插入用户信息
public void insertUser(User user) throws Exception;
//根据id删除用户信息
public void deleteUserById(int id) throws Exception;
//更新用户信息
public void updateUser(User user) throws Exception;
}
四、编写测试类
package com.mapper;
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.dao.UserDao;
import com.dao.UserDaoImpl;
import com.po.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
//此方法是在执行testFindUserById之前执行
@Before
public void setUp() throws Exception {
String resource = "config/SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂
this.sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
}
@Test
public void testFindUserById() {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建userMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
try {
User user = userMapper.findUserById(3);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
@Test
public void testFindUserByName() {
UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
try {
List<User> users = userDao.findUserByName("小");
System.out.println(users.size());
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testInsertUser() {
UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
try {
//插入用户对象
User user = new User();
user.setUsername("欧阳");
user.setAddress("山东");
userDao.insertUser(user);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testDeleteUserById() {
UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
try {
userDao.deleteUserById(17);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testUpdateUser() {
UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
try {
//插入用户对象
User user = new User();
user.setId(3);
user.setUsername("欧阳");
user.setAddress("山东");
userDao.updateUser(user);
} catch (Exception e) {
e.printStackTrace();
}
}
}
五、问题的思考
- 在代理对象内部何时调用selectOne方法?又何时调用selectList方法?
答:Mybatis 根据 Mapper 方法的返回值自动进行判断,如果返回单个pojo对象(非集合对象),则代理对象内部通过selectOne查询数据库;返回集合对象,代理对象内部通过selectList查询数据库。 - Mapper 接口方法参数只能有一个是否影响系统开发?
答:不影响,如果有多个参数,我们可以使用 POJO 包装各参数来满足业务的需求。