目錄
- 一、Dao開發
- 1. 實作介面中的select方法
- 2. 實作介面中insert方法
- 3. 實作介面中 update 方法
- 4. 實作介面中 delete 方法
- 二、Dao開發分析
- 三、Dao代理實作CURD
- 1. 使用getMapper獲取代理物件
- 四、總結
- 1. 什么是動態代理?
- 2. 使用動態代理的方式
- 3. 使用動態代理的要求
一、Dao開發
首先創建Dao介面
package com.md.dao;
import com.md.domain.Student;
import java.util.List;
/**
* @author MD
* @create 2020-08-05 14:18
*/
public interface StudentDao {
List<Student> selectStudents();
int insertStudent(Student student);
}
然后創建Dao介面的實作類
public class StudentDaoImpl implements StudentDao
1. 實作介面中的select方法
先在StudentDao.xml中寫對應的sql
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.md.dao.StudentDao">
<select id="selectStudents" resultType="com.md.domain.Student">
select id , name , eamil ,age from student
</select>
<insert id="insertStudent">
insert into student values(#{id},#{name},#{email},#{age})
</insert>
</mapper>
然后在實作類中寫具體的方法
public List<Student> selectStudents() {
// 工具類
SqlSession session = MyBatisUtil.getSqlSession();
List<Student> studentList = session.selectList("com.md.dao.StudentDao.selectStudents");
session.close();
return studentList;
}
在測驗類中寫
@Test
public void testSelectStudent(){
StudentDao dao = new StudentDaoImpl();
List<Student> studentList = dao.selectStudents();
studentList.forEach(stu -> System.out.println(stu));
}
需要注意:
- dao物件,型別是StudentDao,而這個介面的全限定名稱是:com.md.dao.StudentDao正好和型別是StudentDao.xml中的namespace是一樣的
- 方法名稱,selectStudents,這個方法的名稱正是mapper檔案中的id值 selectStudents
- 通過dao中方法的回傳值也是可以確定MyBatis要呼叫的SqlSession的方法
- 如果回傳的是list,那就說明呼叫的是selectList()方法
- 如果回傳的是int、或是其他,看mapper檔案中的標簽 <insert> , <update>
- 就會呼叫SqlSession的insert、update方法
- mybatis的動態代理,mybatis根據dao的方法呼叫,獲取執行sql陳述句資訊,mybatis根據你的dao介面,創建一個到介面的實作類,并創建這個類的物件,完成SqlSession呼叫方法,訪問資料庫
2. 實作介面中insert方法
@Override
public int insertStudent(Student student) {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
int nums = sqlSession.insert("com.md.dao.StudentDao.insertStudent",student);
// 注意提交事務
sqlSession.commit();
sqlSession.close();
return nums;
}
測驗類
int i = dao.insertStudent(new Student(1005, "李白", "[email protected]", 30));
System.out.println("成功插入:"+i+" 條資料");
3. 實作介面中 update 方法
public int updateStudent(Student student) {
SqlSession session = MyBatisUtil.getSqlSession();
int nums = session.insert(
"com.md.dao.StudentDao.updateStudent",student);
session.commit();
session.close();
return nums;
}
測驗:
public void testUpdate() throws IOException {
Student student = new Student();
student.setId(1006);
student.setAge(28);
int nums = studentDao.updateStudent(student);
System.out.println(" 使用 Dao 修改資料:"+nums);
}
4. 實作介面中 delete 方法
public int deleteStudent(int id) {
SqlSession session = MyBatisUtil.getSqlSession();
int nums = session.insert(
"com.md.dao.StudentDao.deleteStudent",1006);
session.commit();
session.close();
return nums;
}
測驗:
@Test
public void testDelete() throws IOException {
int nums = studentDao.deleteStudent(1006);
System.out.println(" 使用 Dao 修改資料:"+nums);
}

二、Dao開發分析
在前面例子中自定義 Dao 介面實作類時發現一個問題:
Dao 的實作類其實并沒有干什么實質性的作業,而且代碼還是千篇一律,它僅僅就是通過 SqlSession 的相關 API 定位到映射檔案 mapper 中相應 id 的 SQL 陳述句,真正對 DB 進行操作的作業其實是由框架通過 mapper 中的 SQL 完成的
所以,MyBatis 框架就拋開了 Dao 的實作類,直接定位到映射檔案 mapper 中的相應 SQL 陳述句,對DB 進行操作,這種對 Dao 的實作方式稱為 Mapper 的動態代理方式
Mapper 動態代理方式無需程式員實作 Dao 介面,介面是由 MyBatis 結合映射檔案自動生成的動態代
理實作的
三、Dao代理實作CURD
首先就是洗掉Dao介面的實作類

1. 使用getMapper獲取代理物件
只需呼叫 SqlSession 的 getMapper()方法,即可獲取指定介面的實作類物件,該方法的引數為指定 Dao介面類的 class 值
還是直接使用工具類獲取獲取SqlSession
/**
* 使用mybatis的動態代理機制, 使用SqlSession.getMapper(dao介面.class)
* getMapper能獲取dao介面對于的實作類物件,
*/
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
這樣的話就無需再寫實作類了,使用dao介面.class就行
上面使用傳統Dao的方式就可以修改成這樣
select
@Test
public void testSelectStudent(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
// 呼叫dao方法,執行資料庫操作
List<Student> studentList = dao.selectStudents();
studentList.forEach(stu -> System.out.println(stu));
}
insert
@Test
public void testInsertStudent(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
int i = dao.insertStudent(new Student(1006, "王昭君", "[email protected]", 30));
// 注意提交事務
sqlSession.commit();
System.out.println("成功插入:"+i+" 條資料");
}
這樣就更加的方便了
四、總結
1. 什么是動態代理?
mybatis幫你創建dao介面的實作類,在實作類中呼叫SqlSession的方法執行sql陳述句
2. 使用動態代理的方式
- 獲取SqlSession物件,SqlSessionFactory.openSession(),只不過我們可以直接使用工具類
- 使用getMapper方法獲取某個介面的物件,sqlSession.getMapper(介面.class);
- 呼叫介面的方法,呼叫那個方法就執行了mapper檔案中的那個sql陳述句
3. 使用動態代理的要求
- dao介面和mapper檔案放在一個目錄中
- dao介面和mapper檔案名稱一致
- mapper檔案中的namespace的值是dao介面的全限定名稱
- mapper檔案中的<select>、<insert>、<update>、<delete>等的id值是介面中的方法名
- dao介面中不要使用多載的方法,不要使用同名的,不同引數的方法
具體的如下:
目錄結構

dao介面:
package com.md.dao;
public interface StudentDao {
List<Student> selectStudents();
int insertStudent(Student student)
}
mapper檔案
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.md.dao.StudentDao">
<select id="selectStudents" resultType="com.md.domain.Student">
select id , name , eamil , age from student
</select>
<insert id="insertStudent">
insert into student values(#{id},#{name},#{email},#{age})
</insert>
</mapper>
這樣就ok了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/100237.html
標籤:Java
下一篇:BCB 怎樣上傳檔案到服務器
