Mybaits学习总结

前言

如果我们使用JDBC作为持久化层工具,需要在dao层写接口和对应的实现类,然后再在dao接口的实现类中进行参数的接收、SQL语句的编写和查询结果集的封装、返回。

代码片段如下:

根据传入的用户id返回对应的用户数据的方法

当使用JDBC编写对应的功能代码,你会发现步骤上的重复,每一个方法的大致内容都是:获取数据库连接对象-编写SQL语句-向预编译对象中传入参数-执行SQL语句-获取查询结果集-将查询结果集封装并进行返回的操作-捕获异常-资源关闭。我们可以试想是否有一个工具帮助我们简化这些重复的步骤,让自己只需要编写SQL语句,不,最好连简单的SQL语句都不需要编写。我们只需要做好一些配置工作,就可以从数据库中得到我们想要的查询结果。如果你是这样想的,恭喜你,Mybaits正是这样的工具,它能够帮助我们快速生成持久层的代码,让我们专注于业务代码的编写。

以下会逐一讲解MyBatis学习过程的重难点、高级操作和推荐两个高效率插件,想要更加全面系统掌握MyBatis的小伙伴可以查阅官方文档。

mybatis – MyBatis 3 | 官方文档icon-default.png?t=N7T8https://mybatis.org/mybatis-3/zh/index.html

1. MyBatis是什么?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL存储过程以及高级映射MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO对象为数据库中的记录。

一旦使用MyBatis的数据的持久层操作,我们只需要写XxxMapper接口(原先的dao接口),然后进行相关的XxxMapper.xml的相关配置即可,不需要自己手动实现接口,在XxxMapper.xml配置中我们编写相关的SQL语句,最后通过MyBatis的配置文件进行数据库连接信息、性能配置、mapper.xml的配置,让其加载相关XxxMapper.xml文件,完成SQL代理映射等的相关操作。

2. MyBaits基本使用

2.1 SQL语句传参

Mybatis提供了两种SQL语句传参的方式:${}、#{}

#{}大量使用,会自动转化成  占位符,和JDBC中的预编译对象作用一样,能够防止SQL注入

${}极少使用,有SQL注入的风险,能够进行SQL关键字的拼接,用于完成一些特定的需求,例如用户根据按钮对数据进行升序和降序排列。

2.2 数据输出

2.2.1 返回普通查询结果

resultType = "全限定符 | 别名 | 如果是返回集合类型,写范型类型即可"

对于返回的单个自定义的实体类型,mybatis默认要求列名和属性名要一致,这样才可以进行实体类的属性映射。

返回map 当没有实体类可以使用接值的时候,我们可以使用map接收数据! key -->查询的列 value-->查询的值

返回List集合 resultType不需要指定集合类型,只需要指定其泛型即可

2.2.2 返回主键值

获取插入数据的主键;插入数据的时候同时获取数据库中对应的主键信息

这里分为两部分进行讲解,一部分是自增长的主键,另一部分是非自增长的主键

  •    自增长的主键: 数据库维护,对于mysql来说是auto_increment
<!-- 在使用插入是返回的是一个int类型的整数,不需要配置返回结果,因为int是简单类型的-->
<!--  每一个映射文件中的 实体对象的参数,是通过getter方法获取的,不是通过成员变量获取的,mybatis会自动读取我们的pojo对象,调用其中的getter方法;  -->
<!--    useGeneratedKeys="true" //是否想要数据库自动增强的主键值
        keyColumn="emp_id"//主键列的值!!!
        keyProperty="empId"//接收主键列值的属性,我们定义的对象中,谁进行接收返回的id值
        -->
    <insert id="insertEmployee" useGeneratedKeys="true" keyColumn="emp_id" keyProperty="empId">
        insert into t_emp (emp_name, emp_salary)values (#{empName11},#{empSalary})
    </insert>
    <!-- Mybatis是将自增主键的值设置到实体类对象中,而不是以Mapper接口方法返回值的形式返回。 -->
  • 非自增长类型的主键【使用场景有些数据库不支持自增型的主键或者获取字符串类型的主键】
<!-- 我们使用 selectKey 来查询 UUID 并设置到 id 字段中。通过 keyProperty 属性来指定查询到的 UUID 赋值给对象中的 id 属性,而 resultType 属性指定了 UUID 的类型为 java.lang.String。 -->
<!-- 需要注意的是,我们将 selectKey 放在了插入语句的前面,这是因为 MySQL 在 insert 语句中只支持一个 select 子句,而 selectKey 中查询 UUID 的语句就是一个 select 子句,因此我们需要将其放在前面。  -->
<insert id="insertUser" parameterType="User">
    <selectKey keyProperty="id" resultType="java.lang.String"
        order="BEFORE">
        SELECT UUID() as id
    </selectKey>
    INSERT INTO user (id, username, password) 
    VALUES (
        #{id},
        #{username},
        #{password}
    )
</insert>
<!-- 使用这种方式,我们可以方便地插入 UUID 作为字符串类型主键。当然,还有其他插入方式可以使用,如使用Java代码生成UUID并在类中显式设置值等。需要根据具体应用场景和需求选择合适的插入方式。 -->
2.3 实体类属性名和数据库字段名保持一致的三种设置方式

MySql和Java所遵循的命名规则不同,MySql遵循蛇形命名,Java遵循的是驼峰命名。只有列名与属性名一致的时候才可以正确地返回数据

  1. sql语句中起别名【将Mysql类型转换成Java的属性名】

  2. 开启蛇形命名到驼峰命名的自动映射关系 <setting name="mapUnderscoreToCamelCase" value="true"/>

  3. 使用resultMap进行自定义的映射【自主构建类型和属性名的对应关系】

<!-- 专门声明一个resultMap设定column到property之间的对应关系 -->
<resultMap id="selectEmployeeByRMResultMap" type="com.atguigu.mybatis.entity.Employee">

  <!-- 使用id标签设置主键列和主键属性之间的对应关系 -->
  <!-- column属性用于指定字段名;property属性用于指定Java实体类属性名 -->
  <id column="emp_id" property="empId"/>

  <!-- 使用result标签设置普通字段和Java实体类属性之间的关系 -->
  <result column="emp_name" property="empName"/>

  <result column="emp_salary" property="empSalary"/>

</resultMap>

<!-- Employee selectEmployeeByRM(Integer empId); -->
<select id="selectEmployeeByRM" resultMap="selectEmployeeByRMResultMap">

  select emp_id,emp_name,emp_salary from t_emp where emp_id=#{empId}

</select>

3. MyBaits多表映射

在多表映射中,MyBatis 思想是:数据库不可能永远是你所想或所需的那个样子。所以MyBatis提供了一种数据库映射模式——ResultMap,完美适配所有的应用程序查询需求。

我们只需要完成有两个步骤就可以实现多表结果的映射:

  1. 设计实体类对多表映射的关系进行承接

  2. 使用ResultMap完成多表结果映射

3.1 关于多表结果实体类的设计:

对一,属性中包含对方对象

对多,属性中包含对方对象集合

只有真实发生多表查询需求时,我们才需要设计和修改实体类,否则不要提前设计和修改实体类!

无论多少张表联查,实体类设计实际上都是两两考虑,我们只需要考虑两张表之间的关系即可!

在查询映射的时候,只需要关注本次查询相关的属性!例如:查询订单和对应的客户,就不要关注客户中的订单集合!【单方向看】

 3.2 关于在Mapper.xml中配置 对一 和 对多 关系
  <!-- 对一关系的核心配置 ->
  <!-- 使用association标签配置“对一”关联关系 -->
  <!-- property属性:在Order类中对一的一端进行引用时使用的属性名 -->
  <!-- javaType属性:一的一端类的全类名 -->
  
  <association property="customer" javaType="customer">
    <!-- 配置Customer类的属性和字段名之间的对应关系 -->
    <id column="customer_id" property="customerId"/>
    <result column="customer_name" property="customerName"/>
  </association>

  <!-- 对多关系的核心配置 ->
  <!-- collection标签:映射“对多”的关联关系 -->
  <!-- property属性:在Customer类中,关联“多”的一端的属性名 -->
  <!-- ofType属性:集合属性中元素的类型 -->
  <collection property="orderList" ofType="order">
    <!-- 映射Order的属性 -->
    <id column="order_id" property="orderId"/>
    <result column="order_name" property="orderName"/>
  </collection>

4. MyBaits动态语句

整个SQL语句是动态生成的,Mybatis会先根据特定的条件进行判断,拼接对应的子句,之后执行的是拼接SQL语句。

主要标签:if where set trim choose/when/otherwise foreach

技巧:如果对以上标签使用比较生疏,可以先写出部分SQL语句,之后用标签进行替换。多操作几次之后,就可以熟练地使用了。

5. MyBaits高级扩展

5.1 分页插件PageHelper

PageHelper 是 MyBatis 中比较著名的分页插件,它提供了多种分页方式(例如 MySQL 和 Oracle 分页方式),支持多种数据库,并且使用非常简单。下面就介绍一下 PageHelper 的使用方式。

MyBatis通用分页插件icon-default.png?t=N7T8https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md使用方法:

1. pom.xml中引入依赖
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.11</version>
</dependency>
2.  MyBatis 的配置文件中配置PageHelper的插件
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/>
    </plugin>
</plugins>

其中,com.github.pagehelper.PageInterceptor 是 PageHelper 插件的名称,dialect 属性用于指定数据库类型(支持多种数据库)

3.分页插件的使用
@Test
public void testTeacherRelationshipToMulti() {

    TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);

    PageHelper.startPage(1,2);
    // 查询Customer对象同时将关联的Order集合查询出来
    List<Teacher> allTeachers = teacherMapper.findAllTeachers();
//
    PageInfo<Teacher> pageInfo = new PageInfo<>(allTeachers);

    System.out.println("pageInfo = " + pageInfo);
    long total = pageInfo.getTotal(); // 获取总记录数
    System.out.println("total = " + total);
    int pages = pageInfo.getPages();  // 获取总页数
    System.out.println("pages = " + pages);
    int pageNum = pageInfo.getPageNum(); // 获取当前页码
    System.out.println("pageNum = " + pageNum);
    int pageSize = pageInfo.getPageSize(); // 获取每页显示记录数
    System.out.println("pageSize = " + pageSize);
    List<Teacher> teachers = pageInfo.getList(); //获取查询页的数据集合
    System.out.println("teachers = " + teachers);
    teachers.forEach(System.out::println);

}

5.2 逆向工程和MybatisX插件

5.2.1 逆向工程介绍

    MyBatis 的逆向工程是一种自动化生成持久层代码和映射文件的工具,它可以根据数据库表结构和设置的参数生成对应的实体类、Mapper.xml 文件、Mapper 接口等代码文件,简化了开发者手动生成的过程。逆向工程使开发者可以快速地构建起 DAO 层,并快速上手进行业务开发。
   MyBatis 的逆向工程有两种方式:通过 MyBatis Generator 插件实现和通过 Maven 插件实现。无论是哪种方式,逆向工程一般需要指定一些配置参数,例如数据库连接 URL、用户名、密码、要生成的表名、生成的文件路径等等。
   总的来说,MyBatis 的逆向工程为程序员提供了一种方便快捷的方式,能够快速地生成持久层代码和映射文件,是半自动 ORM 思维像全自动发展的过程,提高程序员的开发效率。

注意:逆向工程只能生成单表crud的操作,多表查询依然需要我们自己编写!

5.2.2 MyBatisX

   MyBatisX 是一个 MyBatis 的代码生成插件,可以通过简单的配置和操作快速生成 MyBatis Mapper、pojo 类和 Mapper.xml 文件。下面是使用 MyBatisX 插件实现逆向工程的步骤:

1. 安装插件:

    在 IntelliJ IDEA 中打开插件市场,搜索 MyBatisX 并安装。

2. 使用 IntelliJ IDEA连接数据库
    - 连接数据库

     
    - 填写数据库配置信息

 
    - 展示库表


    3.逆向工程使用

   

4.查看生成的结果

5. 逆向工程生成文件的使用

正常使用即可,自动生成单表的crud方法,多表的需要我们自己进行编写

/**
* @author Jackiechan
* @description 针对表【user】的数据库操作Mapper
* @createDate 2023-06-02 16:55:32
* @Entity 
*/
public interface UserMapper {

    int deleteByPrimaryKey(Long id);

    int insert(User record);

    int insertSelective(User record);

    User selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(User record);

    int updateByPrimaryKey(User record);

}

MyBatis是一款比较优秀的框架,能够帮助我们快速地完成持久层的搭建,简化使用JDBC的步骤,使我们将更多的精力投入到核心代码的编写上。虽然是半自动ORM框架,我们需要进行一些文件的配置和SQL语句的编写,但还是挺不错的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值