MyBatis 之 使用二 (Mapper介面的使用)

來源:互聯網
上載者:User

標籤:

一、在前一篇中,存在一些問題:

    1.  沒有使用介面編程,Java是面向介面程式設計語言。應該對資料庫操作定義一些介面,調用dao介面完成資料庫操作。

public interface UserDao {//根據Id查詢使用者資訊public User findUserById(int userId) throws Exception;//添加使用者public void insertUser(User user) throws Exception;//修改使用者public void updateUser(User user) throws Exception;//刪除使用者public void deleteUser(int userId) throws Exception;}public class UserDaoImpl implements UserDao {private SqlSessionFactory sqlSessionFactory;//通過spring將 SqlSessionFactory 注入,這裡沒有spring,暫時使用構造方法代替public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {this.setSqlSessionFactory(sqlSessionFactory);}@Overridepublic User findUserById(int userId) throws Exception {SqlSession sqlSession = null;User user = null;try {//通過SqlSessionFactory擷取SqlSessionsqlSession = sqlSessionFactory.openSession();//使用session操作資料庫//selectOne第一個參數:指定sql的id(statement id),注意帶上namespace;第二個參數:向sql中傳的參數值user = sqlSession.selectOne("test.findUserById", userId);System.out.println(user);} catch (Exception e) {// TODO: handle exception} finally {if (sqlSession != null) {sqlSession.close();}}return user;}@Overridepublic void insertUser(User user) throws Exception {SqlSession sqlSession = null;try {//通過SqlSessionFactory擷取SqlSessionsqlSession = sqlSessionFactory.openSession();//使用session操作資料庫sqlSession.insert("test.insertUser", user);//提交事務sqlSession.commit();} catch (Exception e) {// TODO: handle exception} finally {if (sqlSession != null) {sqlSession.close();}}}}

    2.  雖然上面改寫成Dao介面實作類別的方式,但訪問sql對應檔中定義的sql時需要調用 SqlSession 的 selectOne() 方法,          並將 sql 的位置(命名空間 + id)和參數傳遞到 selectOne() 方法中,且第一個參數是長字串,第二個參數是object          對象,編寫代碼時出現錯誤無法 在編譯階段發現。

        最佳化:

        第一步:定義UserMapper.xml, 還用原來的不用變

        第二步:定義mapper介面

public interface UserMapper {//根據Id查詢使用者資訊public User findUserById(int userId) throws Exception;//添加使用者public void insertUser(User user) throws Exception;//修改使用者public void updateUserById(User user) throws Exception;//刪除使用者public void deleteUserById(int userId) throws Exception;}

                介面定義有以下特點:

                        a. Mapper 介面方法名和 UserMapper.xml 中定義的每個 sql 的 id 同名。

                        b. Mapper 介面方法的輸入參數類型和 UserMapper.xml 中定義的 sql parameterType 類型相同。

                        c. Mapper 介面的輸出參數類型和 UserMapper.xml 中 定義的 sql 的 resultType 類型相同。

        第三步:修改 UserMapper.xml 的namespace

                修改後的 namespace 即是 Mapper 介面的類路徑。

<mapper namespace="mybatis.mapper.UserMapper">

        第四步:通過 Mapper 介面調用statement 去操作資料庫

public class UserMapperTest extends TestCase {private SqlSessionFactory sqlSessionFactory;String resource = "SqlMapConfig.xml";//任何測試方法都要執行的方法@Overrideprotected void setUp() throws Exception {super.setUp();//通過輸入資料流讀取設定檔InputStream inputStream = Resources.getResourceAsStream(resource);//擷取SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}public User testFindUserById() throws Exception {//擷取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//指定 mapper 介面的類型,MyBatis通過動態代理的方式實現mapper介面UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.findUserById(100101);sqlSession.commit();sqlSession.close();//查詢主鍵為100101的使用者並輸出System.out.println("user---" + user);return user;}public void testInsertUser() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//指定 mapper 介面的類型,MyBatis通過動態代理的方式實現mapper介面UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = new User();user.setUsername("Dina");user.setSex("0");user.setBirthday(new Date());user.setAddress("Redwood City");user.setDetail("good person");user.setScore(99.2f);userMapper.insertUser(user);sqlSession.commit();sqlSession.close();}public void testUpdateUserById() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();//指定 mapper 介面的類型,MyBatis通過動態代理的方式實現mapper介面UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = new User();user.setUserId(100102);user.setUsername("Golden");user.setSex("0");user.setBirthday(new Date());user.setAddress("Shen zhen");user.setDetail("good person");user.setScore(89.2f);userMapper.updateUserById(user);sqlSession.commit();sqlSession.close();}public void testDeleteUserById() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);userMapper.deleteUserById(100110);sqlSession.commit();sqlSession.close();}}


總結:

使用 Mapper 介面的方式,不用寫介面實作類別介面完成資料庫操作,簡單方便,此方法是官方推薦。

是MyBatis一種很重要的用法。

使用 Mapper 介面調用必須具備以下條件:

  1. Mapper 介面方法名 和 UserMapper.xml 中定義的每個 sql 的 id 同名。

  2. Mapper 介面方法的輸入參數類型和 UserMapper.xml 中定義的 sql parameterType 類型相同。

  3. Mapper 介面的輸出參數類型和 UserMapper.xml 中 定義的 sql 的 resultType 類型相同。

  4. UserMapper.xml 檔案中的 namespace 即是 Mapper 介面的類路徑。

MyBatis 之 使用二 (Mapper介面的使用)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.