您好,登录后才能下订单哦!
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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。