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

前言

主要内容如下:

61dbadbf70fa

image.png

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

MyBatis的工作流程

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

61dbadbf70fa

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框架的核心配置文件中,元素是配置文件的根元素,其他元素都要在元素内配置。

61dbadbf70fa

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中配置属性,具体如下。

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

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

settings

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

61dbadbf70fa

image.png

typeAliases

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

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

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

当POJO类过多时,还可以通过自动扫描包的形式自定义别名,具体示例如下。

上述示例中,元素的子元素中的name属性用于指定要被定义别名的包,MyBatis会将所有com.itheima.po包中的POJO类以首字母小写的非限定类名来作为它的别名,比如com.itheima.po.User的别名为user, com.itheima.po.Customer的别名为customer等。

除了可以使用元素自定义别名外,MyBatis框架还默认为许多常见的Java类型(如数值、字符串、日期和集合等)提供了相应的类型别名,如表所示。

61dbadbf70fa

image.png

typeHandler

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

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

61dbadbf70fa

image.png

Mybatis 映射文件

61dbadbf70fa

image.png

如何返回Mysql主键ID

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

61dbadbf70fa

image.png

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

parameterType="com.itheima.po.Customer"

keyProperty="id" useGeneratedKeys="true" >

insert into t_customer(username, jobs, phone)

values(#{username}, #{jobs}, #{phone})

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

注意:成功的行数通过返回值返回,主键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();

}

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

61dbadbf70fa

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值