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属性
<mapper namespace="com.kons.dao.IUserDao">
这样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()方法。