一、介绍
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/n/271594.html
微信扫一扫
支付宝扫一扫