承接上一篇 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.
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);}
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(); }}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 Code4.將原來(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 Code7.小結(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ù)方法的需求。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注