看完了之前的mybatis原始的dao開發方法是不是覺得有點笨重,甚至說沒有發揮mybatis
作為一個框架的優勢。總結了一下,原始的dao方法有以下幾點不足之處
- dao接口實現方法中存在大量的模板方法,比如:
SqlSession sqlSession = sqlSessionFacory.openSession(); sqlSession.commit(); sqlSession.close();
這三行代碼幾乎在每個方法里面都能看見,設想能否將這些代碼提取出來,大大減輕程序員的工作量。
- 調用sqlSession方法時將statement的id硬編碼了。比如之前findUserById方法中的“test.findUserById”。
- 調用sqlSession方法時傳入變量,由於sqlSession方法使用泛型,即使變量類型傳入錯誤,在編譯階段也不會報錯。
所以既然出現了問題,改進是勢在必行的。接下來就讓我們看看如何改進。
當然就是今天的主題mapper代理開發方式了
正在這種開發方式中,程序員需要編寫mapper.xml文件,其實就是一個類似於之前的user.xml的文件
另外在mapper代理方法中程序員只要寫mapper接口(相當於dao接口)遵循一些開發規范,mybatis可以自動生成mapper接口實現類代理對象(就是實現接口類不用咱們去寫了)
具體有以下幾個規范:
-
在mapper.xml中的namespace等於mapper接口地址
- mapper.java接口中的方法名和mapper.xml中的statement的id一致
- mappe.java接口中的輸入參數類型和mapper.xml中的statement的parameterType指定的的參數類型一致。
- mapper.java接口中的返回值參數類型和mapper.xml中的statement的resultType的指定的類型一致。
根據以上規范可以寫出根據id查詢用戶信息方法的定義了
為了更好地理解上面的規范,下面給出映射文件方便進行對比
總結一下:以上規范就是對下面代碼進行統一生成
因為別的方法都大同小異,所以這里只寫了一個方法findUserById,下面測試也是一樣,直接測試mapper接口里的findUserById方法,別的方法就不去測試了
代碼如下:
public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception { //得到配置文件流 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //創建會話會話工廠 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindUserById() throws Exception { //創建會話 SqlSession sqlSession = sqlSessionFactory.openSession(); //創建mapper代理對象 UserMapper userMapper= sqlSession.getMapper(UserMapper.class); //調用代理對象的方法,打印結果 System.out.println(userMapper.findUserById(32)); } }
里面最重要的一句就是
UserMapper userMapper= sqlSession.getMapper(UserMapper.class);
這句代碼把我們之前的創建接口的實現類這一步的工作省略了,直接生成一個代理對象,然后通過這個對象去調用方法,執行一系列操作
結果如下:
好了,到這里兩種dao開發方法都講完了,當然后面與spring整合之后的dao開發方法更系統,用起來更棒更爽,請期待更新。。。