MyBatis之Mapper动态代理

Mapper的动态代理

Mybatis可以通过dao接口直接定位到Mapper文件中的SQL语句,这就是mapper的动态代理

修改之前的程序

  • 添加接口IUserDao
package com.kons.dao;

import com.kons.bean.User;

public interface IUserDao {
    User findUserById(int id);
}

需要将IUserDao中的方法名与mapper.xml文件中的id名称要一致,这样子mybatis就可以将方法和sql语句一一对应上了

  • 更改user.xml文件中namespace属性

这样mybatis就会将当前的mapper.xml文件与IUserDao对应上。

  • 接下来进行测试,修改App.java文件
package com.kons;

import com.kons.bean.User;
import com.kons.dao.IUserDao;
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.apache.log4j.BasicConfigurator;

import java.io.Reader;

/**
 * Hello world!
 *
 */
public class App
{

    private static String mybatisConfig="mybatis-config.xml";

    public static void main( String[] args ) throws Exception {

        BasicConfigurator.configure();

        try (SqlSession sqlSession=App.getSqlSession()){
            IUserDao userDao=sqlSession.getMapper(IUserDao.class);
            User user=userDao.findUserById(1);
            System.out.println(user.getPerson_name());
        }
    }


    private static volatile SqlSessionFactory sqlSessionFactory;

    public static SqlSession getSqlSession(){
        try{
            if(sqlSessionFactory==null) {
                Reader config = Resources.getResourceAsReader(mybatisConfig);
                synchronized (App.class) {
                    if(sqlSessionFactory==null)
                        sqlSessionFactory=new SqlSessionFactoryBuilder().build(config);
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return sqlSessionFactory.openSession();
    }
}

通过调用SqlSession的getMapper方法,将要获取的dao对象的class传入,然后MyBatis就会自己创造IUserDao的对象,采用的是jdk的动态代理技术。

将dao的实现类删除之后,mybatis底层只会调用selectOne()或selectList()方法。而框架选择方法的标准是dao层方法中用于接收返回值的对象类型。若接收类型为 List,则自动选择 selectList()方法;否则,自动选择 selectOne()方法。

你可能感兴趣的:(MyBatis之Mapper动态代理)