美文网首页收藏
Mapper代理开发

Mapper代理开发

作者: 每天起床都想摆 | 来源:发表于2021-12-29 19:20 被阅读0次

Mapper代理开发

  • 目的
    • 解决原生方式中的硬编码问题
    • 简化后期执行SQL

使用Mapper代理开发完成快速入门案例

  1. 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下

  2. 设置SQL映射文件的namespace属性为Mapper接口全限定名

  3. 在Mapper接口中定义方法,方法名就是SQL映射文件中SQL语句的id,并保持参数类型和返回值类型一致

  4. 编码

    1. 通过SqlSession的getMapper方法获取Mapper接口的代理对象
    2. 调用对应方法完成sql的执行

    如果Mapper接口名称和SQL映射文件名相同,并在同一目录下,,则可以使用包扫描的方式简化SQL映射文件的加载

1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下

此时在resources文件目录下新建包时没有包结构,只能新建目录,因此,在目录命名中,无法使用“.”符号来进行文件层次结构划分。创建结果所见即所得。

即:

  • 包结构(package):使用点号来进行层次划分 com.javaweb.mapper
  • 目录结构(directory):使用反斜杠进行层次划分 com/javaweb/mapper

<img src="JavaWeb.assets/image-20211212232555954.png" alt="image-20211212232555954" style="zoom:50%;" />

此时src文件结构如图所示

2.设置SQL映射文件的namespace属性为Mapper接口全限定名

更改xxxMapper.xml文件下的<mapper>标签中的namespace属性为java文件目录下的Mapper接口全限定名

<mapper namespace="test">
更改为
<mapper namespace="com.javaweb.mapper.t_studentMapper">

3.在Mapper接口中定义方法,方法名就是SQL映射文件中SQL语句的id,并保持参数类型和返回值类型一致

当我们知道映射文件中有id时,我们就应该意识到有同名的方法在接口中

对于SQL语句,我们应该意识到接口中的方法返回的是结果集而不是对象

package com.javaweb.mapper;

import com.javaweb.pojo.t_student;

import java.util.List;

public interface t_studentMapper {
    List<t_student> selectAll();
}

注意:此时的xxxMapper.xml文件的位置发生了变化,被移入了包中,因此需要修改mybatis-config.xml文件中的mapper resources路径

在IDEA中对目标文件右键点击复制路径/引用,点击来自源根的路径,即可复制目标文件的路径并将其修改到mapper resources后

        <mapper resource="com/javaweb/mapper/t_studentMapper.xml"/>

4.编码

此时的项目结构为:

<img src="JavaWeb.assets/image-20211213004615823.png" alt="image-20211213004615823" style="zoom:50%;" />

根据项目结构代码依次如下:

studentMapper.java

package com.javaweb.mapper;

import com.javaweb.pojo.student;

import java.util.List;

public interface studentMapper {
    List<student> selectAll();
}

student.java

package com.javaweb.pojo;

public class student {
    private String stuno;
    private String stuname;
    private String stusex;

    public String getStuno() {
        return stuno;
    }

    public void setStuno(String stuno) {
        this.stuno = stuno;
    }

    public String getStuname() {
        return stuname;
    }

    public void setStuname(String stuname) {
        this.stuname = stuname;
    }

    public String getStusex() {
        return stusex;
    }

    public void setStusex(String stusex) {
        this.stusex = stusex;
    }

    @Override
    public String toString() {
        return "t_student{" +
                "stuno='" + stuno + '\'' +
                ", stuname='" + stuname + '\'' +
                ", stusex='" + stusex + '\'' +
                '}';
    }
}

MapperTestDemo

package com.javaweb;

import com.javaweb.mapper.studentMapper;
import com.javaweb.pojo.student;
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 java.io.InputStream;
import java.util.List;


public class MapperTestDemo {
    public static void main(String[] args) throws Exception{
        //1.加载核心配置文件,获取SqlSessionFactory对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象,用它来执行sql(Ctrl+Alt+V快速生成返回对象)
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.执行sql,参数填写:名称空间.语句唯一标识

        //3.1获取对应接口student.java的代理对象
        studentMapper StuMapper = sqlSession.getMapper(studentMapper.class);
        List<student> stu = StuMapper.selectAll();

        System.out.println(stu);

        //4.释放资源
        sqlSession.close();
    }
}

studentMapper.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">
<!--
    namespace   名称空间
    id  SQL语句的唯一标识,不可重复
    resultType  对应返回结果的数据类型
-->
<mapper namespace="com.javaweb.mapper.studentMapper">
    <select id="selectAll" resultType="com.javaweb.pojo.student">
        select * from student;
    </select>
</mapper>

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        CONSOLE :表示当前的日志信息是可以输出到控制台的。
    -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
        </encoder>
    </appender>

    <logger name="com.javaweb" level="DEBUG" additivity="false">
        <appender-ref ref="Console"/>
    </logger>


    <!--
      level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
     , 默认debug
      <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
      -->
    <root level="DEBUG">
        <appender-ref ref="Console"/>
    </root>
</configuration>

mybatis-config.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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="ZZXQJL@0916.com"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--加载sql映射文件-->
        <mapper resource="com/javaweb/mapper/studentMapper.xml"/>
        <!--等价于<package name="com.javaweb.mapper"/>-->
    </mappers>
</configuration>

如果Mapper接口名称和SQL映射文件名相同,并在同一目录下,,则可以使用包扫描的方式简化SQL映射文件的加载

<mapper resource="com/javaweb/mapper/studentMapper.xml"/>
等价于
<package name = "com.javaweb.mapper"/>

包扫描的方式是将目标包下的所有映射文件加载进来

相关文章

网友评论

    本文标题:Mapper代理开发

    本文链接:https://www.haomeiwen.com/subject/foqbqrtx.html