mybatis怎么使用

发布时间:2021-12-30 09:44:28 作者:小新
来源:亿速云 阅读:176

MyBatis怎么使用

目录

  1. MyBatis简介
  2. MyBatis的核心组件
  3. MyBatis的配置
  4. MyBatis的映射文件
  5. MyBatis的CRUD操作
  6. MyBatis的动态SQL
  7. MyBatis的关联查询
  8. MyBatis的缓存机制
  9. MyBatis的插件
  10. MyBatis的整合
  11. MyBatis的最佳实践
  12. 总结

MyBatis简介

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

MyBatis 的前身是 iBATIS,iBATIS 是一个基于 Java 的持久层框架,后来被 Apache 软件基金会接管并更名为 MyBatis。MyBatis 的设计目标是简化数据库操作,提高开发效率。

MyBatis的核心组件

MyBatis 的核心组件包括以下几个部分:

  1. SqlSessionFactoryBuilder:用于创建 SqlSessionFactory 的构建器。
  2. SqlSessionFactory:用于创建 SqlSession 的工厂类。
  3. SqlSession:用于执行 SQL 命令、获取映射器和管理事务的会话。
  4. Mapper:用于定义 SQL 映射的接口。

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 是 MyBatis 的核心构建器,它通过读取配置文件或 Java 代码来构建 SqlSessionFactory 实例。SqlSessionFactoryBuilder 的主要作用是解析配置文件并生成 SqlSessionFactory

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactory

SqlSessionFactory 是 MyBatis 的核心工厂类,它负责创建 SqlSession 实例。SqlSessionFactory 是线程安全的,通常在应用程序的生命周期中只需要一个实例。

SqlSession session = sqlSessionFactory.openSession();

SqlSession

SqlSession 是 MyBatis 的核心会话类,它提供了执行 SQL 命令、获取映射器和管理事务的方法。SqlSession 是线程不安全的,因此每次使用后都应该关闭。

try {
    User user = session.selectOne("org.mybatis.example.UserMapper.selectUser", 1);
} finally {
    session.close();
}

Mapper

Mapper 是 MyBatis 的核心映射接口,它定义了 SQL 映射的方法。Mapper 接口可以通过注解或 XML 文件来定义 SQL 映射。

public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectUser(int id);
}

MyBatis的配置

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的映射文件

MyBatis 的映射文件是定义 SQL 映射的核心文件,它包含了 SQL 语句、参数映射、结果映射等信息。

SQL 语句

MyBatis 支持多种 SQL 语句,包括 selectinsertupdatedelete 等。

<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的CRUD操作

MyBatis 提供了丰富的 API 来执行 CRUD(创建、读取、更新、删除)操作。

创建(Create)

User user = new User();
user.setName("John");
user.setAge(25);

session.insert("org.mybatis.example.UserMapper.insertUser", user);
session.commit();

读取(Read)

User user = session.selectOne("org.mybatis.example.UserMapper.selectUser", 1);

更新(Update)

User user = new User();
user.setId(1);
user.setName("John Doe");
user.setAge(30);

session.update("org.mybatis.example.UserMapper.updateUser", user);
session.commit();

删除(Delete)

session.delete("org.mybatis.example.UserMapper.deleteUser", 1);
session.commit();

MyBatis的动态SQL

MyBatis 提供了强大的动态 SQL 功能,可以根据条件动态生成 SQL 语句。

if 语句

<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>

choose 语句

<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>

foreach 语句

<select id="selectUsersByIds" resultType="User">
    SELECT * FROM user
    WHERE id IN
    <foreach collection="ids" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

MyBatis的关联查询

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的缓存机制

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 的功能。MyBatis 的插件是基于拦截器实现的,可以拦截 ExecutorStatementHandlerParameterHandlerResultSetHandler 等组件的执行过程。

@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的整合

MyBatis 可以与多种框架进行整合,如 Spring、Spring Boot、Spring MVC 等。

与 Spring 整合

MyBatis 与 Spring 的整合可以通过 MyBatis-Spring 模块来实现。MyBatis-Spring 提供了 SqlSessionFactoryBeanMapperFactoryBean 等类来简化 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>

与 Spring Boot 整合

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的最佳实践

  1. 使用 Mapper 接口:尽量使用 Mapper 接口来定义 SQL 映射,而不是直接在 XML 文件中定义 SQL 语句。
  2. 使用注解:对于简单的 SQL 语句,可以使用注解来定义 SQL 映射,减少 XML 文件的复杂度。
  3. 使用动态 SQL:对于复杂的查询条件,可以使用动态 SQL 来生成 SQL 语句,提高代码的可读性和可维护性。
  4. 使用缓存:合理使用 MyBatis 的缓存机制,提高查询性能。
  5. 使用插件:通过插件来扩展 MyBatis 的功能,满足特定的业务需求。

总结

MyBatis 是一个功能强大且灵活的持久层框架,它通过简单的配置和映射文件,可以轻松地实现数据库操作。MyBatis 提供了丰富的 API 和功能,如动态 SQL、关联查询、缓存机制、插件等,可以满足各种复杂的业务需求。通过合理的使用和配置,MyBatis 可以大大提高开发效率和系统性能。

希望本文能够帮助你更好地理解和使用 MyBatis,在实际项目中发挥其强大的功能。

推荐阅读:
  1. spring-mybatis与原生mybatis使用对比
  2. mybatis使用selectByPrimaryKey出错

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mybatis

上一篇:SpringBoot整合netty怎么实现前后端数据的交互

下一篇:怎么进行Exchange Server 提权漏洞的预警

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》