# 不使用动态代理
在使用动态代理时可以看到,Dao层的接口并没有使用。
这里的方法名都是灰色,说明并没有被调用。此时如果把Dao中的方法都注释掉,程序仍然可以运行。
通过结果,可以发现,程序的增删改查,实际上和StudentDao接口一毛钱关系都没有。
通过sqlSession的selectList方法、insert方法、 update方法、delete方法参数名称找到对应xml映射文件中对应sql 语句来执行对数据库中表数据的增删改查。
这里的参数只和StudentDao.xml映射文件中的命名空间和id值有关。
sqlSession的selectList方法、insert方法、 update方法、delete方法执和StudentDao接口中的方法也没有任何关系。这些方法是SqlSession对象内置的。
使用Dao开发方式实现
1.创建实体类
2.创建dao接口
3.创建dao接口实现类
这些在上篇文章中都有提过,就不过多赘述了。
public class StudentDaoImpl implements StudentDao {
@Override
public List<Student> selectStudents() {
// 获取 SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//执行 SqlSession 的 selectList()
List<Student> studentList = sqlSession.selectList("com.blb.dao.StudentDao.selectStudents");
sqlSession.close();
return studentList;
}
}
4.创建xml映射文件
5.创建mybatis的主配置文件
6.创建测试的内容
public class MyBatisTest {
// 要使用dao方法
// 接口类型 变量=new 接口的实现类();
StudentDao studentDao = new StudentDaoImpl();
@Test
public void testSelect() throws IOException {
List<Student> studentList = studentDao.selectStudents();
//循环输出查询结果
for(Student stu:studentList){
System.out.println("查询的学生对象: "+stu);
}
}
}
以上代码就可以调用接口中的方法来执行sql语句操作数据库。
同时也可以看到Dao中的方法名高亮
其他的增删改查就根据内容自己编写吧。
使用动态代理
使用动态代理的好处就是,mybatis创建一个对象代替你的 dao实现类功能,不需要写dao实现类了
使用mybatis动态代理要求
mapper文件中的namespace 一定dao接口的全限定名称
mapper文件中 标签的id是dao接口方法名称
其他不变,把Dao实现类去掉
使用getMapper
获取代理对象
动态代理: 使用SqlSession.getMapper(dao接口.class) 获取指定dao接口的实现类对象。
该方法的参数为指定 dao接口类的 class 值。
编写测试类
@Test
public void testSelect() throws IOException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
// List<Student> studentList = sqlSession.selectList("com.wz.dao.StudentDao.selectStudents");
// 动态代理: 使用sqlSession.getMapper(dao接口.class) 获取指定dao接口的实现类对象 ( StudentDaoImpl类)
StudentDao dao = sqlSession.getMapper(StudentDao.class);
// 1.StudentDao.class 这里采用反射机制 可以获取 StudentDao的全限定类型名称 com.wz.dao.StudentDao
// 从而获取sql mapper 映射文件中的位置
// mybatis创建指定dao接口的实现类对象 相当于 StudentDao dao = new StudentDaoImpl();
// dao就可以调用自己的方法了 会根据方法名称找到对应的sql
// 2.通过 dao.selectStudents() 就可以找到 com.wz.dao.StudentDao.selectStudents 根据 dao的方法调用,获取执行sql语句的信息。
// 3.确定调用sqLsession的那一个方法 (增删改查的方法 insert、update、selectOne、selectList )
// 3.1 mybaits可以根据mapper文件中的标签,如果标签是<insert>,调用SqlSession.insert()方法, <update>就会调用SqlSession.update()
// 3.2 mybaits也可以根据dao接口的方法返回值,如果返回是一个对象,例如Student ,调用sqLSession.selectone();
// 如果dao接口中的方法返回List,调用sqLSession的 selectList();
// 如果返回值是int或不是List的,看mapper文件中的标签是<insert>, <update>就会调用sqlsession 的insert , update等方法
// 通过dao中方法的返回值也可以确定MyBatis要调用的SqlSession的哪一个方法
List<Student> studentList = dao.selectStudent();
//循环输出查询结果
for(Student stu:studentList){
System.out.println("查询的学生对象: "+stu);
}
}
接口实现是由 mybatis结合映射文件自动生成的动态代理完成的。
获取的对应映射文件,让映射器通过命名空间和方法名称找到对应的sql,发送给数据库执行后返回结果。
其他方法就请参照上面的案例仿写吧,其实改动不多,无非是把
sqlSession.selectList("com.wz.dao.StudentDao.selectAllStudents");
改成
sqlSession.getMapper(StudentDao.class);