国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

mybatis入門基礎(chǔ)(二)----原始dao的開發(fā)和mapper代理開發(fā)

2019-11-15 00:42:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
mybatis入門基礎(chǔ)(二)----原始dao的開發(fā)和mapper代理開發(fā)

  承接上一篇 mybatis入門基礎(chǔ)(一)

  看過(guò)上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重復(fù)代碼,看起來(lái)不是很清楚,但第一次那樣寫,是為了解mybatis的執(zhí)行步驟,先苦后甜嘛!

一:原始dao開發(fā)方法

  概要:1.在上篇中搭建好的框價(jià)中編寫dao接口和dao實(shí)現(xiàn)類

     2.向dao接口實(shí)現(xiàn)類中注入SqlsessionFactory,在方法體內(nèi)通過(guò)SqlSessionFactory創(chuàng)建sqlSession.

  • DAO接口類UserDAO.java  
package com.mybatis.dao;import java.util.List;import com.mybatis.entity.User;/** *  * @ClassName: UserDAO * @Description: TODO(用戶管理DAO接口) * @author warcaft * @date 2015-6-27 下午10:23:42 *  */public interface UserDAO {    /** 根據(jù)ID查詢用戶信息*/    public User findUserById(Integer id);    /**根據(jù)用戶名稱模糊查詢用戶信息*/    public List<User>  findUserByName(String username);    /** 添加用戶*/    public void insertUser(User user);    /** 根據(jù)ID刪除用戶*/    public void deleteUser(Integer id);    /** 根據(jù)ID更新用戶*/    public void updateUser(User user);}
  • dao實(shí)現(xiàn)類UserDaoImpl.java 
package com.mybatis.dao;import java.util.List;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import com.mybatis.entity.User;/** *  * @ClassName: UserDaoImpl * @Description: TODO(用戶管理接口的實(shí)現(xiàn)類) * @author warcaft * @date 2015-6-27 下午10:29:35 *  */public class UserDaoImpl implements UserDAO {    PRivate SqlSessionFactory sqlSessionFactory;    // 需要向dao實(shí)現(xiàn)類中注入SqlSessionFactory    // 通過(guò)構(gòu)造方法注入    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {        this.sqlSessionFactory = sqlSessionFactory;    }    @Override    public User findUserById(Integer id) {        SqlSession sqlSession = sqlSessionFactory.openSession();        User user = sqlSession.selectOne("test.findUserById", id);        // 釋放資源        sqlSession.close();        return user;    }    @Override    public List<User> findUserByName(String username) {        SqlSession sqlSession = sqlSessionFactory.openSession();        List<User> list = sqlSession                .selectList("test.findUserByName", username);        // 提交事務(wù)        sqlSession.commit();        // 釋放資源        sqlSession.close();        return list;    }    @Override    public void insertUser(User user) {        SqlSession sqlSession = sqlSessionFactory.openSession();        // 執(zhí)行插入操作        sqlSession.insert("test.insertUser", user);        // 提交事務(wù)        sqlSession.commit();        // 釋放資源        sqlSession.close();    }    @Override    public void deleteUser(Integer id) {        SqlSession sqlSession = sqlSessionFactory.openSession();        // 執(zhí)行插入操作        sqlSession.delete("test.deleteUser", id);        // 提交事務(wù)        sqlSession.commit();        // 釋放資源        sqlSession.close();    }    @Override    public void updateUser(User user) {        SqlSession sqlSession = sqlSessionFactory.openSession();        // 執(zhí)行插入操作        sqlSession.update("test.updateUser", user);        // 提交事務(wù)        sqlSession.commit();        // 釋放資源        sqlSession.close();    }}
  • JunitTest測(cè)試UserDaoImplTest.java
package com.mybatis.dao.test;import java.io.InputStream;import java.util.Date;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import com.mybatis.dao.UserDaoImpl;import com.mybatis.entity.User;public class UserDaoImplTest {    private SqlSessionFactory sqlSessionFactory;    @Before    public void setUp() throws Exception {        String resource = "SqlMapConfig.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);    }    @Test    public void findUserByIdTest() {        UserDaoImpl userDao = new UserDaoImpl(sqlSessionFactory);        User user = userDao.findUserById(1);        System.out.println(user);    }    @Test    public void findUserByNameTest() {        UserDaoImpl userDao = new UserDaoImpl(sqlSessionFactory);        List<User> list = userDao.findUserByName("小");        System.out.println(list);    }    @Test    public void insertUserTest() {        UserDaoImpl userDao = new UserDaoImpl(sqlSessionFactory);        User user = new User();        user.setUsername("張三豐");        user.setSex("1");        user.setBirthday(new Date());        user.setAddress("武當(dāng)山");        userDao.insertUser(user);    }    @Test    public void deleteUserTest() {        UserDaoImpl userDao = new UserDaoImpl(sqlSessionFactory);        userDao.deleteUser(8);    }    @Test    public void updateUserTest() {        UserDaoImpl userDao = new UserDaoImpl(sqlSessionFactory);        User user = new User();        user.setId(1);        user.setUsername("王六");        user.setSex("2");        user.setAddress("天津");        user.setBirthday(new Date());        userDao.updateUser(user);    }}

才上面的代碼可以看出,比起之前那個(gè)MybatisService.java類里面的內(nèi)容稍微清晰了點(diǎn)吧。但依然存在以下幾個(gè)問(wèn)題:

  1.dao接口中存在大量模版方法,能否把這些代碼提出來(lái),減少我們的工作量

  2.調(diào)用sqlSession方法時(shí)將statement的id硬編碼了

  3.調(diào)用sqlSession傳入的變量,由于sqlSession方法使用泛型,即使變量類型傳入錯(cuò)誤,在編譯階段也不報(bào)錯(cuò),不利于程序開發(fā)。

所以我們帶著這幾個(gè)問(wèn)題看看mapper代理開發(fā)的方法,是否能解決這些問(wèn)題呢?

二:mapper代理方法(只需要mapper接口,相當(dāng)于dao接口)

1.概要:(1).編寫XXXmapper.xml的映射文件

    (2).編寫mapper接口需要遵循一些開發(fā)規(guī)范,mybatis可以自動(dòng)生成mapper接口實(shí)現(xiàn)類代理對(duì)象。

2.開發(fā)規(guī)范:

  (1).在XXXmapper.xml中namespace等于mapper接口地址;

  

(2).XXXmapper.java接口中的方法和mapper.xml中的statement的Id一致。

  (3).mapper.java接口中的方法輸入?yún)?shù)和mapper.xml中statement的parameterType指定的類型一致。

  (4).mapper.java接口中的方法的返回值類型和mapper.xml中statement的resultType指定的類型一致。

  

  

小結(jié):以上的開發(fā)規(guī)范主要是對(duì)下面的代碼進(jìn)行統(tǒng)一生成 

    SqlSession sqlSession = sqlSessionFactory.openSession();    User user = sqlSession.selectOne("test.findUserById", id);  ......

3.UserMapper.java類代碼

package com.mybatis.mapper;import java.util.List;import com.mybatis.entity.User;/** *  * @ClassName: UserDAO * @Description: TODO(用戶管理mapper接口) * @author warcaft * @date 2015-6-27 下午10:23:42 *  */public interface UserMapper {    /** 根據(jù)ID查詢用戶信息 */    public User findUserById(int id);    /** 根據(jù)用戶名稱模糊查詢用戶信息 */    public List<User> findUserByName(String username);    /** 添加用戶 */    public void insertUser(User user);    /** 根據(jù)ID刪除用戶 */    public void deleteUser(Integer id);    /** 根據(jù)ID更新用戶 */    public void updateUser(User user);}
View Code

4.將原來(lái)的User.xml拷貝修改名稱為UserMapper.xml,只需修改此行代碼即可

<!-- namespace命名空間,作用就是對(duì)sql進(jìn)行分類化的管理,理解為sql隔離    注意:使用mapper代理開發(fā)時(shí),namespace有特殊作用,namespace等于mapper接口地址 --><mapper namespace="com.mybatis.mapper.UserMapper">

5.在SqlMapConfig.xml中加載UserMapper.xml

<!-- 加載映射文件 -->    <mappers>        <mapper resource="sqlmap/User.xml"/>        <mapper resource="mapper/UserMapper.xml"/>    </mappers>

6.Junit測(cè)試UserMapperTest.java

package com.mybatis.dao.test;import java.io.InputStream;import java.util.Date;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import com.mybatis.entity.User;import com.mybatis.mapper.UserMapper;public class UserMapperTest {    private SqlSessionFactory sqlSessionFactory;    // 此方法是在執(zhí)行findUserByIdTest之前執(zhí)行    @Before    public void setUp() throws Exception {        String resource = "SqlMapConfig.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        // 創(chuàng)建SqlSessionFcatory        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);    }    @Test    public void testFindUserById() {        SqlSession sqlSession = sqlSessionFactory.openSession();        // 創(chuàng)建Usermapper對(duì)象,mybatis自動(dòng)生成mapper代理對(duì)象        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        User user = mapper.findUserById(1);        System.out.println(user);        sqlSession.close();    }    @Test    public void testFindUserByName() {        SqlSession sqlSession = sqlSessionFactory.openSession();        // 創(chuàng)建Usermapper對(duì)象,mybatis自動(dòng)生成mapper代理對(duì)象        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        List<User> list = mapper.findUserByName("小");        System.out.println(list);        sqlSession.close();    }    @Test    public void testDeleteUser() {        SqlSession sqlSession = sqlSessionFactory.openSession();        // 創(chuàng)建Usermapper對(duì)象,mybatis自動(dòng)生成mapper代理對(duì)象        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        mapper.deleteUser(6);        sqlSession.commit();        sqlSession.close();    }        @Test    public void testInsertUser() {        SqlSession sqlSession = sqlSessionFactory.openSession();        // 創(chuàng)建Usermapper對(duì)象,mybatis自動(dòng)生成mapper代理對(duì)象        User user = new User();        user.setUsername("者別");        user.setSex("1");        user.setAddress("蒙古乞顏部落");        user.setBirthday(new Date());        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        mapper.insertUser(user);        sqlSession.commit();        sqlSession.close();    }        @Test    public void testUpdateUser() {        SqlSession sqlSession = sqlSessionFactory.openSession();        // 創(chuàng)建Usermapper對(duì)象,mybatis自動(dòng)生成mapper代理對(duì)象        User user = new User();        user.setId(11);//必須設(shè)置Id        user.setUsername("神箭手者別");        user.setSex("1");        user.setAddress("蒙古乞顏部落");        user.setBirthday(new Date());        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        mapper.updateUser(user);        sqlSession.commit();        sqlSession.close();    }}
View Code

7.小結(jié)

  (1).代理對(duì)象內(nèi)部調(diào)用selectOne()和selectList():如果mapper對(duì)象返回單個(gè)pojo對(duì)象(非集合對(duì)象)代理對(duì)象內(nèi)部通過(guò)selectOne查詢數(shù)據(jù)庫(kù),如果mapper方法返回集合對(duì)象,代理對(duì)象內(nèi)部通過(guò)selectList查詢數(shù)據(jù)庫(kù)。

  (2).mapper接口中的方法參數(shù)只能有一個(gè)是否影響系統(tǒng)開發(fā):

  mapper接口方法參數(shù)只能有一個(gè),系統(tǒng)是否不利于維護(hù)?

  回答:系統(tǒng)框架中,dao層的代碼是被業(yè)務(wù)層公用的。機(jī)試mapper接口只有一個(gè)參數(shù),可以使用包裝類型的pojo滿足不同的業(yè)務(wù)方法的需求。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安仁县| 新安县| 宜兰县| 买车| 新野县| 大化| 新河县| 五台县| 潮州市| 札达县| 华阴市| 柳州市| 土默特右旗| 昌宁县| 山阳县| 长白| 灵石县| 蚌埠市| 丰城市| 丹阳市| 万州区| 蓝山县| 嘉定区| 青阳县| 松原市| 平塘县| 蚌埠市| 凌云县| 正阳县| 右玉县| 扶风县| 蒙城县| 济宁市| 堆龙德庆县| 乳山市| 珠海市| 铜陵市| 石嘴山市| 山西省| 金昌市| 嵊泗县|