二、Mybatis使用动态代理完成增删改查

# 不使用动态代理
在使用动态代理时可以看到,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);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值