使用 Navicat 为数据库添加数据
将实体类拷贝到 IDEA 中
写测试用例
因为是 Maven 的项目,所以测试的工程,写到 test 文件夹下。
安装 MyBatisX 的插件
安装成功后,图标会产生变化:
红色代表 SQL 映射文件,蓝色代表接口。
插件的好处是可以实现接口和配置文件的链接,方便跳转。还可以在接口里写方法,在配置文件里自动补全 SQL 标签。
编写接口方法:
package com.itheima.mapper;
import com.itheima.pojo.Brand;
import java.util.List;
public interface BrandMapper {
public List<Brand> selectAll();
}
编写 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>
编写测试用例
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> 💡 数据库表的字段名称和实体类的属性名称对应不上,数据就不能自动的封装。
起别名:对不一样的列名起别名,让别名和实体类的属性名一样。
<select id="selectAll" resultType="brand">
SELECT id, brand_name as brandName, company_name as companyName, ordered, description, status
FROM tb_brand;
</select>
缺点:每次查询都要起一次别名
使用 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>
缺点:不灵活
使用 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>
编写接口方法
Brand selectById();
编写 SQL 语句
<select id="selectById" resultMap="brandResultMap">
SELECT *
FROM tb_brand
WHERE id = #{id};
</select>
执行方法,测试
@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();
}
#{}
:会将其替换为 ?,防止 SQL 注入。