Mybatis约定和基于动态代理方式主要的实现方式是用过接口,也称之为Mybatis接口开发,使用Mybatis接口开发主要有3个约定:
1.方法名和mapper.xml配置文件中的标签的id值一样。
2.方法的参数和mapper.xml配置文件中的标签的parameterType的类型一样。
3.方法的返回值和mapper.xml配置文件中的标签的resultType一样。
注意:在mapper.xml中,返回值的类型不论是一个(Student)还是多个(List<Student>),在requestType中都只用写一个即可,但是在接口中,如果返回值有多个(List<Student>),那么就需要写多个。如果parameterType没有,那么在接口中也不写,如果requestType没有,那么在接口中写void。
StudentMapper接口:
package com.lee.mapper;
import java.util.List;
import com.lee.entity.Student;
//用来操作Mybatis的接口
public interface StudentMapper {
//根据学号查询单个学生
Student queryStudentByStuNo(int stuNo);
//查询全部学生
List<Student> queryAllStudents();
//根据学号删除学生
void deleteStudentByStuNo(int stuNo);
//增加学生
void addStudent(Student student);
//根据学号更新学生
void updateStudentByStuNo(Student student);
}
除了这3个约定之外,想要实现接口中的方法和mapper.xml配置文件中的SQL标签一一对应,还需要使得mapper.xml配置文件中的namespace的值就是接口的全类名,这样才能让接口中的方法和mapper.xml文件中的SQL标签一一对应。
mapper.xml配置文件:
<?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.lee.mapper.StudentMapper">
<select id="queryStudentByStuNo" resultType="com.lee.entity.Student" parameterType="int">
select * from student where stuNo = #{stuNo}
</select>
<select id="queryAllStudents" resultType="com.lee.entity.Student">
select * from student
</select>
<insert id="addStudent" parameterType="com.lee.entity.Student">
insert into student(stuNo,stuName,stuAge,stuClass) values(#{stuNo},#{stuName},#{stuAge},#{stuClass})
</insert>
<delete id="deleteStudentByStuNo" parameterType="int">
delete from student where stuNo = #{stuNo}
</delete>
<update id="updateStudentByStuNo" parameterType="com.lee.entity.Student">
update student set stuName = #{stuName}, stuAge = #{stuAge}, stuClass = #{stuClass} where stuNo = #{stuNo}
</update>
</mapper>
约定的过程:
1.程序根据接口的全类名找到mapper.xml配置文件(namespace=接口全类名)。
2.找到mapper.xml配置文件之后,然后在配置文件中根据接口的方法名找到配置文件中对应的SQL标签。
这样,当调用接口的时候,程序就能够自动根据接口找到需要执行的配置文件中的SQL标签,默认的把SQL配置文件和接口放在同一个包中。
测试类:
在测试的时候,就不需要再通过namespace.id的方式来获得SQL标签。只需要直接调用接口即可,使用session.getMapper()获取到接口,然后使用接口调用接口中的方法。
package com.lee.test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.lee.entity.Student;
import com.lee.mapper.StudentMapper;
public class Test {
//根据学号查询单个学生
public static void queryStudentByStuNo() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sqlSession = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSession.openSession();
//使用动态代理的方式查询学生
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
Student student = studentMapper.queryStudentByStuNo(1); //接口中的方法->SQL语句
System.out.println(student);
session.close();
}
//查询全部学生
public static void queryAllStudents() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sqlSession = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSession.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
List<Student> students = studentMapper.queryAllStudents();
System.out.println(students);
session.close();
}
//添加学生
public static void addStudent() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sqlSession = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSession.openSession();
Student student = new Student(4,"ww",23,"S4");
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.addStudent(student);
session.commit(); //因为JDBC方式的事务管理需要自己手动提交
System.out.println("增加成功");
session.close();
}
//删除学生
public static void deleteStudentByStuNo() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sqlSession = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSession.openSession();
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.deleteStudentByStuNo(1);
session.commit();
System.out.println("删除成功");
session.close();
}
//更新学生
public static void updateStudent() throws IOException {
Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory sqlSession = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSession.openSession();
Student student = new Student(2,"lisi",99,"S101");
StudentMapper studentMapper = session.getMapper(StudentMapper.class);
studentMapper.updateStudentByStuNo(student);
session.commit();
System.out.println("修改成功");
}
public static void main(String[] args) throws IOException {
// queryStudentByStuNo();
queryAllStudents();
addStudent();
queryAllStudents();
deleteStudentByStuNo();
queryAllStudents();
updateStudent();
queryAllStudents();
}
}