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):
- dao對(duì)象的類型是
StudentDao,全限定名稱:com.mybatis.dao.StudentDao和namespace一致 - 方法名稱:
selectStudent和mapper文件中的id值一致 - 通過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ì)的地方歡迎指出