Mapper的動(dòng)態(tài)代理
Mybatis可以通過(guò)dao接口直接定位到Mapper文件中的SQL語(yǔ)句绍些,這就是mapper的動(dòng)態(tài)代理
修改之前的程序
- 添加接口IUserDao
package com.kons.dao;
import com.kons.bean.User;
public interface IUserDao {
User findUserById(int id);
}
需要將IUserDao中的方法名與mapper.xml文件中的id名稱要一致,這樣子mybatis就可以將方法和sql語(yǔ)句一一對(duì)應(yīng)上了
- 更改user.xml文件中namespace屬性
<mapper namespace="com.kons.dao.IUserDao">
這樣mybatis就會(huì)將當(dāng)前的mapper.xml文件與IUserDao對(duì)應(yīng)上浮创。
- 接下來(lái)進(jìn)行測(cè)試缴罗,修改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();
}
}
通過(guò)調(diào)用SqlSession的getMapper方法絮供,將要獲取的dao對(duì)象的class傳入抚芦,然后MyBatis就會(huì)自己創(chuàng)造IUserDao的對(duì)象贸弥,采用的是jdk的動(dòng)態(tài)代理技術(shù)。
將dao的實(shí)現(xiàn)類刪除之后锻梳,mybatis底層只會(huì)調(diào)用selectOne()或selectList()方法箭券。而框架選擇方法的標(biāo)準(zhǔn)是dao層方法中用于接收返回值的對(duì)象類型。若接收類型為 List疑枯,則自動(dòng)選擇 selectList()方法辩块;否則,自動(dòng)選擇 selectOne()方法荆永。