✧ 爱代码的设计师 / Blog
原创

Mybatis动态代理

Mybatis动态代理
✧   THE STORY BEGINS HERE 68 次阅读

前言

  • 在讲解动态代理之前,我们可以先在mybatis环境下比不适用动态代理和使用动态代理的区别,以便我们更加深刻的理解动态代理到底为我们做了些什么.
  • dao层 StudentDao
    		package com.chuangmei.dao;
    
    		public interface StudentDao {
    			//查询
    			List<Student> selectAllStudents();
    		}
    

不使用mapper动态代理

  • 在不使用mapper动态代理的情况下我们需要自己实现dao的接口,并且手动调用SqlSession中的方法完成sql语句的执行,如果是增删改的操作还需要手动提交事务
    	package com.chuangmei.dao;
    
    
    	public class StudentDaoImpl implements IStudentDao {
    
    		private SqlSession sqlSession;
    
    		@Override
    		public List<Student> selectAllStudents() {
    			List<Student> students = null;
    			try {
    				//调用工具类获取sqlsession对象
    				sqlSession = SqlSession_Util.getSqlSession();
    				students = sqlSession.selectList("selectAllStudents");
    				//sqlSession.commit(); 查询可以不用提交
    			} finally {
    				if (sqlSession!=null) {
    					sqlSession.close();	//关闭事务
    				}
    			}
    			return students;
    		}
    
    	}
    

dao层使用Mybatis的动态代理

  • mapper动态代理的条件:

    • 1. Dao层的方法名需要与mapper.xml的id相同
    • 2. mapper.xml中的namespace需要是Dao接口的全限定类名
    • 3. 接口传入参数需要与parameterType一致
    • 4. 接口返回类型需要与resultType一致
  • 使用动态代理的话Dao层的接口声明完成以后只需要在使用的时候通过SqlSession对象的getMapper方法获取对应Dao接口的代理对象,关键代码如下:
    	//3.获取SqlSession对象
    	SqlSession session = SqlSession_Util.getSqlSession();
    
    	//4.获取dao的代理对象
    	StudentDao dao = session.getMapper(StudentDao.class);
    	//5.执行查询所有的方法
    	List<Student> students = dao.selectAllStudents();
    

动态代理底层原理

  • 我也不是很清楚,以后弄明白了再来补充
— END —

感谢你,把时间留给这些文字。

LET'S TALK ABOUT IT

文字之外,与你聊聊。

✧

读到这里,想说点什么?

LEAVE A LITTLE KINDNESS

温柔表达,认真交流。

✉

这里还很安静。

来留下第一句问候吧。