网上又找了一些题,加几道自己比较关注的,梳理了 23 道 MyBatis 的问题。

  1. Mapper 接口如何与写 SQL 的 XML 文件进行绑定的?

  2. Mapper 接口方法如何注解里的 SQL 进行绑定的?

  3. Mapper 接口并没有实现类,它是如何工作的?

  4. Mapper 接口中能不能根据参数不同进行重载?

  5. MyBatis 有哪些分页的方式?其原理是什么?

  6. MyBatis 是如何将 sql 执行结果转换为目标对象并返回的?有哪些映射形式?

  7. MyBatis 如何批量插入?

  8. MyBatis 如何获取返回自增主键值?

  9. Mapper 接口如何传递多个参数?

  10. MyBatis 中有哪些动态 SQL ?它们的作用分别是什么?如何实现的?

  11. Mapper XML 映射文件中支持哪些标签?分别什么作用?

  12. 不同 Mapper XML 文件中 id 是否可以相同?

  13. 为什么说 MyBatis 是半自动 ORM?

  14. 如何进行一对一查询?有哪些方式?

  15. 如何进行一对多查询?有哪些方式?

  16. MyBatis 如何支持延迟加载?现实原理是什么?

  17. MyBatis 中的本地缓存和二级缓存的作用是什么?怎么实现的?

  18. 什么是 MyBatis 的接口绑定?有哪些实现方式?

  19. Mapper 接口与 XML 绑定时有哪些要求?

  20. MyBatis 的源码有没有看过?核心类有哪些?如何实现框架功能的?

  21. MyBatis 插件的运行原理是什么?如何编写一个自定义插件?

  22. MyBatis 是如何被 Spring 集成的?

  23. Spring 中如何配置 MyBatis?

这些题目要彻底能明白,并不容易,需要翻阅源码,写代码测出结果。


不弄清楚框架的功能,源码基本是很难读懂的。所以结合官方文档,先来个 MyBatis 原生使用的 Demo。


1、maven 依赖,MySQL驱动 + MyBatis 3.5.5

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>constxiong</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>mybatis</artifactId>

    <dependencies>
        <!-- MySQL 8.0.21 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>

        <!-- MyBatis -->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.5</version>
        </dependency>

    </dependencies>

    <build>

    </build>
</project>

2、MyBatis 配置文件 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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://172.31.32.184:3306/constxiong?serverTimezone=UTC&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="constxiong@123"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="constxiong/mapper/UserMapper.xml"/>
    </mappers>
</configuration>


3、写 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="constxiong.mapper.UserMapper">

    <select id="selectUser" resultType="constxiong.po.User" parameterType="constxiong.po.User">
        select * from user where id = #{id}
    </select>

    <insert id="insertUser" parameterType="constxiong.po.User">
        insert into user values(#{id}, #{name})
    </insert>

</mapper>

4、Mapper 接口类,结合使用了 @Select

package constxiong.mapper;

import constxiong.po.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * UserMapper 接口,映射对数据库的操作
 */

public interface UserMapper {

    public User selectUser(int id);

    public int insertUser(User user);

    @Select("select * from user")
    public List<User>  selectAllUsers();
}

5、User PO 模型

package constxiong.po;

/**
 * 用户表模型
 */

public class User {
    private Integer id;

    private String name;

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

6、测试 MyBatis xml 与 注解的使用

package constxiong;

import constxiong.mapper.UserMapper;
import constxiong.po.User;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * 测试 Mybatis xml 与 注解的使用
 */

public class Test {

    public static void main(String[] args) throws IOException {
        testXmlConfig();
        testJavaConfig();
    }

    /**
     * 测试 xml 配置方式
     */

    private static void testXmlConfig() throws IOException {
        String resource = "mybatis-config.xml";//xml配置文件路径
        InputStream inputStream = Resources.getResourceAsStream(resource);//读取配置
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//构建 SqlSessionFactory
        SqlSession sqlSession = sqlSessionFactory.openSession(true);//通过 SqlSessionfactory 获取 SqlSession

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//通过 SqlSession 获取 Mapper 接口

        //插入 user
        userMapper.insertUser(new User(1"ConstXiong1"));
        //查询该 user
        User user = userMapper.selectUser(1);
        System.out.println(user);
        //查询所有 user 数据
        List<User> users = userMapper.selectAllUsers();
        System.out.println(users);

        //关闭 SqlSession
        sqlSession.close();
    }

    /**
     * 测试 Java 方式
     */

    private static void testJavaConfig() {
        // 创建数据源
        DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver",
                "jdbc:mysql://172.31.32.184:3306/constxiong?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8",
                "root",
                "constxiong@123");
        //事务
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        //环境
        Environment environment = new Environment("development", transactionFactory, dataSource);
        //配置
        Configuration configuration = new Configuration(environment);
        //注册
        configuration.addMapper(UserMapper.class);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //插入 user
        userMapper.insertUser(new User(2"ConstXiong2"));
        //查询该 user
        User user = userMapper.selectUser(2);
        System.out.println(user);
        //查询所有 user 数据
        List<User> users = userMapper.selectAllUsers();
        System.out.println(users);

        //关闭 SqlSession
        sqlSession.close();
    }
}

7、运行结果

User{id=1, name='ConstXiong1'}
[User{id=1, name='ConstXiong1'}]
User{id=2, name='ConstXiong2'}
[User{id=1, name='ConstXiong1'}, User{id=2, name='ConstXiong2'}]



从这个 Demo 可以看出 MyBatis 的核心类及其使用,后面结合问题进行探索。


更多相关文章

  1. java中的编码转化方式都有哪些?(大厂高频面试真题)
  2. 详解第三种创建线程的方式-Callable接口
  3. HashMap的负载因子初始值为什么是0.75?这篇文章以最通俗的方式告
  4. Spring Ioc 实例化 Bean 对象有几种方式?
  5. JDBC原理分析(包括基本的使用方式和面试题汇总)
  6. 【编测编学】接口测试面试题必背(下)
  7. 队列(静态方式)

随机推荐

  1. 比比看,Android和Mango到底有什么不同?
  2. Android 开发集锦
  3. android activity的生命周期,四种启动模
  4. android 开发时出现 Please ensure that
  5. 让TextView 自带滚动条
  6. Android:TextView 自动滚动(跑马灯)
  7. React Navigation Android(安卓)返回键事
  8. Android中常用的XML生成方法实例分析
  9. adb 全部命令
  10. (二)Android系统信息