环境准备

页面.zip

Brand.java

tb_brand.sql

  1. 使用 Navicat 为数据库添加数据

  2. 将实体类拷贝到 IDEA 中

  3. 写测试用例

    因为是 Maven 的项目,所以测试的工程,写到 test 文件夹下。

  4. 安装 MyBatisX 的插件

    安装成功后,图标会产生变化:

    Untitled

    红色代表 SQL 映射文件,蓝色代表接口。

    插件的好处是可以实现接口和配置文件的链接,方便跳转。还可以在接口里写方法,在配置文件里自动补全 SQL 标签。

查询所有数据

Untitled

  1. 编写接口方法:

    package com.itheima.mapper;
    
    import com.itheima.pojo.Brand;
    
    import java.util.List;
    
    public interface BrandMapper {
        public List<Brand> selectAll();
    
    }
    
  2. 编写 SQL 语句 - SQL 映射文件:

    <?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:名称空间
    -->
    <mapper namespace="com.itheima.mapper.BrandMapper">
    
        <select id="selectAll" resultType="com.itheima.pojo.Brand"> //配置别名后,resulType 可以直接写 brand
            SELECT *
            FROM tb_brand;
        </select>
    </mapper>
    
  3. 编写测试用例

    package com.itheima.test;
    
    import com.itheima.mapper.BrandMapper;
    import com.itheima.pojo.Brand;
    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 org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    public class MyBatisTest {
        @Test
        public void testSelectAll() throws IOException {
            //1. 加载 mybatis 的核心配置文件,获取 SqlSessionFactory
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            //2. 获取 SqlSession 对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            //3. 获取 Mapper 接口的代理对象
            BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
    
            //4. 执行方法
            List<Brand> brands = brandMapper.selectAll();
            System.out.println(brands);
    
            //5. 释放资源
            sqlSession.close();
        }
    }
    

    <aside> 🛠 解决 Type interface com.itheima.mapper.BrandMapper is not known to the MapperRegistry.

    在 MyBatis 配置文件里添加对应的 SQL 映射文件。

    </aside>

    <aside> 💡 数据库表的字段名称和实体类的属性名称对应不上,数据就不能自动的封装。

    1. 起别名:对不一样的列名起别名,让别名和实体类的属性名一样。

      		<select id="selectAll" resultType="brand">
              SELECT id, brand_name as brandName, company_name as companyName, ordered, description, status
              FROM tb_brand;
          </select>
      

      缺点:每次查询都要起一次别名

    2. 使用 SQL 片段

      <sql id="brand_column">
               id, brand_name as brandName, company_name as companyName, ordered, description, status
           </sql>
      
           <select id="selectAll" resultType="brand">
               select
                   <include refid="brand_column" />
               from tb_brand;
           </select>
      

      缺点:不灵活

    3. 使用 resultMap(最常用的方案)

      <resultMap id="brandResultMap" type="brand">
              <!--
                  id:完成主键字段的映射
                      column:表的列名
                      property:实体类的属性名
                  result:完成一般字段的映射
                      column:表的列名
                      property:实体类的属性名
              -->
              <result column="brand_name" property="brandName"/>
              <result column="company_name" property="companyName"/>
          </resultMap>
      
          <select id="selectAll" resultMap="brandResultMap">
              select *
              from tb_brand;
          </select>
      

      注意原来的 resultType 要改成 resultMap。

    </aside>

查询详情

Untitled

  1. 编写接口方法

    Brand selectById();
    
  2. 编写 SQL 语句

    		<select id="selectById" resultMap="brandResultMap">
            SELECT *
            FROM tb_brand
            WHERE id = #{id};
        </select>
    
  3. 执行方法,测试

    		@Test
        public void testSelectById() throws IOException {
            //接收参数
            int id = 1;
    
            //1. 加载 mybatis 的核心配置文件,获取 SqlSessionFactory
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            //2. 获取 SqlSession 对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            //3. 获取 Mapper 接口的代理对象
            BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
    
            //4. 执行方法
            Brand brand = brandMapper.selectById(id);
            System.out.println(brand);
            //5. 释放资源
            sqlSession.close();
        }
    

参数占位符