美文网首页收藏
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