MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
MyBatis 的前身是 iBATIS,iBATIS 是一个基于 Java 的持久层框架,后来被 Apache 软件基金会接管并更名为 MyBatis。MyBatis 的设计目标是简化数据库操作,提高开发效率。
MyBatis 的核心组件包括以下几个部分:
SqlSessionFactoryBuilder
是 MyBatis 的核心构建器,它通过读取配置文件或 Java 代码来构建 SqlSessionFactory
实例。SqlSessionFactoryBuilder
的主要作用是解析配置文件并生成 SqlSessionFactory
。
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory
是 MyBatis 的核心工厂类,它负责创建 SqlSession
实例。SqlSessionFactory
是线程安全的,通常在应用程序的生命周期中只需要一个实例。
SqlSession session = sqlSessionFactory.openSession();
SqlSession
是 MyBatis 的核心会话类,它提供了执行 SQL 命令、获取映射器和管理事务的方法。SqlSession
是线程不安全的,因此每次使用后都应该关闭。
try { User user = session.selectOne("org.mybatis.example.UserMapper.selectUser", 1); } finally { session.close(); }
Mapper
是 MyBatis 的核心映射接口,它定义了 SQL 映射的方法。Mapper
接口可以通过注解或 XML 文件来定义 SQL 映射。
public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User selectUser(int id); }
MyBatis 的配置主要包括两个部分:全局配置文件和映射文件。
全局配置文件通常命名为 mybatis-config.xml
,它包含了 MyBatis 的全局配置信息,如数据库连接、事务管理、类型别名、插件等。
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/UserMapper.xml"/> </mappers> </configuration>
映射文件通常命名为 UserMapper.xml
,它包含了 SQL 映射的定义。映射文件可以定义 SQL 语句、参数映射、结果映射等。
<mapper namespace="org.mybatis.example.UserMapper"> <select id="selectUser" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> </mapper>
MyBatis 的映射文件是定义 SQL 映射的核心文件,它包含了 SQL 语句、参数映射、结果映射等信息。
MyBatis 支持多种 SQL 语句,包括 select
、insert
、update
、delete
等。
<select id="selectUser" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> <insert id="insertUser" parameterType="User"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> <update id="updateUser" parameterType="User"> UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id} </update> <delete id="deleteUser" parameterType="int"> DELETE FROM user WHERE id = #{id} </delete>
MyBatis 支持多种参数映射方式,包括简单类型、JavaBean、Map 等。
<select id="selectUser" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> <insert id="insertUser" parameterType="User"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert>
MyBatis 支持多种结果映射方式,包括简单类型、JavaBean、Map 等。
<select id="selectUser" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> <select id="selectAllUsers" resultType="User"> SELECT * FROM user </select>
MyBatis 提供了丰富的 API 来执行 CRUD(创建、读取、更新、删除)操作。
User user = new User(); user.setName("John"); user.setAge(25); session.insert("org.mybatis.example.UserMapper.insertUser", user); session.commit();
User user = session.selectOne("org.mybatis.example.UserMapper.selectUser", 1);
User user = new User(); user.setId(1); user.setName("John Doe"); user.setAge(30); session.update("org.mybatis.example.UserMapper.updateUser", user); session.commit();
session.delete("org.mybatis.example.UserMapper.deleteUser", 1); session.commit();
MyBatis 提供了强大的动态 SQL 功能,可以根据条件动态生成 SQL 语句。
<select id="selectUser" resultType="User"> SELECT * FROM user <where> <if test="id != null"> AND id = #{id} </if> <if test="name != null"> AND name = #{name} </if> </where> </select>
<select id="selectUser" resultType="User"> SELECT * FROM user <where> <choose> <when test="id != null"> AND id = #{id} </when> <when test="name != null"> AND name = #{name} </when> <otherwise> AND age = #{age} </otherwise> </choose> </where> </select>
<select id="selectUsersByIds" resultType="User"> SELECT * FROM user WHERE id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </select>
MyBatis 支持多种关联查询方式,包括一对一、一对多、多对一、多对多等。
<resultMap id="userResultMap" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> <association property="address" javaType="Address"> <id property="id" column="address_id"/> <result property="street" column="street"/> <result property="city" column="city"/> </association> </resultMap> <select id="selectUserWithAddress" resultMap="userResultMap"> SELECT u.*, a.* FROM user u LEFT JOIN address a ON u.address_id = a.id WHERE u.id = #{id} </select>
<resultMap id="userResultMap" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> <collection property="orders" ofType="Order"> <id property="id" column="order_id"/> <result property="orderNumber" column="order_number"/> <result property="orderDate" column="order_date"/> </collection> </resultMap> <select id="selectUserWithOrders" resultMap="userResultMap"> SELECT u.*, o.* FROM user u LEFT JOIN orders o ON u.id = o.user_id WHERE u.id = #{id} </select>
MyBatis 提供了两级缓存机制:一级缓存和二级缓存。
一级缓存是 SqlSession
级别的缓存,默认是开启的。一级缓存的作用域是 SqlSession
,当 SqlSession
关闭时,一级缓存也会被清空。
SqlSession session = sqlSessionFactory.openSession(); User user1 = session.selectOne("org.mybatis.example.UserMapper.selectUser", 1); User user2 = session.selectOne("org.mybatis.example.UserMapper.selectUser", 1); session.close();
二级缓存是 Mapper
级别的缓存,默认是关闭的。二级缓存的作用域是 Mapper
,当 SqlSession
关闭时,二级缓存不会清空。
<cache/>
MyBatis 提供了插件机制,可以通过插件来扩展 MyBatis 的功能。MyBatis 的插件是基于拦截器实现的,可以拦截 Executor
、StatementHandler
、ParameterHandler
、ResultSetHandler
等组件的执行过程。
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})}) public class ExamplePlugin implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 在方法执行前做一些处理 Object result = invocation.proceed(); // 在方法执行后做一些处理 return result; } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { // 设置插件属性 } }
MyBatis 可以与多种框架进行整合,如 Spring、Spring Boot、Spring MVC 等。
MyBatis 与 Spring 的整合可以通过 MyBatis-Spring
模块来实现。MyBatis-Spring
提供了 SqlSessionFactoryBean
、MapperFactoryBean
等类来简化 MyBatis 的配置。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath*:org/mybatis/example/*Mapper.xml"/> </bean> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="org.mybatis.example.UserMapper"/> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
MyBatis 与 Spring Boot 的整合可以通过 mybatis-spring-boot-starter
模块来实现。mybatis-spring-boot-starter
提供了自动配置功能,简化了 MyBatis 的配置。
mybatis: mapper-locations: classpath*:org/mybatis/example/*Mapper.xml type-aliases-package: org.mybatis.example
@Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User selectUser(int id); }
MyBatis 是一个功能强大且灵活的持久层框架,它通过简单的配置和映射文件,可以轻松地实现数据库操作。MyBatis 提供了丰富的 API 和功能,如动态 SQL、关联查询、缓存机制、插件等,可以满足各种复杂的业务需求。通过合理的使用和配置,MyBatis 可以大大提高开发效率和系统性能。
希望本文能够帮助你更好地理解和使用 MyBatis,在实际项目中发挥其强大的功能。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。