MyBatis 知识点回顾 工作流程原理、核心对象、配置文件、返回MySql主键ID -《Java EE 企业级应用开发教程》读书笔记

本文是《Java EE 企业级应用开发教程》的读书笔记,主要阐述了MyBatis的工作流程,包括读取配置文件、加载映射文件、创建SqlSessionFactory和SqlSession等8个步骤。此外,介绍了MyBatis的两个核心对象:SqlSessionFactory和SqlSession,以及配置文件中的configuration、properties、settings、typeAliases和typeHandler等元素。最后,探讨了如何在映射文件中返回Mysql主键ID。
摘要由CSDN通过智能技术生成

前言

主要内容如下:

image.png

内容来自于《Java EE 企业级应用开发教程》这本书的翻读笔记,内容相对简单,用于基础知识的复习巩固。

MyBatis的工作流程

MyBatis框架在操作数据库时,大体经过了8个步骤。下面就对图6-4中的每一步流程进行详细讲解,具体如下。

image.png

(1)读取MyBatis配置文件mybatis-config.xml。mybatis-config.xml作为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,其中主要内容是获取数据库连接。
(2)加载映射文件Mapper.xml。Mapper.xml文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在mybatis-config.xml中加载才能执行。mybatis-config.xml可以加载多个配置文件,每个配置文件对应数据库中的一张表。
(3)构建会话工厂。通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory。
(4)创建SqlSession对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL的所有方法。
(5)MyBatis底层定义了一个Executor接口来操作数据库,它会根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
(6)在Executor接口的执行方法中,包含一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等。Mapper.xml文件中一个SQL对应一个MappedStatement对象,SQL的id即是MappedStatement的id。
(7)输入参数映射。在执行方法时,MappedStatement对象会对用户执行SQL语句的输入参数进行定义(可以定义为Map、List类型、基本类型和POJO类型), Executor执行器会通过MappedStatement对象在执行SQL前,将输入的Java对象映射到SQL语句中。这里对输入参数的映射过程就类似于JDBC编程中对preparedStatement对象设置参数的过程。
(8)输出结果映射。在数据库中执行完SQL语句后,MappedStatement对象会对SQL执行输出的结果进行定义(可以定义为Map和List类型、基本类型、POJO类型), Executor执行器会通过MappedStatement对象在执行SQL语句后,将输出结果映射至Java对象中。这种将输出结果映射到Java对象的过程就类似于JDBC编程中对结果的解析处理过程。

MyBatis的核心对象

在使用MyBatis框架时,主要涉及两个核心对象:

  • SqlSessionFactory
  • SqlSession
SqlSessionFactory

SqlSessionFactory是MyBatis框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder则可以通过XML配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例

SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。如果我们多次地创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。为了解决此问题,通常每一个数据库都会只对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单列模式。

SqlSession

SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。SqlSession对象包含了数据库中所有执行SQL操作的方法,由于其底层封装了JDBC连接,所以可以直接使用其实例来执行已映射的SQL语句。每一个线程都应该有一个自己的SqlSession实例,并且该实例是不能被共享的。同时,SqlSession实例也是线程不安全的,因此其使用范围最好在一次请求或一个方法中,绝不能将其放在一个类的静态字段、实例字段或任何类型的管理范围(如Servlet的HttpSession)中使用。使用完SqlSession对象之后,要及时地关闭它,通常可以将其放在finally块中关闭

MyBatis 配置文件

configuration

在MyBatis框架的核心配置文件中,元素是配置文件的根元素,其他元素都要在元素内配置。

image.png

properties

是一个配置属性的元素,该元素通常用于将内部的配置外在化,即通过外部的配置来动态地替换内部定义的属性。例如,数据库的连接等属性,就可以通过典型的Java属性文件中的配置来替换,具体方式如下。

在项目的src目录下,添加一个全名为db.properties的配置文件,编辑后的代码如下所示。

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

在MyBatis配置文件mybatis-config.xml中配置<properties… />属性,具体如下。

<properties resource="db.properties" />

修改配置文件中数据库连接的信息,具体如下。

<dataSource type="POOLED">   
 <! -- 数据库驱动 -->   
 <property name="driver" value="${jdbc.driver}" />   
 <! -- 连接数据库的url -->   
 <property name="url" value="${jdbc.url}" />   
 <! -- 连接数据库的用户名 -->  
  <property name="username" value="${jdbc.username}" /> 
   <! -- 连接数据库的密码 -->   
 <property name="password" value="${jdbc.password}" />
</dataSource>

完成上述配置后,dataSource中连接数据库的4个属性(driver、url、username和password)值将会由db.properties文件中对应的值来动态替换。这样就为配置提供了诸多灵活的选择。

settings

元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。虽然不配置元素,也可以正常运行MyBatis,但是熟悉的配置内容以及它们的作用还是十分必要的。元素中的常见配置及其描述如表所示。

image.png

typeAliases

元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。

使用元素配置别名的方法如下。

<! -- 定义别名 -->
<typeAliases>   
 <typeAlias alias="user" type="com.itheima.po.User"/>
</typeAliases>

上述示例中,元素的子元素中的type属性用于指定需要被定义别名的类的全限定名;alias属性的属性值user就是自定义的别名,它可以代替com.itheima. po.User使用在MyBatis文件的任何位置。如果省略alias属性,MyBatis会默认将类名首字母小写后的名称作为别名。
当POJO类过多时,还可以通过自动扫描包的形式自定义别名,具体示例如下。

<! -- 使用自动扫描包来定义别名 -->
<typeAliases> 
   <package name="com.itheima.po"/>
</typeAliases>

上述示例中,元素的子元素中的name属性用于指定要被定义别名的包,MyBatis会将所有com.itheima.po包中的POJO类以首字母小写的非限定类名来作为它的别名,比如com.itheima.po.User的别名为user, com.itheima.po.Customer的别名为customer等。
除了可以使用元素自定义别名外,MyBatis框架还默认为许多常见的Java类型(如数值、字符串、日期和集合等)提供了相应的类型别名,如表所示。

image.png

typeHandler

MyBatis在预处理语句(PreparedStatement)中设置一个参数或者从结果集(ResultSet)中取出一个值时,都会用其框架内部注册了的typeHandler(类型处理器)进行相关处理。typeHandler的作用就是将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结果时将jdbcType转换为javaType。

为了方便转换,MyBatis框架提供了一些默认的类型处理器,其常用的类型处理器如表所示。

image.png

Mybatis 映射文件

image.png

如何返回Mysql主键ID

执行插入操作后,很多时候我们会需要返回插入成功的数据生成的主键值,此时就可以通过如下3个属性来实现。

image.png

如果使用的数据库支持主键自动增长(如MySQL),那么可以通过keyProperty属性指定PO类的某个属性接收主键返回值(通常会设置到id属性上),然后将useGeneratedKeys的属性值设置为true,其使用示例如下。

<insert id="addCustomer" 
parameterType="com.itheima.po.Customer"       
 keyProperty="id" useGeneratedKeys="true" >    
insert into t_customer(username, jobs, phone)   
 values(#{username}, #{jobs}, #{phone})
</insert>

使用上述配置执行插入后,会返回插入成功的行数,以及插入行的主键值。

注意:成功的行数通过返回值返回,主键ID通过PO类设置的字段返回。
为了验证此配置,可以通过如下代码测试。

@Test public void addCustomerTest(){    
  // 获取SqlSession    
  SqlSession sqlSession = MybatisUtils.getSession();    
  Customer customer = new Customer();    
  customer.setUsername("rose");    
  customer.setJobs("student");    
  customer.setPhone("13333533092");    
  int rows =   sqlSession.insert("com.itheima.mapper."+"CustomerMapper.addCustomer", customer);    
  // 输出插入数据的主键id值    
  System.out.println(customer.getId());    
  if(rows > 0){        
    System.out.println("您成功插入了"+rows+"条数据!");    
  }else{        
    System.out.println("执行插入操作失败!! ! ");    
  }    
  sqlSession.commit();    
  sqlSession.close();
}

执行程序后,控制台的输出结果如图所示。

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值