原始dao和Mapper动态代理的开放方式---Mybatis学习笔记(六)
生活随笔
收集整理的這篇文章主要介紹了
原始dao和Mapper动态代理的开放方式---Mybatis学习笔记(六)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.原始Dao開發方式
原始Dao開發方法需要程序員編寫Dao接口和Dao實現類。
1.映射文件:(user.xml)
2.Dao接口:
package com.huihui.dao;import java.util.List;import com.huihui.pojo.User;public interface UserDao {//根據id查詢用戶信息public User findUserById(int id) throws Exception;//根據用戶的名稱查詢用戶的信息public List<User> findUserByName(String name) throws Exception;//添加用戶信息public void insertUser(User user) throws Exception;//刪除用戶信息public void deleteUser(int id) throws Exception;}3.Dao接口實現類:
package com.huihui.dao;import java.util.List;import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory;import com.huihui.pojo.User;public class UserDaoImpl implements UserDao{//需要向dao實現類中注入SqlSessionFactory//這里通過構造方法注入private SqlSessionFactory sqlSessionFactory;public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}@Overridepublic User findUserById(int id) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();User user = sqlSession.selectOne("test.findUserById", id);//釋放資源sqlSession.close();return user;}@Overridepublic void insertUser(User user) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();sqlSession.insert("test.insertUser", user);//提交事務sqlSession.commit();//釋放資源sqlSession.close();}@Overridepublic void deleteUser(int id) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();sqlSession.delete("test.deleteUser", id);//提交事務sqlSession.commit();//釋放資源sqlSession.close();}@Overridepublic List<User> findUserByName(String name) throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();sqlSession.selectList("test.findUserByUsername", name);//釋放資源sqlSession.close();return null;}}4.加載user.xml文件
修改SqlMapConfig.xml文件:
5.測試代碼:
public class UserDaoImplTest {private SqlSessionFactory sqlSessionFactory;@Before//此方法是運行下面的測試用例的方法之前執行的public void setUp() throws Exception{//創建sqlSessionFactory//mybatis配置文件路徑String resource = "SqlMapConfig.xml";//得到配置文件流InputStream inputStream = Resources.getResourceAsStream(resource);//創建會話工廠,傳入mybatis的配置文件信息sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testFindUserById() throws Exception{//創建一個userDao的對象UserDao userDao = new UserDaoImpl(sqlSessionFactory);//調用UserDao方法User user = userDao.findUserById(1);System.out.println(user);}@Testpublic void testFindUserByName() throws Exception{//創建一個userDao對象UserDao userDao = new UserDaoImpl(sqlSessionFactory);//調用UserDao方法List<User> list = userDao.findUserByName("張");System.out.println(list.size());} }分析原始Dao開發方式存在的問題:
原始Dao開發中存在以下問題:
2.mapper動態代理的方法
實現原理
Mapper接口開發方法只需要程序員編寫Mapper接口(相當于Dao接口),由Mybatis框架根據接口定義創建接口的動態代理對象,代理對象的方法體同上邊Dao接口實現類方法。
Mapper接口開發需要遵循以下規范:
只有遵循以上規范,mybatis才可以自動生成mapper接口的實現類代理對象。
其實以上的規范主要為了相對于dao實現類中的以下方法進行了自動生成:
1.映射文件(UserMapper.xml文件):
定義mapper映射文件UserMapper.xml(內容同User.xml一樣),需要修改namespace的值為UserMapper接口路徑。將UserMapper.xml放在classpath下mapper目錄下。
2.接口(UserMapper.java文件)
接口定義有如下特點:
3.加載UserMapper.xml文件
<!-- 加載映射文件 --><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>4.測試代碼:
package com.huihui.mapper;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.huihui.pojo.User;public class UserMapperTest {private SqlSessionFactory sqlSessionFactory;@Before//此方法是運行下面的測試用例的方法之前執行的public void setUp() throws Exception{//創建sqlSessionFactory//mybatis配置文件路徑String resource = "SqlMapConfig.xml";//得到配置文件流InputStream inputStream = Resources.getResourceAsStream(resource);//創建會話工廠,傳入mybatis的配置文件信息sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic void testFindUserById() throws Exception {//通過會話工廠得到會話SqlSession sqlSession = sqlSessionFactory.openSession();//創建UserMapper對象,mybatis自動生成mapper代理對象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.findUserById(30);System.out.println(user);sqlSession.close();}@Testpublic void testFindUserByName() throws Exception {//通過會話工廠得到會話SqlSession sqlSession = sqlSessionFactory.openSession();//創建UserMapper對象,mybatis自動生成mapper代理對象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> list = userMapper.findUserByUsername("張");System.out.println(list.size());sqlSession.close();}@Testpublic void testInsertUser() throws Exception {//通過會話工廠得到會話SqlSession sqlSession = sqlSessionFactory.openSession();//創建UserMapper對象,mybatis自動生成mapper代理對象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = new User();user.setSex("2");user.setBirthday(new Date());user.setAddress("北京豐臺");user.setUsername("噠噠噠");userMapper.insertUser(user);sqlSession.commit();//提交事務sqlSession.close();}@Testpublic void testDeleteUser() throws Exception {//通過會話工廠得到會話SqlSession sqlSession = sqlSessionFactory.openSession();//創建UserMapper對象,mybatis自動生成mapper代理對象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);userMapper.deleteUser(30);sqlSession.commit();//提交事務sqlSession.close();}}重點說明:
動態代理對象調用sqlSession.selectOne()和sqlSession.selectList()是根據mapper接口方法的返回值決定,如果返回list則調用selectList方法,如果返回單個對象則調用selectOne方法。
系統框架中,dao層的代碼是被業務層公用的。即使mapper接口中只有一個參數,也可以使用包裝類型的pojo滿足不同的業務方法的需求。
注意:持久層中方法的參數可以是包裝類型(eg:map,…..),但是service方法中不建議使用包裝類型(原因:不利于業務層的可擴展)。
總結
以上是生活随笔為你收集整理的原始dao和Mapper动态代理的开放方式---Mybatis学习笔记(六)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SqlSession的使用范围---My
- 下一篇: SqlMapConfig.xml配置文件