MyBatis简介及基本配置详解
发布时间: 2024-05-02 09:18:27 阅读量: 84 订阅数: 41
![MyBatis](https://img-blog.csdnimg.cn/20201213215226229.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ2ODkzNDk3,size_16,color_FFFFFF,t_70)
# 2.1 配置文件概述
MyBatis的配置文件是用来配置MyBatis框架的运行环境和行为的,它是一个XML格式的文件,通常命名为`mybatis-config.xml`。配置文件中包含了MyBatis框架运行所需的所有配置信息,包括数据库连接信息、映射文件配置、缓存配置、插件配置等。
### 2.1.1 配置文件结构
MyBatis配置文件的结构如下:
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 数据库连接配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件配置 -->
<mappers>
<mapper resource="com/example/mybatis/mapper/UserMapper.xml"/>
</mappers>
<!-- 缓存配置 -->
<cacheEntries>
<cacheEntry id="userCache" type="org.mybatis.caches.ehcache.EhcacheCache"/>
</cacheEntries>
<!-- 插件配置 -->
<plugins>
<plugin interceptor="com.example.mybatis.plugin.MyPlugin"/>
</plugins>
</configuration>
```
### 2.1.2 配置文件中的主要元素
MyBatis配置文件中包含了以下主要元素:
- **environments**:用于配置数据库连接信息,包括事务管理器和数据源。
- **mappers**:用于配置映射文件,映射文件定义了实体类与数据库表之间的映射关系。
- **cacheEntries**:用于配置缓存,缓存可以提高MyBatis的查询性能。
- **plugins**:用于配置插件,插件可以扩展MyBatis的功能。
# 2. MyBatis基本配置
### 2.1 配置文件概述
#### 2.1.1 配置文件结构
MyBatis配置文件通常以`.xml`为后缀,其结构如下:
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置内容 -->
</configuration>
```
#### 2.1.2 配置文件中的主要元素
配置文件中的主要元素包括:
- `<environments>`:配置不同的数据库环境。
- `<databaseId>`:指定当前使用的数据库环境。
- `<properties>`:定义全局属性,可以在整个配置文件中使用。
- `<settings>`:配置MyBatis的全局设置,如缓存、日志等。
- `<typeAliases>`:定义别名,用于简化实体类名称。
- `<mappers>`:配置映射文件,用于映射实体类和数据库表。
### 2.2 数据库连接配置
#### 2.2.1 数据库连接参数设置
在`<environments>`元素中,配置数据库连接参数:
```xml
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
```
- `driver`:数据库驱动类名。
- `url`:数据库连接URL。
- `username`:数据库用户名。
- `password`:数据库密码。
#### 2.2.2 连接池配置
在`<dataSource>`元素中,配置连接池:
```xml
<dataSource type="POOLED">
<property name="poolMaximumActiveConnections" value="10" />
<property name="poolMaximumIdleConnections" value="5" />
<property name="poolMaximumCheckoutTime" value="20000" />
</dataSource>
```
- `poolMaximumActiveConnections`:连接池中最大活动连接数。
- `poolMaximumIdleConnections`:连接池中最大空闲连接数。
- `poolMaximumCheckoutTime`:连接从池中取出后,最长可以被保持空闲的时间。
### 2.3 映射文件配置
#### 2.3.1 映射文件结构
映射文件通常以`.xml`为后缀,其结构如下:
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<!-- 映射内容 -->
</mapper>
```
#### 2.3.2 映射文件中的主要元素
映射文件中的主要元素包括:
- `<resultMap>`:定义结果集映射,用于将查询结果映射到实体类。
- `<sql>`:定义SQL语句片段,可以被其他元素引用。
- `<select>`:定义查询语句。
- `<insert>`:定义插入语句。
- `<update>`:定义更新语句。
- `<delete>`:定义删除语句。
# 3.1 实体类属性映射
实体类属性映射是将实体类的属性与数据库表中的字段进行关联,以便在进行数据操作时能够自动进行属性与字段之间的转换。
**3.1.1 属性与数据库字段的映射**
属性与数据库字段的映射可以通过在实体类属性上使用 `@Column` 注解来实现。`@Column` 注解包含以下主要属性:
- `name`:指定映射的数据库字段名称。
- `columnDefinition`:指定数据库字段的定义,例如数据类型、长度等。
- `jdbcType`:指定映射的 JDBC 类型。
- `nullable`:指定该字段是否允许为 null。
```java
@Column(name = "user_id", columnDefinition = "INT NOT NULL")
private Integer userId;
```
这段代码将实体类的 `userId` 属性映射到数据库表中的 `user_id` 字段,该字段是一个非空整型。
**3.1.2 属性的类型映射**
除了直接映射属性与字段,还可以通过类型映射器来进行属性与字段之间的类型转换。类型映射器是一个接口,用于将 Java 类型映射到数据库类型。
```java
@Column(name = "birth_date", columnDefinition = "DATE")
@Type(typeHandler = LocalDateTypeHandler.class)
private LocalDate birthDate;
```
这段代码将实体类的 `birthDate` 属性映射到数据库表中的 `birth_date` 字段,该字段是一个日期类型。通过指定 `@Type` 注解,将使用 `LocalDateTypeHandler` 类型映射器进行 Java `LocalDate` 类型与数据库 DATE 类型的转换。
### 3.2 实体类与数据库表的关系映射
实体类与数据库表的关系映射是将实体类与数据库表之间的关系进行映射,以便在进行数据操作时能够自动进行实体类与表之间的转换。
**3.2.1 一对一关系映射**
一对一关系映射是指一个实体类与一个数据库表之间存在一对一的关系。在 MyBatis 中,可以通过 `@OneToOne` 注解来实现一对一关系映射。
```java
@OneToOne(mappedBy = "user")
private UserDetail userDetail;
```
这段代码将实体类的 `userDetail` 属性映射到 `User` 表中的 `user_detail` 表,该关系是一对一关系,其中 `user_detail` 表中的 `user_id` 字段是外键,指向 `User` 表中的 `id` 字段。
**3.2.2 一对多关系映射**
一对多关系映射是指一个实体类与一个数据库表之间存在一对多关系。在 MyBatis 中,可以通过 `@OneToMany` 注解来实现一对多关系映射。
```java
@OneToMany(mappedBy = "user")
private List<Order> orders;
```
这段代码将实体类的 `orders` 属性映射到 `Order` 表中的 `orders` 表,该关系是一对多关系,其中 `Order` 表中的 `user_id` 字段是外键,指向 `User` 表中的 `id` 字段。
# 4. MyBatis SQL映射
### 4.1 SQL语句映射
#### 4.1.1 SQL语句的编写
在MyBatis中,SQL语句是通过XML映射文件中的`<sql>`标签来定义的。`<sql>`标签可以定义通用的SQL语句片段,这些片段可以被其他SQL语句引用和重用。
**示例:**
```xml
<sql id="user_columns">
id, username, password, email
</sql>
```
这个`<sql>`标签定义了一个通用的SQL语句片段,用于获取用户表的列名。它可以通过`<include>`标签引用在其他SQL语句中。
#### 4.1.2 SQL语句的参数传递
MyBatis支持使用占位符或命名参数来传递SQL语句的参数。
**占位符:**
```xml
<select id="get_user_by_id" parameterType="int">
SELECT * FROM users WHERE id = #{id}
</select>
```
**命名参数:**
```xml
<select id="get_user_by_name" parameterType="map">
SELECT * FROM users WHERE username = #{username}
</select>
```
### 4.2 结果集映射
#### 4.2.1 结果集映射的配置
MyBatis使用`<resultMap>`标签来配置结果集映射。`<resultMap>`标签定义了如何将查询结果映射到Java对象。
**示例:**
```xml
<resultMap id="user_result_map" type="com.example.User">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="password" property="password" />
<result column="email" property="email" />
</resultMap>
```
这个`<resultMap>`标签将查询结果映射到`com.example.User`类。它定义了如何将`id`列映射到`id`属性,`username`列映射到`username`属性,以此类推。
#### 4.2.2 结果集映射的类型映射
MyBatis支持使用类型映射器来将数据库中的数据类型映射到Java对象中的数据类型。
**示例:**
```xml
<resultMap id="user_result_map" type="com.example.User">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="password" property="password" />
<result column="email" property="email" typeHandler="com.example.EmailTypeHandler" />
</resultMap>
```
在这个示例中,`email`列使用自定义的`EmailTypeHandler`类型映射器来映射到`email`属性。类型映射器负责将数据库中的字符串值转换为Java对象中的`Email`对象。
### 4.3 动态SQL
MyBatis支持使用动态SQL来动态生成SQL语句。动态SQL允许根据运行时条件生成不同的SQL语句。
**示例:**
```xml
<select id="get_users_by_criteria" parameterType="map">
SELECT * FROM users
<where>
<if test="username != null">
username = #{username}
</if>
<if test="email != null">
email = #{email}
</if>
</where>
</select>
```
这个动态SQL语句根据`username`和`email`参数生成不同的SQL语句。如果`username`参数不为null,则添加`username = #{username}`条件。如果`email`参数不为null,则添加`email = #{email}`条件。
# 5. MyBatis高级配置
### 5.1 缓存配置
**5.1.1 一级缓存和二级缓存**
MyBatis提供了一级缓存和二级缓存机制,用于提高数据库查询的性能。
* **一级缓存(Local Cache):** 存储在会话(Session)范围内的缓存,默认开启,每个会话维护一份自己的缓存,当会话关闭时,缓存也会被清除。
* **二级缓存(Global Cache):** 存储在全局范围内的缓存,默认关闭,需要手动开启,所有会话共享同一个二级缓存,数据在多个会话之间共享。
**5.1.2 缓存的配置和使用**
**一级缓存配置:**
```xml
<settings>
<setting name="localCacheScope" value="STATEMENT"/>
</settings>
```
* `localCacheScope`:指定一级缓存的范围,可选值有`STATEMENT`(默认)、`SESSION`、`NONE`。
**二级缓存配置:**
```xml
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="useCache" value="true"/>
<setting name="cacheTimeout" value="60000"/>
</settings>
```
* `cacheEnabled`:启用或禁用二级缓存。
* `useCache`:指定是否使用二级缓存。
* `cacheTimeout`:设置缓存过期时间,单位为毫秒。
**缓存使用:**
使用`@CacheNamespace`注解开启实体类的二级缓存:
```java
@CacheNamespace(implementation=MybatisCache.class)
public class User {
// ...
}
```
**代码逻辑分析:**
`@CacheNamespace`注解指定了实体类`User`使用`MybatisCache`作为二级缓存的实现类。
### 5.2 插件配置
**5.2.1 插件的类型和功能**
MyBatis插件是一种拦截器,可以拦截SQL语句的执行过程,在执行前或执行后进行额外的操作。常见的插件类型有:
* **分页插件:** 对查询结果进行分页处理。
* **日志插件:** 记录SQL语句的执行日志。
* **性能插件:** 分析SQL语句的执行性能。
**5.2.2 插件的配置和使用**
**插件配置:**
```xml
<plugins>
<plugin interceptor="com.example.MybatisPlugin"/>
</plugins>
```
* `interceptor`:指定插件的实现类。
**插件使用:**
插件会在SQL语句执行前或执行后被调用,具体执行时机由插件的实现决定。插件可以获取到SQL语句、参数等信息,并进行相应的操作。
**代码逻辑分析:**
```java
public class MybatisPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 在SQL语句执行前执行
// ...
// 执行SQL语句
Object result = invocation.proceed();
// 在SQL语句执行后执行
// ...
return result;
}
}
```
**代码逻辑分析:**
`MybatisPlugin`实现了`Interceptor`接口,重写了`intercept`方法。在SQL语句执行前,`intercept`方法会在`proceed`方法之前执行;在SQL语句执行后,`intercept`方法会在`proceed`方法之后执行。
# 6. MyBatis实践应用
### 6.1 MyBatis在Web开发中的应用
#### 6.1.1 整合MyBatis框架
在Web开发中,可以使用以下步骤将MyBatis框架整合到项目中:
1. **添加MyBatis依赖**:在项目构建文件中(如pom.xml)添加MyBatis依赖。
2. **配置MyBatis**:创建MyBatis配置文件(如mybatis-config.xml),配置数据库连接、映射文件等信息。
3. **创建映射文件**:为每个实体类创建映射文件(如UserMapper.xml),定义SQL语句和结果集映射。
4. **创建MyBatis会话工厂**:创建MyBatis会话工厂(SqlSessionFactory),用于创建会话(SqlSession)。
5. **使用MyBatis**:通过会话对象执行SQL语句,查询或更新数据。
#### 6.1.2 编写MyBatis映射文件
MyBatis映射文件是XML文件,用于定义SQL语句和结果集映射。以下是一个示例映射文件:
```xml
<mapper namespace="com.example.dao.UserMapper">
<select id="selectUserById" parameterType="int" resultType="com.example.entity.User">
SELECT * FROM users WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.entity.User">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
<update id="updateUser" parameterType="com.example.entity.User">
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
```
### 6.2 MyBatis在数据分析中的应用
#### 6.2.1 使用MyBatis进行数据查询
MyBatis可以方便地进行数据查询。以下是一个使用MyBatis查询数据的示例代码:
```java
try (SqlSession session = sqlSessionFactory.openSession()) {
List<User> users = session.selectList("com.example.dao.UserMapper.selectUserById", 1);
for (User user : users) {
System.out.println(user.getName());
}
}
```
#### 6.2.2 使用MyBatis进行数据更新
MyBatis也可以用于更新数据。以下是一个使用MyBatis更新数据的示例代码:
```java
try (SqlSession session = sqlSessionFactory.openSession()) {
User user = new User();
user.setId(1);
user.setName("John Doe");
user.setEmail("john.doe@example.com");
session.update("com.example.dao.UserMapper.updateUser", user);
session.commit();
}
```
0
0