Mybatis 学习笔记(三)——使用Mapper代理的方式实现数据增删改查

版权声明:转载请注明来源 https://blog.csdn.net/qq_24598601/article/details/83037529

一、介绍

  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();
		}
	}

}

五、问题的思考

  1. 在代理对象内部何时调用selectOne方法?又何时调用selectList方法?
      答:Mybatis 根据 Mapper 方法的返回值自动进行判断,如果返回单个pojo对象(非集合对象),则代理对象内部通过selectOne查询数据库;返回集合对象,代理对象内部通过selectList查询数据库。
  2. Mapper 接口方法参数只能有一个是否影响系统开发?
      答:不影响,如果有多个参数,我们可以使用 POJO 包装各参数来满足业务的需求。

猜你喜欢

转载自blog.csdn.net/qq_24598601/article/details/83037529