22篇 mybatis简介

MyBatis 是一款优秀的基于Java的持久层框架,它能够帮助开发者灵活地将SQL语句与Java对象进行映射,简化了数据库操作的复杂性。以下是一些MyBatis的核心语法和用法:

 

### 基本配置与映射文件

- **配置文件**(`mybatis-config.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>

  <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/mydatabase"/>

        <property name="username" value="root"/>

        <property name="password" value="password"/>

      </dataSource>

    </environment>

  </environments>

  <mappers>

    <mapper resource="com/example/mapping/UserMapper.xml"/>

  </mappers>

</configuration>

```

 

### 映射文件(Mapper XML 文件)

- **增删改查操作**:

   - `insert`:用于插入数据

   ```xml 

  <insert id="insertUser" parameterType="com.example.model.User">

     INSERT INTO users(username, password)

     VALUES (#{username}, #{password})

   </insert>

   ```

   - `update`:用于更新数据

   ```xml 

  <update id="updateUser" parameterType="com.example.model.User">

     UPDATE users SET password=#{password} WHERE username=#{username}

   </update>

   ```

   - `delete`:用于删除数据

   ```xml   

<delete id="deleteUser" parameterType="java.lang.String">

     DELETE FROM users WHERE username=#{username}

   </delete>

   ```

   - `select`:用于查询数据

   ```xml 

  <select id="findUserByUsername" resultType="com.example.model.User">

     SELECT * FROM users WHERE username=#{username}

   </select>

   ```

 

### 参数传递

- MyBatis可以通过多种方式进行参数传递:

   - 单个简单类型参数:

     ```xml

     #{paramName}

     ```

   - Map类型参数:

     ```xml

     #{map.key}

     ```

   - POJO类型参数,通过属性名引用:

     ```xml

     #{propertyName}

     ```

 

### 动态SQL

- MyBatis支持动态SQL标签,例如:

   - `<if>`:根据条件包含或排除SQL片段

   ```xml 

  <select id="selectUsers" parameterType="map">

     SELECT * FROM users

     <if test="name != null">

       WHERE name = #{name}

     </if>

   </select>

   ```

   - `<foreach>`:循环遍历集合

   ```xml   

<select id="selectUsersByIds" parameterType="list">

     SELECT * FROM users

     WHERE id IN

     <foreach item="id" index="index" collection="list" open="(" separator="," close=")">

       #{id}

     </foreach>

   </select>

   ```

 

### 输出映射(ResultMap)

- 结果集映射到实体类

   ```xml

   <resultMap id="userResultMap" type="com.example.model.User">

     <id property="id" column="user_id"/>

     <result property="username" column="username"/>

     <result property="password" column="password"/>

   </resultMap>

   ```

   

以上仅是MyBatis基础语法的一部分,实际使用中还包括许多其他特性,比如association(关联)、collection(集合映射)等。通过这些语法结构,MyBatis使得SQL操作更加灵活且易于维护。

### 其他高级特性

#### 注解方式开发
除了XML映射文件之外,MyBatis也支持注解方式定义SQL语句和结果映射。在接口方法上添加注解,可以直接实现对SQL的操作。

```java

public interface UserMapper {
    @Insert("INSERT INTO users(username, password) VALUES(#{username}, #{password})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);

    @Select("SELECT * FROM users WHERE id = #{id}")
    @Results({
        @Result(id = true, column = "id", property = "id"),
        @Result(column = "username", property = "username"),
        @Result(column = "password", property = "password")
    })
    User selectById(int id);
}



```

#### 别名
为了简化长类型的书写,MyBatis允许在配置文件中定义别名。

```xml

<typeAliases>
    <typeAlias alias="User" type="com.example.model.User"/>
</typeAliases>


```
这样,在映射文件或注解中就可以直接使用`User`代替完整的类名。

#### 二级缓存
MyBatis 提供了一级缓存(Session 级别的缓存)和二级缓存(全局级别的缓存)。二级缓存可以在多个会话间共享查询结果,以提高性能。

```xml

<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>


```

#### 插件(Plugins)
MyBatis 提供了插件机制,可以自定义拦截器来扩展 MyBatis 的行为。例如,可以创建一个插件来实现自动填充时间戳字段。

```java

@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class ExamplePlugin implements Interceptor {
    // ...
}


```

以上只是MyBatis众多特性的部分介绍,具体使用时可以根据项目需求选择适合的配置和功能。总的来说,MyBatis作为一个轻量级ORM框架,以其灵活性和强大的功能深受开发者喜爱。

#### 分页支持
MyBatis 并没有内置分页功能,但是可以通过编写动态 SQL 来实现分页查询。在实际应用中,常结合具体的数据库方言进行分页处理,例如在MySQL中的分页示例:

```xml

<select id="selectUsersWithPagination" parameterType="map" resultMap="userResultMap">
    SELECT * FROM users
    <if test="orderByClause != null">
        ORDER BY ${orderByClause}
    </if>
    LIMIT #{offset}, #{limit}
</select>


```
在这个例子中,`offset` 和 `limit` 分别对应分页的起始位置和每页大小。

另外,社区也有像 mybatis-paginator、PageHelper 这样的第三方分页插件,它们提供了更为便捷的分页支持,只需简单的配置即可实现分页功能。

#### 多表关联查询
MyBatis 可以通过 resultMap 定义复杂的实体类之间的关联关系,包括一对一、一对多、多对多等。

```xml

<resultMap id="userAndOrdersResultMap" type="User">
    <id property="id" column="user_id"/>
    <result property="username" column="username"/>
    <!-- 一对多关联 -->
    <collection property="orders" ofType="Order">
        <id property="id" column="order_id"/>
        <result property="productName" column="product_name"/>
        <!-- 关联外键 -->
        <association property="user" javaType="User">
            <id property="id" column="user_id"/>
            <result property="username" column="username"/>
        </association>
    </collection>
</resultMap>


```

#### 事务管理
在 MyBatis 配置文件中,可以通过 `<transactionManager>` 标签配置事务管理器,例如 JDBC 或者 MANAGED(对于 Spring 环境下的事务管理)。

```xml

<transactionManager type="MANAGED"/>


```
在 Spring 集成环境下,可以通过 AOP 配置事务策略,对数据库操作进行统一的事务管理。

总之,MyBatis 以其高度的灵活性和丰富的功能,极大地简化了 Java 应用程序对数据库的操作,并且能够很好地与其他框架进行集成,满足各种业务场景的需求。

#### SQL构建器(SqlBuilder)
从MyBatis 3.4.5版本开始,引入了新的API SqlBuilder,它可以方便地构建动态SQL,而无需在XML中编写大量的`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<foreach>`等标签。```java

public interface UserMapper {
    @SelectProvider(type = UserSqlBuilder.class, method = "selectUsers")
    List<User> selectUsers(@Param("username") String username, @Param("statusList") List<Integer> statusList);
}

public class UserSqlBuilder {
    public static String selectUsers(final Map<String, Object> params) {
        return new SQL() {{
            SELECT("*");
            FROM("users");
            if (params.get("username") != null) {
                WHERE("username = #{username}");
            }
            if (params.get("statusList") != null) {
                WHERE("status IN " + SqlBuilder.in(params.get("statusList")));
            }
        }}.toString();
    }
}


```

#### Scripting Support
MyBatis 支持在XML映射文件中使用Groovy脚本来编写动态SQL,增强了SQL表达能力。

```xml

<select id="selectUsers" resultType="User">
    <script>
        SELECT * FROM users
        <where>
            <if test="username != null">
                AND username = #{username}
            </if>
            <if test="statusList != null">
                AND status IN 
                <foreach item="status" index="index" collection="statusList" open="(" separator="," close=")">
                    #{status}
                </foreach>
            </if>
        </where>
    </script>
</select>


```

#### 自动填充(Automatic Mapping)
MyBatis 支持自动映射结果集到Java对象,如果数据库表字段名称与Java对象的属性名称相匹配,则无需手动指定`<resultMap>`。

此外,MyBatis还有更多高级特性,例如延迟加载(懒加载)、存储过程调用、日志记录、类型处理器等等,能满足不同层次和规模的应用程序需求。同时,由于其轻量级和易扩展的特性,使得它在现代Web应用和微服务架构中得到了广泛的应用。

 

 

 

 

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值