SSM筆記——入門案例分析

分析

package com.ccut.test;

import com.ccut.dao.IUserDao;
import com.ccut.domain.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {
    /**
     * 入門案例
     * @param args
     */
    public static void main(String[] args) throws IOException {
        //1、讀取配置文件
        InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml");

        //2、創建SqlSessionFactory工廠
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        SqlSessionFactory factory=builder.build(in);

        //3、使用工廠生產SqlSession對象
        SqlSession session=factory.openSession();

        //4、使用SqlSession創建Dao接口的代理對象
        IUserDao userDao=session.getMapper(IUserDao.class);

        //5、使用代理對象執行方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }
        //6、釋放資源
        session.close();
        in.close();

    }
}
  1. 絕對路徑:d:\xxx\\xxx.html,使用類加載器,只能讀取類加載的配置文件
  2. 相對路徑:src/xxx/xxx.html,使用ServletContext對象getRealPath()

 

  • 創建工廠時mybatis使用了構建者模式

       優勢:把對象的創建細節隱藏,讓使用者直接條用方法即可拿到對象。

       builder就是構建者。

 

  • 生產SqlSession使用了工廠模式

      優勢:解耦,降低類之間的依賴關係。

 

  • 創建DAO接口使用了代理模式

       優勢:不修改源碼的基礎上對已有方法增強。

 

 

mybatis在使用dao代理模式實現增刪改查時做了什麼事?

做了兩件事:

第一、創建代理對象

第二、在代理對象中調用selectList

 

1、

連接數據庫的信息,有了他們就能創建Connection對象。

 

2、

有了它就有了映射配置信息。

 

3、

有了它就有了執行的SQL語句,就可以獲取PrepareStatement,此配置中還有實體類封裝的全限定類名。

 

讀取(1)(2)(3)配置文件用到的技術是解析XML的技術,此處使用dom4j解析xml。

 

解析完成後:

1、根據配置文件創建Connection對象

   註冊驅動、獲取連接。。。

2、獲取預處理對象PreparedStatement

    此時需要SQL語句

    conn.preparedStatement(sql);

3、執行查詢

    ResultSet resultSet = preparedStatement.excuteQuery();

4、遍歷結果集用於封裝

List<E> list =new ArrayList<>();

while(resultSet.next()){

        E element=(E)class.forName(配置的全限定類名).newInstance();

        進行封裝,把每個rs內容添加到element中

        【反射封裝】我們的實體類屬性和表的列明是一致的。於是我們就可以把表的列名來看成實體類的屬性名稱,於是就可以使用反射的方式來根據名稱獲取每個屬性,並把值賦值進去。

        把element加入到list中

        list.add(element);

}

 

5、返回list集合

return list;

 

要想讓方法執行,需要提供來給兩個信息:

第一個:連接信息

第二個:映射信息

 

映射信息包含兩個部分:1、執行的sql語句  2、封裝結果的實體類的全限定類名。那這兩個信息組合起來定義成一個對象Mapper,

 

 

代理對象分析

1、根據dao接口的字節碼創建dao的代理對象

public <T>T  getMapper(Class<T>   daoInterfaceClass{

         類加載器:他使用和被代理對象相同的類加載器。

         代理對象要實現的,和被代理對象實現相同的接口。

         如何代理:他就是增強的方法,需要自己來提供。此處是一個InvocationHandler的接口,我們需要寫一個該接口的實現類,再該接口的實現類中調用selectlist方法。

          proxy.newProxyInstance(類加載器,代理對象要實現的字節碼數組,如何代理)

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章