发表于: 2017-11-02 21:55:05

2 760


day13

今日完成

Mapper的动态代理

采用Mapper动态代理方法只需要编写相应的Mapper接口(相当于Dao接口),那么Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接口实现类方法。

 

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

1、Mapper.xml文件中的namespace与mapper接口的全类名相同。

2、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同。

3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同。

4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。

 

项目结构

userMapper接口如图所示:

package com.mybatis.mapping;
import com.mybatis.domin.User;
import java.util.List;

public interface userMapper
{
User getUser(int id) ;
    List<User> getAllUsers() ;
    int addUser(User user) ;
    int deleteUser(int id) ;
    int updateUser(User user) ;
}

测试类

import com.mybatis.domin.User;
import com.mybatis.mapping.userMapper;
import com.mybatis.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;


public class TestProxyMapper {
@Test
   public void testInsert() throws Exception{
User user=new User();
       int i=2;
       while(i<10) {
user.setName("" + i + 1 + "");
           user.setId(i + 1);
           user.setAge(23 + i);
           i++;
         
           SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
           userMapper userMapper = sqlSession.getMapper(userMapper.class);
           userMapper.addUser(user);
           //关闭session
           sqlSession.close();
       }
System.out.println("---------执行完毕-----------");

   }
@Test
   public void testGetUser() throws Exception{


SqlSession sqlSession = MyBatisUtil.getSqlSession(true);

       userMapper userMapper=sqlSession.getMapper(userMapper.class);
       User user=userMapper.getUser(6);
       System.out.println(userMapper);
       System.out.println(user);
       //关闭session
       sqlSession.close();
       System.out.println("---------执行完毕-----------");

   }
@Test
   public void testUpdateUser(){
SqlSession sqlSession=MyBatisUtil.getSqlSession(true);
       userMapper userMapper=sqlSession.getMapper(userMapper.class);

       User user=new User();
       user.setId(3);
       user.setName("周杰伦123");
       user.setAge(100);

       int retResult=userMapper.updateUser(user);
       sqlSession.close();
       System.out.println(retResult);
       System.out.println("---------执行完毕-----------");


   }
@Test
   public void testGetAllUsers() throws Exception{


SqlSession sqlSession = MyBatisUtil.getSqlSession(true);

       userMapper userMapper=sqlSession.getMapper(userMapper.class);
       List<User> allUsers=userMapper.getAllUsers();

       System.out.println(allUsers);
       //关闭session
       sqlSession.close();
       System.out.println("---------执行完毕-----------");

   }
@Test
   public void testDeleteUser(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
       userMapper userMapper = sqlSession.getMapper(userMapper.class);
       int retResult = userMapper.deleteUser(7);
       System.out.println(retResult);

       sqlSession.close();
       System.out.println("---------执行完毕-----------");

   }


}

遇到的困难

出现异常:

org.apache.ibatis.exceptions.PersistenceException:

### Error building SqlSession.

### The error may exist in com/mybatis/mapping/userMapper.java (best guess)

### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.binding.BindingException: Type interface com.mybatis.mapping.userMapper is already known to the MapperRegistry.


如图,根据异常将config.xml文件中mapper去掉后,成功运行



明日计划

学习junit4,尝试编写单元测试


收获

进一步熟悉了mybatis,了解了mapper代理的过程


返回列表 返回列表
评论

    分享到