97、【JavaEE】【Mybatis】Mapper 接口代理开

2021-10-14  本文已影响0人  yscyber

1、概述

2、传统开发方式

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 * 当前,数据库中字段名 与 类中属性名 需保持一致
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Xxx {

    private Integer id;

    private String name;

}
<?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>
    
    <properties resource="jdbc.properties" />

    <typeAliases>
        <typeAlias type="com.yscyber.mybatis.one.Xxx" alias="Xxx" />
    </typeAliases>
    
    <environments default="dev">
        <!-- 配置数据源 -->
        <environment id="dev">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc_driver}"/>
                <property name="url" value="${jdbc_url}"/>
                <property name="username" value="${jdbc_username}"/>
                <property name="password" value="${jdbc_password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="xxxMapper.xml"/>
    </mappers>
    
</configuration>
<?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">

    <select id="listAllXxx" resultType="Xxx">
        SELECT id, name
        FROM xxx
    </select>

</mapper>
import com.yscyber.mybatis.one.Xxx;

import java.util.List;

public interface XxxRepo {

    List<Xxx> listAllXxx();

}
import com.yscyber.mybatis.one.Xxx;
import com.yscyber.mybatis.one.repo.XxxRepo;

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.IOException;
import java.util.List;

// 代码可能存在不合理,请忽略
public class XxxRepoImpl implements XxxRepo {

    private static SqlSession sqlSession;

    static {
        try {
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis.xml"));
            sqlSession = sqlSessionFactory.openSession();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public List<Xxx> listAllXxx() {
        if (sqlSession != null) {
            List<Xxx> xxxList = sqlSession.selectList("xxxMapper.listAllXxx");
            return xxxList;
        }
        return null;
    }

}
    @Test
    public void test6() {
        XxxRepo xxxRepo = new XxxRepoImpl();

        List<Xxx> xxxList = xxxRepo.listAllXxx();
        for (Xxx val : xxxList) {
            System.out.println(val);
        }
    }

传统开发方式的问题,比如实现类中,如果专门设计、抽取一个工具类的话,会存在 MyBatis 模板代码重复的问题;在实现类中,需要使用到映射配置文件中的namespace.id,这属于“硬编码”,一旦映射配置文件中发生变化,实现类也必须要及时调整。

于是,MyBatis 提供了一种接口代理方案,使得无需编写实现类,只编写持久层接口以及映射配置文件即可。

3、接口代理开发方式

MyBatis-8
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 * 当前,数据库中字段名 与 类中属性名 需保持一致
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Xxx {

    private Integer id;

    private String name;

}
<?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>
    
    <properties resource="jdbc.properties"/>
    
    <typeAliases>
        <typeAlias type="com.yscyber.mybatis.one.Xxx" alias="Xxx"/>
    </typeAliases>
    
    <environments default="dev">
        <!-- 配置数据源 -->
        <environment id="dev">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc_driver}"/>
                <property name="url" value="${jdbc_url}"/>
                <property name="username" value="${jdbc_username}"/>
                <property name="password" value="${jdbc_password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="xxxMapper.xml"/>
    </mappers>
    
</configuration>
<?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.yscyber.mybatis.one.repo.XxxRepo">

    <select id="listAllXxx" resultType="Xxx">
        SELECT id, name
        FROM xxx
    </select>

</mapper>
    @Test
    public void test7() {
        try {
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
            SqlSession sqlSession = sqlSessionFactory.openSession();

            XxxRepo xxxRepo = sqlSession.getMapper(XxxRepo.class);

            List<Xxx> xxxList = xxxRepo.listAllXxx();
            for (Xxx val : xxxList) {
                System.out.println(val);
            }

            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
MyBatis-9 MyBatis-10

4、接口代理开发的原理

MyBatis-11 MyBatis-12
上一篇 下一篇

猜你喜欢

热点阅读