Mybatis(三)——动态代理方式(基于接口方式)

Mybaits(二)中,使用的是基本方式来实现对数据库的增删改查(DRUD)操作,接下来尝试使用动态代理方式。

  • 在基本方式中,需要通过命名空间namespace和mapper的id值来确定sql;
  • 而在动态代理方式中,可以省略掉statement,根据约定直接定位sql。

如何使用动态代理方式

首先要建立接口,接口中必须遵循以下三个约定
- 方法名和mapper.xml文件中的标签的id值相同
- 方法的输入参数和mapper.xml文件中标签的parameterType类型一致
- 方法的返回值和mapper.xml文件中标签的resultType类型一致
除了以上约定,还需要namespace的值和接口的全类名一致
如下所示
在这里插入图片描述
匹配的过程:

  1. 根据接口名找到映射文件(根据的是namespace=接口全类名)
  2. 根据接口的方法名找到映射文件中的SQL标签(方法名=SQL标签id值)
    以上2点可以保证:当我们调用接口中的方法时,程序能自动定位到某一个mapper.xml文件中的SQL标签

在测试类中,不需要使用statement,而是找接口StudentMapper,测试类的主要内容如下所示
在这里插入图片描述

工程实践

  1. 我们在MybatisProject2基础上进行修改,项目主要结构如下所示
    在这里插入图片描述
  2. 映射文件Mapper-interface.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.santiago.mapper.StudentMapper">
    <select id="queryStudentByStuNo" resultType="com.santiago.maven.Student" parameterType="int">
        select * from student where stuno = #{stuno}
    </select>

    <insert id="addStudent" parameterType="com.santiago.maven.Student">
        insert into student(stuno,stuname,stuage,gradename) values(#{stuNo},#{stuName},#{stuAge},#{gradeName})
    </insert>

    <delete id="deleteStudentByStuNo" parameterType="int">
        delete from student where stuno = #{stuno}
    </delete>

    <update id="updateStudentByStuNo" parameterType="com.santiago.maven.Student">
        update student set stuname = #{stuName}, stuage = #{stuAge}, gradename = #{gradeName} where stuno = #{stuNo}
    </update>

    <select id="queryAll" resultType="com.santiago.maven.Student">
        select * from student
    </select>
</mapper>
  1. 接口StudentMapper.java的内容如下所示
package com.santiago.mapper;

import com.santiago.maven.Student;

import java.util.List;

public interface StudentMapper {
	//接口中的方法默认是抽象的,public abstract可以省略
    public abstract Student queryStudentByStuNo(int stuno);
    public abstract void addStudent(Student student);
    public abstract void deleteStudentByStuNo(int stuno);
    public abstract void updateStudentByStuNo(Student student);
    public abstract List<Student> queryAll();
}
  1. 注意修改conf.xml中加载的资源文件
    在这里插入图片描述
    其内容如下所示
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
       PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <!--配置数据库信息-->
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3307/mybatis"/>
               <property name="username" value="root"/>
               <property name="password" value="root"/>
           </dataSource>
       </environment>
   </environments>
   <mappers>
       <!--加载映射文件-->
       <mapper resource="mappers/Mapper-interface.xml"/>
   </mappers>
</configuration>
  1. 测试类Test_interface.java的内容如下所示
package com.santiago.maven;

import com.santiago.mapper.StudentMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.List;

public class Test_interface {
    public static void queryStudentByStuNo(){
        InputStream stream = Student.class.getClassLoader().getResourceAsStream("conf.xml");
        SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
        SqlSession session=ssf.openSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        Student student = studentMapper.queryStudentByStuNo(1);
        session.commit();
        System.out.println(student);
        session.close();
    }

    public static void queryAll(){
        InputStream stream = Student.class.getClassLoader().getResourceAsStream("conf.xml");
        SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
        SqlSession session=ssf.openSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        List<Student> students = studentMapper.queryAll();
        System.out.println(students);
        session.close();
    }
    public static void addStudent(){
        Student stu = new Student(3,"lc",19,"1");
        InputStream stream = Student.class.getClassLoader().getResourceAsStream("conf.xml");
        SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
        SqlSession session=ssf.openSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        studentMapper.addStudent(stu);
        session.commit();
        session.close();
    }

    public static void deleteStudentByStuNo(){
        InputStream stream = Student.class.getClassLoader().getResourceAsStream("conf.xml");
        SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
        SqlSession session=ssf.openSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        studentMapper.deleteStudentByStuNo(3);
        session.commit();
        session.close();
    }

    public static void updateStudentByStuNo(){
        Student stu = new Student(2,"wql",18,"yanyi");
        InputStream stream = Student.class.getClassLoader().getResourceAsStream("conf.xml");
        SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(stream);
        SqlSession session=ssf.openSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        studentMapper.updateStudentByStuNo(stu);
        session.commit();
        session.close();
    }

    public static void main(String[] args) {
        queryAll();
        updateStudentByStuNo();
        queryAll();
        ......
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值