2.1. MyBatis简介
- 一对多 :resultmap + collection
- 多对一 :resultmap + association
- 多对多 :resultmap + collection + association
- 常见的持久层框架 : MyBatis , MyBatis-Plus , Hibernate
- Mybatis一开始叫 IBatis ,所以我们项目中报错说 IBatis 的就是Mybatis错了,是一个基于java的持久层框架,有以下特性
- 是支持定制化sql(xml文件中有对应的mapper映射),是存储过程以及高级映射的优秀持久层框架
- 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
加载数据库驱动程序:通过反射的方式加载驱动包,现在基本无需手动添加驱动包了。
建立数据库连接:使用DriverManager.getConnection()方法创建与数据库的连接,需要提供数据库的URL、用户名和密码。
创建Statement对象:使用connection.createStatement()方法创建一个Statement对象,用于执行SQL语句。
执行SQL语句:使用Statement对象的executeQuery()方法执行查询语句,或者使用executeUpdate()方法执行更新语句。
处理结果集:如果执行的是查询语句,可以使用ResultSet对象来处理查询结果。
关闭连接:使用connection.close()方法关闭数据库连接,释放资源。
- 能够使用简单的xml或者注解去配置和 原始映射 ,将接口以及java对象映射成数据库中的记录
- 是一个半自动的ORM(Object Relation Mapping)框架 --> 对象关系映射
- 动态SQL : if、where、trim、choose、when、otherwrise,foreach
- SQL 和 Java 编码分开,功能边界清晰。Java 代码专注业务、SQL 语句专注数据
- 持久化层技术对比
- JDBC : SQL写在java代码中,耦合度高,不易维护需要频繁修改,并且代码冗长,开发效率太低
- Hibernate 和 JPA : 程序中的长难复杂 SQL 需要绕过框架 ,反射操作太多,导致数据库性能下降,开发效率高
- Mybatis : 轻量级,性能出色,SQL和Java代码分开写的,功能边界清晰 ,开发效率略低于第二个但是可以接受
- Mybatis的核心配置文件 : mybatis-config.xml ,spring项目后就不用写了,主要是配置数据库的一些基本信息
- 创建项目过程 :
- 首先添加依赖
- 创建配置文件以及实体类
- 编写mapper接口,相当于是之前的dao层接口,区别是,mapper只是接口,不需要写实现类
- 创建映射文件,也就是ORM对象映射关系,对象指的是java实体类对象,关系指的是关系型数据库,映射指的是二者之间的对应关系
- 映射文件命名规则:
-
- 映射文件写的是sql语句用来访问和操作表
- 一个映射文件对应一个实体类对应一张表的操作
- 映射类文件放在src/main/recourses/mapper目录下
- 接口和映射文件命名空间要保持一致
- 接口中方法的方法名和映射文件id属性保持一致
-
-
- 映射文件需要注意的点 : 查询必须是设置属性 resultType 或 resultMap
id:表示自定义映射的唯一标识
type:查询的数据要映射的实体类的类型
子标签:
id:设置主键的映射关系
result:设置普通字段的映射关系
association:设置多对一的映射关系
collection:设置一对多的映射关系
ofType:设置collection标签所处理的集合属性中存储数据的类型
属性:
property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名
2.2. MyBatis获取参数
- 两种方式 :
${}
和 #{}
${}
的本质是字符串拼接(想like), #{}
本质是占位符${}
是使用字符串拼接去拼接sql语句,如果为字符串类型或者是日期类型的字段赋值需要手动加单引号#{}
使用占位符赋值拼接sql,为日期类型或者是字符串类型赋值会自动添加引号;@Param
标识参数,不然没办法自动找到谁是谁#{}
可以防止sql注入, ${}
需要手动设置防止sql注入
2.3. Mybatis的缓存
- 一级缓存 : SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询数据就直接从缓存中获取,不会从数据库重新访问。一级缓存失效 :
-
- 不同的SqlSession对应不同的缓存
- 同一个SqlSession但是查询条件不同
- 同一个SqlSession但是两次执行期间执行了增删改操作
- 同一个SqlSession但是两次查询期间手动清除了缓存
- 二级缓存 :SqlSessionFactory 级别的,通过同一个SqlSessionFactory 创建的SqlSession查询结果会被缓存
-
- 开启条件 : 核心配置文件中,设置全局属性
cacheEnabled="true"
,默认就是true - 在映射文件中添加标签
<cache />
- 二级缓存必须在SqlSession关闭 或者提交后才会有效
- 查询的数据所转换的实体类型必须实现序列化接口
- 二级缓存失效 : 两次查询之间执行了任意的增删改操作
- 整合第三方缓存EHCache
- MyBatis缓存查询数据执行顺序
- 先二级,二级中可能存在其他程序已经查出来的数据,直接拿来用
- 如果二级没查到就查一级
- 一级没查到就查数据库
- SqlSession关闭之后,一级缓存中的数据会写入二级缓存
2.4. Mybatis逆向工程
- 正向工程 :先创建java实体类,再由框架根据实体类生成数据库表
- 逆向工程 :先创建数据库表,再由框架根据数据库表生成【1】Java 实体类【2】Mapper 接口【3】 Mapper 映射文件
<!-- 依赖MyBatis核心包 -->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
</dependencies>
<!-- 控制Maven在构建过程中相关配置 -->
<build>
<!-- 构建过程中用到的插件 -->
<plugins>
<!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
<!-- 插件的依赖 -->
<dependencies>
<!-- 逆向工程的核心依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.2</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>