mybatis动态代理方式实现增删改查

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();
	}
}

发布了63 篇原创文章 · 获赞 28 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41286145/article/details/102900905