一、介紹
MyBatisor 是一個開源的Java持久層框架。它提供了基於映射文件方式及註解形式進行 SQL 操作的方式。通過將 SQL 與代碼解耦,可以更加靈活地進行 SQL 操作,提高 SQL 的可維護性和可讀性,同時也降低了 Java 開發人員與 SQL 的編程複雜度。下面將從以下幾個方面介紹 MyBatisor 的使用。
二、配置
MyBatisor 的配置包括 MyBatisor 全局配置和 Mapper 映射文件配置。其中 MyBatisor 全局配置主要包括數據源配置、ORM 框架配置、插件配置和全局屬性配置。Mapper 映射文件配置主要是配置 SQL 語句的實現。全局配置一般放在 mybatis-config.xml 文件中,映射文件則一般放在 Mapper 接口的同名 XML 文件中。以下是一個基本的 MyBatisor 全局配置和 Mapper 映射文件的示例:
# mybatis-config.xml
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mappers/UserMapper.xml"/>
<mapper class="com.example.mappers.RoleMapper"/>
<package name="com.example.mappers"/>
</mappers>
</configuration>
# UserMapper.xml
<mapper namespace="com.example.mappers.UserMapper">
<select id="getUserById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="addUser" parameterType="com.example.entity.User">
INSERT INTO user(username,password,email) VALUES(#{username},#{password},#{email})
</insert>
<update id="updateUser" parameterType="com.example.entity.User">
UPDATE user SET username=#{username},password=#{password},email=#{email} WHERE id=#{id}
</update>
<delete id="deleteUserById" parameterType="java.lang.Long">
DELETE FROM user WHERE id=#{id}
</delete>
</mapper>
三、CRUD 操作
MyBatisor 提供了基於 XML 文件和註解的兩種方式進行 SQL 的 CRUD 操作。使用註解方式可以不用寫 XML 映射文件,直接使用 Java 註解來聲明 SQL 語句,比較適用於簡單的查詢等操作;而使用 XML 文件方式可以更加清晰地描述 SQL 語句,對於複雜的 SQL 語句操作更加方便。
1、XML 文件方式
使用 XML 文件方式進行 CRUD 操作時,需要在 Mapper 映射文件中聲明 SQL 語句,並且使用 Param 標籤標明參數類型,更好地描述 SQL 語句。以下是一個基本的 CRUD 操作示例:
# UserMapper.xml
<mapper namespace="com.example.mappers.UserMapper">
<select id="getUserById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="addUser" parameterType="com.example.entity.User">
INSERT INTO user(username,password,email) VALUES(#{username},#{password},#{email})
</insert>
<update id="updateUser" parameterType="com.example.entity.User">
UPDATE user SET username=#{username},password=#{password},email=#{email} WHERE id=#{id}
</update>
<delete id="deleteUserById" parameterType="java.lang.Long">
DELETE FROM user WHERE id=#{id}
</delete>
</mapper>
# UserMapper.java
public interface UserMapper {
User getUserById(Long id);
void addUser(User user);
void updateUser(User user);
void deleteUserById(Long id);
}
2、註解方式
使用註解方式進行 CRUD 操作可以減少 XML 文件的編寫,更加直觀,相比於 XML 文件方式更加靈活。以下是一個基本的 CRUD 操作示例:
# UserMapper.java
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User getUserById(Long id);
@Insert("INSERT INTO user(username,password,email) VALUES(#{username},#{password},#{email})")
void addUser(User user);
@Update("UPDATE user SET username=#{username},password=#{password},email=#{email} WHERE id=#{id}")
void updateUser(User user);
@Delete("DELETE FROM user WHERE id=#{id}")
void deleteUserById(Long id);
}
四、動態 SQL
MyBatisor 提供了動態 SQL 的支持,可以根據不同的條件構建不同的 SQL 語句,從而避免了手動拼接 SQL 語句的行為,提高了 SQL 的開發效率。以下是一個基本的動態 SQL 操作示例:
# UserMapper.xml
<mapper namespace="com.example.mappers.UserMapper">
<select id="getUserList" resultType="com.example.entity.User">
SELECT * FROM user
<if test="username != null">
WHERE username=#{username}
</if>
<if test="password != null">
AND password=#{password}
</if>
<if test="email != null">
AND email=#{email}
</if>
</select>
</mapper>
# UserMapper.java
public interface UserMapper {
List<User> getUserList(@Param("username") String username, @Param("password") String password, @Param("email") String email);
}
五、批量操作與緩存
MyBatisor 支持批量操作和緩存操作,可以大大提高 SQL 的執行效率。MyBatisor 的緩存機制主要有一級緩存和二級緩存。一級緩存是指在同一個 SqlSession 中多次查詢同一個 SQL 語句得到的結果是一樣的,因為一級緩存是基於 SQLSession 的。二級緩存是指在同一個 Mapper 映射文件中,多次查詢同一個 SQL 語句得到的結果是一樣的,因為二級緩存是基於 Mapper 映射文件的。以下是一個基本的批量操作和緩存操作示例:
# UserMapper.xml
<mapper namespace="com.example.mappers.UserMapper">
<insert id="addUserList" parameterType="java.util.List">
INSERT INTO user(username,password,email) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.username},#{item.password},#{item.email})
</foreach>
</insert>
<select id="getUserById" resultType="com.example.entity.User" cacheable="true">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
# UserMapper.java
public interface UserMapper {
void addUserList(List<User> userList);
User getUserById(Long id);
}
六、插件
MyBatisor 的插件可以在 SQL 執行過程中對 SQL 語句進行增強或者在 SQL 執行前或執行後執行一些自定義的操作。MyBatisor 的插件機制十分靈活,支持對 Executor(SQL 執行器)、StatementHandler、ParameterHandler、ResultHandler 進行增強。以下是一個基本的插件操作示例:
# ExamplePlugin.java
@Intercepts({
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),
@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
public class ExamplePlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 執行之前的邏輯
Object result = invocation.proceed();
// 執行之後的邏輯
return result;
}
}
# ExamplePlugin.java
<plugins>
<plugin interceptor="com.example.plugins.ExamplePlugin">
<!-- 配置參數 -->
</plugin>
</plugins>
七、總結
MyBatisor 是一個優秀的 ORM 框架,它和 Hibernate 相比,在 SQL 映射、靈活性、擴展性、緩存等方面更具有優勢。MyBatisor 的插件機制十分靈活,可以對 SQL 進行增強,大大擴展了 MyBatisor 的功能。MyBatisor 內部緩存機制和二級緩存機制也可以大大提高 SQL 的執行效率。通過本文的介紹,相信讀者對 MyBatisor 的使用和原理已經有了更加深入的了解。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/271594.html
微信掃一掃
支付寶掃一掃