標籤:
一、在前一篇中,存在一些問題:
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 介面調用必須具備以下條件:
Mapper 介面方法名 和 UserMapper.xml 中定義的每個 sql 的 id 同名。
Mapper 介面方法的輸入參數類型和 UserMapper.xml 中定義的 sql parameterType 類型相同。
Mapper 介面的輸出參數類型和 UserMapper.xml 中 定義的 sql 的 resultType 類型相同。
UserMapper.xml 檔案中的 namespace 即是 Mapper 介面的類路徑。
MyBatis 之 使用二 (Mapper介面的使用)