1、Mybatis概述
1.1 JDBC编程
1.2.说说你对Mybatis的了解
1.Mybatis 基于java的持久层框架,它的内部封装了JDBC,让开发人员只需要关注SQL语句本身,不需要花费精力在驱动的加载、连接的创建、Statement的创建等复杂的过程。
2.Mybatis 通过 XML 或注解的方式将要执行的各种的 statement 配置起来,并通过 java 对象和 statement 中的 sql 的动态参数进行映射生成最终执行的SQL 语句,最后 由mybatis框架执行SQL,并将结果直接映射为java对象 。
3.采用了 ORM思想 解决了实体类和数据库表映射的问题。对 JDBC进行了封装 ,屏蔽了 JDBCAPI 底层的访问细节,避免我们与 jdbc 的 api 打交道,就能完成对数据的持久化操作。
1.3 Mybatis解决的问题
1、数据库连接的创建、释放连接的频繁操作造成资源的浪费从而影响系统的性能。
2、SQL语句编写在代码中,硬编码造成代码不容易维护,实际应用中SQL语句变化的可能性比较大,一旦变动就需要改变java类。
3、使用preparedStatement的时候传递参数使用占位符,也存在硬编码,因为SQL语句变化,必须修改源码。
4、对结果集的解析中也存在硬编码。
2、Mybatis入门案例
2.1 创建数据库和表
CREATE TABLE team
(
teamId
int NOT NULL AUTO_INCREMENT COMMENT ‘球队ID’,
teamName
varchar(50) DEFAULT NULL COMMENT ‘球队名称’,
location
varchar(50) DEFAULT NULL COMMENT ‘球队位置’,
createTime
date DEFAULT NULL COMMENT ‘球队建立时间’,
PRIMARY KEY (teamId
)
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2.2 创建maven项目,添加Mybatis的jar依赖
创建个java的maven项目
2.3 编写Mybatis的配置文件
一般情况下:配置文件的名称可以自定义,使用mybatis.xml。配置文件放置在java/resources中。
头文件去官网中复制粘贴。提供一个中文的网站。Mybatis网址
配置文件中配置mybatis的环境(数据源、事务类型)
2.4 编写实体类
实体类中的属性必须与表中的列名保持一致,默认构造+set+get(不能少)
2.5 编写ORM映射文件
我们是针对实体类Team.java和表Team进行ORM映射.
Mybatis 框架中, ORM 映射是针对 SQL 语句进行, Mybatis 框架将 SQL 语句抽取到了 XML 中。所以我们需要针对每个实体类编写 XML 映射文件。
2.5.1 XML映射文件必须与实体类在同一个包下面
2.5.2 XML映射文件名称必须是实体类名称一致
头文件在网站复制即可。Mybatis网址
注意namespace、id、resultType分别表示什么。
2.6 将映射文件注册到mybatis的配置文件中
2.7 配置映射文件的扫描位置
pom.xml 文件配置映射文件的扫描路径
因为src/main/java目录下的配置完文件(.xml/.properties)是无法读取到,需要在pom.xml中去指定配置文件的扫描路径
2.8 使用Mybatis框架的核心接口测试
2.9. 配置日志文件
2.9.1.添加jar依赖
2.9.2.添加日志配置文件
在 resource 下添加 log4j.properties 配置文件
Global logging configuration info warning error
log4j.rootLogger=DEBUG,stdout
Console output…
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
2.9.3.在mybatis配置文件中添加日志的配置
2.10.入门案例的增删改查
2.10.0.注意:手动提交事务
增删改操作,必须手动提交事务,否则不生效
因为上面在mybatis配置中,指定了JDBC方式(Connection)管理事务,默认自动提交是false,
解决1.每执行一次增删改sql,我们手动提交sqlSession.commit()
解决2.在获取sqlSession会话时,开启自动事务,参数true,即factory.openSession(true)
这只是在dao层操作事务,不推荐,将来事务都是在service层通过声明式事务管理
实体类
2.10.0.在测试类中使用测试注解@Before @After减少重复代码
2.10.1 根据ID查询单个对象
parameterType:参数类型,sql中占位符类型,该属性基本类型时可省略,实体类型则不可省略
resultType:返回类型,执行这条sql后返回什么类型的结果,基本类型可省略不写,若集合则其元素类型–>
报错原因:实体类没有加默认构造方法
Team.xml的映射文件中添加:
测试类中添加如下内容:
2.10.2 增删改
Team.xml 的映射文件中添加:
测试类中添加如下方法:
2.10.3.查询所有
映射文件添加
测试类添加
3、Mybatis对象分析
3.1 Resources
Resources 类,顾名思义就是资源,用于读取资源文件。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象。
3.2 SqlSessionFactoryBuilder
SqlSessionFactory 的 创 建 , 需 要 使 用 SqlSessionFactoryBuilder 对 象 的 build() 方 法 。 事实上使用 SqlSessionFactoryBuilder 的原因是将SqlSessionFactory 这个复杂对象的创建交由 Builder 来执行,也就是使用了 建造者设计模式 。
建造者模式 : 又称生成器模式 , 是一种 对象的创建模式 。 可以将一个产品的内部表象与产品的生成过程分割开来 , 从而可以使一个建造过程生成具有不同的内部表象的产品( 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示 ). 这样用户只需指定需要建造的类型就可以得到具体产品, 而不需要了解具体的建造过程和细节 .
在建造者模式中, 角色分指导者 (Director) 与建造者 (Builder): 用户联系指导者 , 指导者指挥建造者 , 最后得到产品 . 建造者模式可以强制实行一种分步骤进行的建造过程.
SqlSessionFactoryBuilder 充当的就是建造者角色 ,sqlSession就是我们最后得到的产品。
3.3 SqlSessionFactory
SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是 线程安全 的,所以一个应用只需要一个该对象。创建SqlSession 需 SqlSessionFactory 接口的 openSession() 方法。
默认的 openSession()方法没有参数,它会创建有如下特性的 SqlSession :
1 、会开启一个手动提交的事务(也就是不自动提交)。
2 、将从由当前环境配置的 DataSource 实例中获取 Connection 对象。事务隔离级别将会使用驱动或数据源的默认设置。
3 、预处理语句不会被复用,也不会批量处理更新。
openSession(true) :创建一个有自动提交功能的 SqlSession
openSession(false) :创建一个非自动提交功能的 SqlSession ,需手动提交
openSession()