1. 程式人生 > 實用技巧 >Mybatis開篇之CRUD~~封裝繼承實現

Mybatis開篇之CRUD~~封裝繼承實現

今天開始學習Mybatis,環境搭建一步步遇到問題,一點點解決,還可以,在學到CRUD的時候,發現對於SqlSession每次都需要建立一個,最後釋放,很是麻煩,於是想一想該怎麼優化程式碼,同時可以滿足開閉原則呢?OK話不多說,let's think about it;

對於Mybatis的使用,從最開始最基本的類有三個,參考官方文件,如下:

整個過程實際上就是:由建造者建造工廠>由工廠生產Session【建造者模式-》工廠模式】

(建造者)->(工廠)->(物件)

通過建造者模式構建的工廠建造者構建工廠,工廠建立例項。

OK,最主要的需要談一談CRUD程式碼,對於在Mapper中寫方法名,在xml中寫實現這些沒必要在這裡討論了,很簡單,對於呼叫的時候,我發現每次都是這幾個步驟,是不是很噁心啊?每次都要寫重複的程式碼:

      //開啟
     SqlSession sqlSession=MybatisUtils.getSqlSessionFactory();
        try {
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //業務程式碼
            User user=new User(0,"小庫","23");
            int insertCount = mapper.addUser(user);
            sqlSession.commit();
        }
        
catch (Exception e){ e.printStackTrace(); } finally { //釋放 sqlSession.close(); }

於是思考一下,對於這種首先建立連結,然後個人操作,最後關閉這個流程不就是模板方法模式的設計思想嗎?

同時考慮一下我構建一個SqlTemplate的話,這個類中可以執行很多其他的方法,因此最好不要定義成靜態的,因為我們只需要Session不同就可以啦,所以呢,只要一個SqlTemplate即可,OK,那就把它構建成單例模式

ok,let's write code;

首先定義個介面,代表我們自己需要執行的邏輯程式碼:

public interface SqlOperate<T> {
      void Operate(T mapper);
}

然後嘞,就是最重要的SqlTemplate了(其中的MybatisUtils是官網有示例,自己寫的一個工具類,這個想必大家都知道,只不過這是我自己起的名字)

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    //放在靜態程式碼塊,編譯器載入
    static {
        try {
            //第一步,獲取sqlSessionFactory工廠物件
            //通過SqlSessionFactoryBuilder工廠建造者構建工廠
            String resource = "mybatis-config.xml";
            InputStream inputStream = null;
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的例項。
    // SqlSession 提供了在資料庫執行 SQL 命令所需的所有方法
    public static SqlSession getSqlSessionFactory() {
        return sqlSessionFactory.openSession();
    }
}
MybatisUtils

/**
 * 寧新傑:建立sql模板,完成封裝
 * 使用了單例+模板
 */
public class SqlTemplate {
    private SqlTemplate(){};
    private static class InnerClass {
        private static SqlTemplate sqlTemplate = new SqlTemplate();
    }
    public static SqlTemplate getInstance(){
        return InnerClass.sqlTemplate;
    }

    public  void run(Class mapperClass, SqlOperate sqlOperate) {
        SqlSession sqlSession = MybatisUtils.getSqlSessionFactory();
        try {
            Object mapper = sqlSession.getMapper(mapperClass);
            sqlOperate.Operate(mapper);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
    }
}

OK,,呼叫呢?

 SqlTemplate.getInstance().run(UserMapper.class, new SqlOperate<UserMapper>() {
            @Override
            public void Operate(UserMapper mapper) {
                mapper.deleteById(new User(4));
            }
        });

是不是非常簡潔啊!perfect!

哦,對了,提醒大家一下,構建泛型的時候,如果不太熟練,首先使用具體的類來構建,比如這裡的我實際上是使用具體的【UserMapper】來構建的,構建好了之後,再替換的泛型的。

OK啦,每天進步一點點,繼續加油!逐夢~~~