一、介紹
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-tw/n/271594.html