【MyBatis框架】Mybatis開發dao方法第一部分

下面來討論mybatis開發Dao的方法

先來講一下基本架構流程中使用到的幾個類
1.SqlSession使用範圍

1.1SqlSessionFactoryBuilder
經過SqlSessionFactoryBuilder建立會話工廠SqlSessionFactory
將SqlSessionFactoryBuilder當成一個工具類使用便可,不須要使用單例管理SqlSessionFactoryBuilder。
在須要建立SqlSessionFactory時候,只須要new一次SqlSessionFactoryBuilder便可。

1.2 SqlSessionFactory
經過SqlSessionFactory建立SqlSession,使用單例模式管理sqlSessionFactory(工廠一旦建立,使用一個實例)。

未來mybatis和spring整合後,使用單例模式管理sqlSessionFactory。

1.3SqlSession
SqlSession是一個面向用戶(程序員)的接口。
SqlSession中提供了不少操做數據庫的方法:如:selectOne(返回單個對象)、selectList(返回單個或多個對象)。
SqlSession是線程不安全的,在SqlSesion實現類中除了有接口中的方法(操做數據庫的方法)還有數據域屬性。
SqlSession最佳應用場合在方法體內,定義成局部變量使用。
接下來就來講說MyBatis的Dao的寫法,分爲兩種,一種是原始Dao開發方法,一種是mapper代理方法,咱們下面一一討論:

2.原始dao開發方法(程序員須要寫dao接口和dao實現類)

2.1思路:程序員須要寫dao接口和dao實現類。
須要向dao實現類中注入SqlSessionFactory,在方法體內經過SqlSessionFactory建立SqlSession。

下面實現Dao的場景是基於以前對用戶數據進行增刪改查的需求。

2.2寫Dao接口
java

package cn.edu.hpu.mybatis.dao;
import cn.edu.hpu.mybatis.PO.User;
//用戶管理的Dao接口
public interface UserDao {    
    //根據Id查詢用戶信息
    public User findUserById(int id) throws Exception;    
    //添加用戶信息
    public void insertUser(User user) throws Exception;   
    //刪除用戶信息
    public void deleteUser(int id) throws Exception;  
    //修改用戶信息
    public void updateUser(User user) throws Exception;
}


2.3寫Dao的實現程序員

package cn.edu.hpu.mybatis.dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import cn.edu.hpu.mybatis.PO.User;
public class UserDaoImpl implements UserDao{

    //須要向dao實現類中注入SqlSessionFactory工廠
    //這裏咱們暫時沒用spring,咱們經過構造方法注入
    private SqlSessionFactory sqlSessionFactory;
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
        this.sqlSessionFactory=sqlSessionFactory;
    }
    
    @Override
    public void deleteUser(int id) throws Exception {
        
        SqlSession sqlSession=sqlSessionFactory.openSession();
        
        //傳入id刪除用戶
        sqlSession.delete("test.deleteUser",id);
        
        //提交事務
        sqlSession.commit();
        
        sqlSession.close();
    }


    @Override
    public User findUserById(int id) throws Exception {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        
        User user=sqlSession.selectOne("test.findUserById",id);
        
        //釋放資源
        sqlSession.close();
        return user;
    }


    @Override
    public void insertUser(User user) throws Exception {       
        SqlSession sqlSession=sqlSessionFactory.openSession();
        sqlSession.insert("test.insertUser",user);
        //提交事務
        sqlSession.commit();
        
        //釋放資源
        sqlSession.close();
        
    }


    @Override
    public void updateUser(User user) throws Exception {
        
        SqlSession sqlSession=sqlSessionFactory.openSession();
        
        sqlSession.update("test.updateUser",user);
        
        //提交事務
        sqlSession.commit();
        
        sqlSession.close();
        
    }
}


測試方法(這裏只測試findUserBiId方法):
spring

package cn.edu.hpu.mybatis.test;
import java.io.InputStream;
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 cn.edu.hpu.mybatis.PO.User;
import cn.edu.hpu.mybatis.dao.UserDao;
import cn.edu.hpu.mybatis.dao.UserDaoImpl;


public class UserDaoImplTest {

    private SqlSessionFactory sqlSessionFactory;
    //註解Before是在執行本類全部測試方法以前先調用這個方法
    @Before 
    public void setup() throws Exception{
        //建立SqlSessionFactory
        String resource="SqlMapConfig.xml";
        
        //將配置文件加載成流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //建立會話工廠,傳入mybatis配置文件的信息
        sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
    }
    
    @Test
    public void testFindUserById() throws Exception{
        
        //建立Dao對象
        UserDao userDao=new UserDaoImpl(sqlSessionFactory);
        
        //調用UserDao的方法
        User user=userDao.findUserById(1);
        
        System.out.println(user.getUsername());
        
    }
    
}

2.4總結原始 dao開發問題sql


一、dao接口實現類方法中存在大量模板方法,設想可否將這些代碼提取出來,大大減輕程序員的工做量。
二、調用sqlsession方法時將statement的id硬編碼了
三、調用sqlsession方法時傳入的變量,因爲sqlsession方法使用泛型,即便變量類型傳入錯誤,在編譯階段也不報錯,不利於程序員開發。


數據庫

下一篇總結咱們來使用mapper代理方法來寫Dao,來解決上面咱們發現的問題。apache

相關文章
相關標籤/搜索