MyBatis 是一个优秀的持久层框架,可以使开发者以简单的方式执行 SQL 查询、插入、更新和删除操作。以下是 10 种超赞的 MyBatis 写法,可以帮助你更高效地使用 MyBatis:

1. 使用 XML 配置文件的动态 SQL

使用 MyBatis 动态 SQL 标签(如 <if>, <choose>, <when>, <otherwise>, <foreach>)来构建复杂的 SQL 查询。

<select id="findUsers" resultType="User">
    SELECT * FROM users
    <where>
        <if test="username != null">
            AND username = #{username}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>

2. 使用注解配置 SQL

对于简单的 SQL 查询,可以使用注解配置,简化 XML 配置文件。

public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);

    @Insert("INSERT INTO users(username, age) VALUES(#{username}, #{age})")
    void insertUser(User user);
}

3. 使用 @Results 注解进行结果映射

在注解配置中,可以使用 @Results 注解将查询结果映射到对象字段。

public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    @Results({
        @Result(property = "id", column = "id"),
        @Result(property = "username", column = "username"),
        @Result(property = "age", column = "age")
    })
    User getUserById(int id);
}

4. 批量插入操作

使用 <foreach> 标签实现批量插入操作,提高数据库插入效率。

<insert id="batchInsertUsers">
    INSERT INTO users (username, age)
    VALUES
    <foreach collection="list" item="user" separator=",">
        (#{user.username}, #{user.age})
    </foreach>
</insert>

5. 使用 SqlProvider 动态生成 SQL

使用 @SelectProvider, @InsertProvider, @UpdateProvider, @DeleteProvider 注解动态生成 SQL 语句。

public interface UserMapper {
    @SelectProvider(type = UserSqlProvider.class, method = "selectByUsername")
    User getUserByUsername(String username);
}

public class UserSqlProvider {
    public String selectByUsername(final String username) {
        return new SQL(){{
            SELECT("*");
            FROM("users");
            WHERE("username = #{username}");
        }}.toString();
    }
}

6. 使用 MyBatis 的内置缓存机制

配置 MyBatis 的二级缓存,提高查询性能。

<cache/>

在 mapper 配置文件中添加 <cache/> 标签启用二级缓存,并在 MyBatis 配置文件中配置缓存机制。

7. 使用 MyBatis 的分页插件

使用分页插件(如 MyBatis PageHelper)实现分页查询。

PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.findAll();
PageInfo<User> pageInfo = new PageInfo<>(users);

8. 多数据库环境的动态数据源切换

在多数据库环境下,可以使用动态数据源切换,实现不同数据库的访问。

@DataSource("dataSource1")
public interface UserMapper1 {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
}

@DataSource("dataSource2")
public interface UserMapper2 {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
}

9. 使用 TypeHandler 处理复杂数据类型

使用自定义的 TypeHandler 处理复杂数据类型,如 JSON 类型。

@MappedTypes(JsonType.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class JsonTypeHandler extends BaseTypeHandler<JsonType> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JsonType parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.toJson());
    }

    @Override
    public JsonType getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return JsonType.fromJson(rs.getString(columnName));
    }

    @Override
    public JsonType getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return JsonType.fromJson(rs.getString(columnIndex));
    }

    @Override
    public JsonType getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return JsonType.fromJson(cs.getString(columnIndex));
    }
}

10. 使用 MyBatis Generator 自动生成代码

使用 MyBatis Generator 自动生成 MyBatis 的实体类、Mapper 接口和 XML 配置文件,提高开发效率。

<generatorConfiguration>
    <context id="MyBatis3" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydatabase"
                        userId="root"
                        password="password"/>
        <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
        <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"/>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"/>
        <table tableName="users"/>
    </context>
</generatorConfiguration>

通过以上这些写法和技巧,你可以更高效、更优雅地使用 MyBatis,实现复杂的持久层操作。