MyBatis操作数据库的步骤一定要清楚

1、创建数据库

使用SQL创建一个名称为 mybatis 的的数据库,并船舰一个名为 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);

创建的数据库表如下图:

2、接下来创建一个Maven项目用来测试用例:

(1)在IDEA中创建一个普通的Maven项目。(有对创建项目感兴趣的朋友可以参看文章《springboot基础篇(快速入门+要点总结)》)。

(2)在porm.xml文件中导入mybatis相关依赖

<!-- 导入Maven依赖 -->
<dependencies>
    <!-- MySQL驱动依赖 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!-- MyBatis依赖 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
    <!-- junit依赖 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
</dependencies>

3、创建MyBatis核心配置文件

(可以参考官网的配置文件方法:https://mybatis.org/mybatis-3/)

在Maven子项目的src/main/resources目录下新建一个名称为mybatis-config.xml 的配置文件。该配置文件中包含了对MyBatis系统的核心设置,包括获取数据库连接实例的数据源DataSource)、决定事务作用域和控制方式的事务管理器TransactionManager)、注册所有的XML映射器配置文件等。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--MyBatis核心配置文件-->
<configuration>
    <environments default="development">
        <!--开发环境-->
        <environment id="development">
            <!--事务管理器-->
            <transactionManager type="JDBC"/>
            <!--数据源-->
            <dataSource type="POOLED">
                <!--驱动(固定写法)-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接信息(URL、用户名和密码)-->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--注册所有的映射器-->
    <mappers>
        <mapper resource="com/atangbiji/dao/UserMapper.xml"/>
    </mappers>
</configuration>

4、封装MyBaris工具类

在项目中创建一个utils包,用来创建封装的MyBatis工具类,MyBatisUtils.java,用来获取SqlSession对象。

package com.atangbiji.utils;
​
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.io.InputStream;
//MyBatis工具类
public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            //从XML中构建SqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    //从SqlSessionFactory中获取SqlSession对象
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
​
    //重载getSqlSession方法
    //若autoCommit为true:则事务自动提交;若autoCommit为false:则需要手动提交事务。
    public static SqlSession getSqlSession(boolean autoCommit){
        return sqlSessionFactory.openSession(autoCommit);
    }
}

`SqlSessionFactory` 类是 MyBatis 应用的核心类,它的实例可以通过 `SqlSessionFactoryBuilder` 类创建。`SqlSessionFactoryBuilder` 可以从 `mybatis-config.xml` 核心配置文件中构建出 `SqlSessionFactory` 实例。从 `SqlSessionFactory` 中我们可以获取 `SqlSession` 对象。`SqlSession` 类提供了在数据库执行 SQL 命令所需的所有方法,通过 `SqlSession` 实例我们可以直接执行已映射的 SQL 语句。虽然我们可以将事务设置为自动提交,但在实际项目中为了数据的安全,建议手动提交事务。这样可以确保在执行一系列数据库操作后,只有当所有操作都成功完成时才提交事务,否则可以回滚到操作前的状态,保障数据的完整性和一致性。

5、创建与表对应的实体类,用来做关系映射

在项目的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。自己写时要补全这部分代码
}

安装 MyBatisX 插件

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

  • 主要功能

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

    • 根据接口方法生成 statement

  • 安装方式

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

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

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

6、创建接口映射器

在项目的持久层中创建接口映射器(持久层映射器用于存放已经编写号的持久层代码,用来实际操作数据库)可参看文章MyBatis 动态sql必须要掌握的标签你知道吗

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

注:映射器接口中的接口函数是用来映射xml配置文件中对应标签的sql标签的

7、创建XML映射器配置文件(重点)

在项目的resources下创建映射器的配置文件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-->
<mapper namespace="com.itheima.mapper.BrandMapper">
    <select id="selectAll" resultType="brand">
        select *
        from tb_brand;
    </select>
</mapper>

在 MyBatis 项目中,与 JDBC 不同的是不再需要创建映射器接口的实现类。相反,我们使用一个 XML 映射器配置文件取代了 JDBC 项目中的接口实现类,从而减少了几乎所有的 JDBC 代码。在这个 XML 映射器配置文件中,我们只需配置以下标签属性:

-`namespace`:对应映射器接口的全限定名。

- `id`:对应映射器接口中的方法名。

- `resultType`:SQL 语句执行结果所对应的实体类(POJO)的全限定名。

需要注意的是:

- XML 映射器配置文件通过标签的方式实现 SQL 语句与映射器接口函数的映射。

- 每个标签对应一条 SQL 语句(即一个业务)。

- XML 映射器配置文件中的标签与映射器接口中的接口函数一一对应。

- 如果传入参数(`parameterType`)为简单类型(包括:基本数据类型、String、Date 等),则 `#{}` 预编译占位符中的形参与对应映射器接口函数的形参一一对应。

- 如果传入参数(`parameterType`)为实体类(POJO)类型,则 `#{}` 预编译占位符中的形参与该实体类的成员变量一一对应。

- 如果传入参数(`parameterType`)为 Map 类型,则 `#{}` 预编译占位符中的形参与该 Map 中键名(key)一一对应。

命名空间的作用主要有两个:

1. 利用更长的全限定名来将不同的 SQL 语句隔离开来。

2. 实现接口绑定。

一个 XML 映射器配置文件中,可以定义无数个 SQL 映射语句。为了增加代码的可读性,建议将 XML 映射器配置文件与映射器接口文件放在同一(dao)目录下。

8、测试

在项目的 src/test/java目录下,创建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定义字段和属性的映射关系

起别名解决上述问题

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

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

  • 在映射配置文件中使用resultMap定义 字段 和 属性 的映射关

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

小结

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

  • ==起别名:==在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>
​
​
​
<select id="selectAll" resultMap="brandResultMap">
    select *
    from tb_brand;
</select>

   注:喜欢的朋友可以关注公众号“JAVA学习课堂”方便阅读,内容更丰富哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值