一、介绍
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