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啦,每天進步一點點,繼續加油!逐夢~~~