mapper动态代理(MyBatis接口开发)

原则:约定优于配置

配置方式:

​ abc.xml

硬编码方式

​ abc.java

约定:默认值就是myProject

与传统配置的不同之处:省略掉statement,即根据约定直接定位出sql语句。

约定:

1
2
3
4
5
/*
* 1.方法名和mapper.xml文件中的id值相同
* 2.方法名的输入参数和mapper.xml文件中的标签parameterType类型一致
* 3.方法的返回值和mapper.xml文件中的resultType一致
*/

接口和mapper一一对应:namespace的value=接口的全类名

构建接口

所以说新建一个接口,根据前一个篇的mapper.xml的文件基础上改,注:我这里是把接口建在了mapper包下

1
2
3
4
5
Student queryStudentBystuNum(int stuno);
List<Student> queryAllStudent();
int addStudent(Student student);
int upDateStuByNo(Student student);
int deleteStuByNo(int stuno);

注意这里的接口要遵循上面的约定。

更改xml文件

再mapper.xml file中,namespace也应该改成接口的名字

1
<mapper namespace="top.eshyee.mapper.StudentMapper">

接下来,就是修改测试类,曾经使用的statement的地方,目前就不用使用了。

使用接口

这次拿删除学生举例,首先要从session中获取到这个接口,使用getMapper方法。然后从这个接口中要我刚刚写的那个删除的方法deleteStuByNo(),这里我写死删除no为3的 倒霉孩子

1
2
3
4
5
6
7
8
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sessionfactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionfactory.openSession();
StudentMapper stuMapper = session.getMapper(StudentMapper.class);
int count = stuMapper.deleteStuByNo(3);
session.commit();
System.out.println("删除成功," + count + "行受影响");
session.close();

测试一下

3号学生被删除并想你抛了一行log🌚

总结

约定相对于配置来说,出错率更少了,因为不用写statement,而是通过调用接口去实现xml的id的调用,对于写statement的String容易手残的老哥来说,是不错的选择。