Mybatis实战练习一【查询所有】

简介: Mybatis实战练习一【查询所有】

1,配置文件实现CRUD


如上图所示产品原型,里面包含了品牌数据的 查询 、按条件查询、添加、删除、批量删除、修改 等功能,而这些功能其实就是对数据库表中的数据进行CRUD操作。接下来我们就使用Mybatis完成品牌数据的增删改查操作。以下是我们要完成功能列表:


  • 查询


查询所有数据


查询详情


条件查询


  • 添加


  • 修改


修改全部字段


修改动态字段


  • 删除


删除一个


批量删除


我们先将必要的环境准备一下。


1.1:环境准备

数据库表(tb_brand)及数据准备


-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(
    -- id 主键
    id           int primary key auto_increment,
    -- 品牌名称
    brand_name   varchar(20),
    -- 企业名称
    company_name varchar(20),
    -- 排序字段
    ordered      int,
    -- 描述信息
    description  varchar(100),
    -- 状态:0:禁用  1:启用
    status       int
);
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
       ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
       ('小米', '小米科技有限公司', 50, 'are you ok', 1);


实体类 Brand


在 com.itheima.pojo 包下创建 Brand 实体类。


public class Brand {
    // id 主键
    private Integer id;
    // 品牌名称
    private String brandName;
    // 企业名称
    private String companyName;
    // 排序字段
    private Integer ordered;
    // 描述信息
    private String description;
    // 状态:0:禁用  1:启用
    private Integer status;
    //省略 setter and getter。自己写时要补全这部分代码
}

编写测试用例


测试代码需要在 test/java 目录下创建包及测试用例。项目结构如下:



安装 MyBatisX 插件


  • MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。


  • 主要功能


  • XML映射配置文件 和 接口方法 间相互跳转


  • 根据接口方法生成 statement


  • 安装方式


点击 file ,选择 settings ,就能看到如下图所示界面



注意:安装完毕后需要重启IDEA


插件效果


红色头绳的表示映射配置文件,蓝色头绳的表示mapper接口。在mapper接口点击红色头绳的小鸟图标会自动跳转到对应的映射配置文件,在映射配置文件中点击蓝色头绳的小鸟图标会自动跳转到对应的mapper接口。也可以在mapper接口中定义方法,自动生成映射配置文件中的 statement ,如图所示

1.2:查询所有数据


如上图所示就页面上展示的数据,而这些数据需要从数据库进行查询。接下来我们就来讲查询所有数据功能,而实现该功能我们分以下步骤进行实现:


编写接口方法:Mapper接口


参数:无


查询所有数据功能是不需要根据任何条件进行查询的,所以此方法不需要参数。


结果:List<Brand>


我们会将查询出来的每一条数据封装成一个 Brand 对象,而多条数据封装多个 Brand 对象,需要将这些对象封装到List集合中返回。


执行方法、测试



1.2.1:编写接口方法

在 com.itheima.mapper 包写创建名为 BrandMapper 的接口。并在该接口中定义 List<Brand> selectAll() 方法


public interface BrandMapper {
    /**
     * 查询所有
     */
    List<Brand> selectAll();
}

1.2.2:编写SQL语句

在 reources 下创建 com/itheima/mapper 目录结构,并在该目录下创建名为 BrandMapper.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="com.itheima.mapper.BrandMapper">
    <select id="selectAll" resultType="brand">
        select *
        from tb_brand;
    </select>
</mapper>

1.2.3:编写测试方法

在 MybatisTest 类中编写测试查询所有的方法


@Test
public void testSelectAll() throws IOException {
    //1. 获取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();
}


注意:现在我们感觉测试这部分代码写起来特别麻烦,我们可以先忍忍。以后我们只会写上面的第3步的代码,其他的都不需要我们来完成。


执行测试方法结果如下:


从上面结果我们看到了问题,有些数据封装成功了,而有些数据并没有封装成功。为什么这样呢?


这个问题可以通过两种方式进行解决:


  • 给字段起别名


  • 使用resultMap定义字段和属性的映射关系


1.2.4:起别名解决上述问题:

从上面结果可以看到 brandName 和 companyName 这两个属性的数据没有封装成功,查询 实体类 和 表中的字段 发现,在实体类中属性名是 brandName 和 companyName ,而表中的字段名为 brand_name 和 company_name,如下图所示 。那么我们只需要保持这两部分的名称一致这个问题就迎刃而解。  

我们可以在写sql语句时给这两个字段起别名,将别名定义成和属性名一致即可。


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

而上面的SQL语句中的字段列表书写麻烦,如果表中还有更多的字段,同时其他的功能也需要查询这些字段时就显得我们的代码不够精炼。Mybatis提供了sql 片段可以提高sql的复用性。


SQL片段:


将需要复用的SQL片段抽取到 sql 标签中


<sql id="brand_column">
  id, brand_name as brandName, company_name as companyName, ordered, description, status
</sql>


id属性值是唯一标识,引用时也是通过该值进行引用。


在原sql语句中进行引用


使用 include 标签引用上述的 SQL 片段,而 refid 指定上述 SQL 片段的id值。


<select id="selectAll" resultType="brand">
    select
    <include refid="brand_column" />
    from tb_brand;
</select>

1.2.5:使用resultMap解决上述问题:

起别名 + sql片段的方式可以解决上述问题,但是它也存在问题。如果还有功能只需要查询部分字段,而不是查询所有字段,那么我们就需要再定义一个 SQL 片段,这就显得不是那么灵活。


那么我们也可以使用resultMap来定义字段和属性的映射关系的方式解决上述问题。


在映射配置文件中使用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>

注意:在上面只需要定义 字段名 和 属性名 不一样的映射,而一样的则不需要专门定义出来。


SQL语句正常编写


<select id="selectAll" resultMap="brandResultMap">
    select *
    from tb_brand;
</select>

1.2.6:小结

实体类属性名 和 数据库表列名 不一致,不能自动封装数据


==起别名:==在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样


可以定义 <sql>片段,提升复用性


==resultMap:==定义<resultMap> 完成不一致的属性名和列名的映射


而我们最终选择使用 resultMap的方式。查询映射配置文件中查询所有的 statement 书写如下:


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


相关文章
|
4月前
|
SQL
MyBatis-Plus-Join关联查询
MyBatis-Plus-Join关联查询
227 2
|
4月前
|
SQL Java 关系型数据库
Mybatis多表关联查询与动态SQL(下)
Mybatis多表关联查询与动态SQL
109 0
|
4月前
|
SQL Java 数据库连接
Mybatis多表关联查询与动态SQL(上)
Mybatis多表关联查询与动态SQL
106 0
|
4月前
|
SQL 缓存 Java
mybatis 一对多查询
mybatis 一对多查询
75 0
|
4月前
|
SQL XML Java
MyBatis-Plus多表关联查询
MyBatis-Plus多表关联查询
389 0
|
21天前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
54 0
|
2月前
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
46 11
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法