條條|MyBatis學(xué)習(xí)筆記3——?jiǎng)討B(tài)代理

3.1MyBatis的動(dòng)態(tài)代理

在調(diào)用MyBatis的類中的代碼是重復(fù)性的(見上篇MyBatis學(xué)習(xí)筆記),即不管是執(zhí)行其他數(shù)據(jù)庫(kù)操作或執(zhí)行多次相同操作還是要把這些代碼寫一遍,所以我們可以寫一個(gè)工具類,把重復(fù)性的代碼都放在這里,需要時(shí)調(diào)用即可

創(chuàng)建utils包和MyBatisUtils工具類
public class MyBatisUtils {


    private static SqlSessionFactory factory=null;

    static{
        String con="mybatis.xml";
        try {
            InputStream in = Resources.getResourceAsStream(con);

            factory= new SqlSessionFactoryBuilder().build(in);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static SqlSession getSqlSession(){//獲取SqlSession方法

        SqlSession sqlSession=null;

        if(factory!=null){
            //非自動(dòng)提交事務(wù)
            sqlSession=factory.openSession();
        }
        return sqlSession;
    }
}

則調(diào)用MyBatis類如下:

public class MyApp2 {//查詢數(shù)據(jù)庫(kù)的調(diào)用類
    public static void main(String[] args){

        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        String sqlId="com.mybatis.dao.StudentDao.selectStudents";

        List<Student> studentList = sqlSession.selectList(sqlId);

        for (Student student : studentList){
            System.out.println(student);
        }

        sqlSession.close();
    }
}

但是如此,我們的調(diào)用類和dao類卻沒有什么關(guān)聯(lián),所以我們要把一些操作寫入dao類中

public class StudentDaoImpl implements StudentDao {
    @Override
    public List<Student> selectStudents() {

        //獲取SqlSession對(duì)象
        SqlSession sqlSession= MyBatisUtils.getSqlSession();
        String sqlId="com.mybatis.dao.StudentDao.selectStudents";
        List<Student> students=sqlSession.selectList(sqlId);
        sqlSession.close();
        return students;
    }

    @Override
    public int insertStudent(Student student) {
        //獲取SqlSession對(duì)象
        SqlSession sqlSession= MyBatisUtils.getSqlSession();
        String sqlId="com.mybatis.dao.StudentDao.insertStudent";
        int num = sqlSession.insert(sqlId, student);
        //提交事務(wù)
        sqlSession.commit();
        sqlSession.close();
        return num;
    }
}

則調(diào)用類如下:

public class TestMyBatis {

    @Test
    public void test01(){
        StudentDao studentDao=new StudentDaoImpl();
        List<Student> l=studentDao.selectStudents();
        for (Student s:l){
            System.out.println(s);
        }
    }


    @Test
    public void testinsert(){
        StudentDao dao=new StudentDaoImpl();
        Student student=new Student();
        student.setId(1008);
        student.setName("新添加");
        student.setEmail("insert@qq.com");
        student.setAge(16);
        int i = dao.insertStudent(student);
        System.out.println(i);
    }
}

我們看上面可以發(fā)現(xiàn):

  1. dao對(duì)象的類型是StudentDao,全限定名稱:com.mybatis.dao.StudentDaonamespace一致
  2. 方法名稱:selectStudent和mapper文件中的id值一致
  3. 通過dao中方法的返回值可以確定MyBatis需要調(diào)用什么SqlSession方法,返回值=list==>調(diào)用selectList(),返回值=int/非int==>看mapper文件中標(biāo)簽是<insert>還是<update>再調(diào)用相應(yīng)方法

為此,我們可以通過mybatis的動(dòng)態(tài)代理:mybatis根據(jù)dao的方法調(diào)用,獲取執(zhí)行sql語(yǔ)句的信息
mybatis會(huì)根據(jù)你的dao接口,創(chuàng)建出一個(gè)dao接口的實(shí)現(xiàn)類并創(chuàng)建這個(gè)類的對(duì)象
完成SqlSession調(diào)用方法,訪問數(shù)據(jù)庫(kù)

調(diào)用類如下:
public class TestMyBatis {

    @Test
    public void test01(){
        SqlSession sqlSession= MyBatisUtils.getSqlSession();
        StudentDao dao=sqlSession.getMapper(StudentDao.class);
        List<Student> list = dao.selectStudents();
        System.out.println("原理=="+dao.getClass().getName());
        for (Student s: list
             ) {
            System.out.println(s);
        }
    }


    @Test
    public void testinsert(){

        SqlSession sqlSession=MyBatisUtils.getSqlSession();
        StudentDao dao=sqlSession.getMapper(StudentDao.class);
        Student student=new Student();
        student.setId(1009);
        student.setName("mybatis動(dòng)態(tài)代理");
        student.setEmail("ddd111@qq.com");
        student.setAge(22);
        int i = dao.insertStudent(student);
        System.out.println(i);
        sqlSession.commit();
        sqlSession.close();
    }
}
運(yùn)行
select結(jié)果

通過System.out.println("原理=="+dao.getClass().getName());我們可以看到dao是一個(gè)Proxy動(dòng)態(tài)代理

條條:該學(xué)習(xí)筆記是記錄了我的學(xué)習(xí)過程,學(xué)習(xí)自動(dòng)力節(jié)點(diǎn)c語(yǔ)言中文網(wǎng),有不對(duì)的地方歡迎指出

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容