基于MyBatis的数据持久化框架如何使用

发布时间:2022-08-17 10:26:34 作者:iii
来源:亿速云 阅读:187

基于MyBatis的数据持久化框架如何使用

目录

  1. 引言
  2. MyBatis简介
  3. MyBatis的核心组件
  4. MyBatis的配置
  5. MyBatis的映射文件
  6. MyBatis的SQL语句
  7. MyBatis的注解
  8. MyBatis的动态SQL
  9. MyBatis的事务管理
  10. MyBatis的缓存机制
  11. MyBatis的插件
  12. MyBatis的集成
  13. MyBatis的性能优化
  14. MyBatis的常见问题与解决方案
  15. 总结

引言

在现代软件开发中,数据持久化是一个至关重要的环节。数据持久化框架的选择直接影响到应用程序的性能、可维护性和扩展性。MyBatis优秀的半自动化ORM(对象关系映射)框架,因其灵活性和易用性而广受开发者欢迎。本文将详细介绍如何使用MyBatis进行数据持久化操作,涵盖从基础配置到高级特性的各个方面。

MyBatis简介

MyBatis是一个基于Java的持久化框架,它通过XML或注解的方式将Java对象与数据库中的记录进行映射。MyBatis的核心思想是将SQL语句与Java代码分离,使得开发者可以专注于SQL语句的编写,而不必关心底层的JDBC操作。

MyBatis的特点

MyBatis的核心组件

MyBatis的核心组件包括:

SqlSessionFactory

SqlSessionFactory是MyBatis的核心接口之一,它负责创建SqlSession对象。通常情况下,SqlSessionFactory是通过SqlSessionFactoryBuilder从XML配置文件或Java代码中构建的。

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

SqlSession

SqlSession是MyBatis的核心接口之一,它提供了执行SQL语句、获取Mapper接口实例、管理事务等方法。SqlSession的生命周期通常与一个数据库会话绑定,使用完毕后需要及时关闭。

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUserById(1);
    System.out.println(user);
}

Mapper

Mapper是MyBatis中用于定义SQL语句的接口或XML文件。通过Mapper,开发者可以将SQL语句与Java方法进行映射,从而简化数据库操作。

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

Configuration

Configuration是MyBatis的全局配置类,它包含了MyBatis的所有配置信息,如数据源、事务管理器、映射文件等。Configuration对象通常由SqlSessionFactoryBuilder从XML配置文件或Java代码中构建。

<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="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

MyBatis的配置

MyBatis的配置主要包括全局配置和映射配置两部分。全局配置用于配置MyBatis的核心组件,如数据源、事务管理器等;映射配置用于配置SQL语句与Java方法的映射关系。

全局配置

MyBatis的全局配置通常通过XML文件进行配置,主要包括以下内容:

<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="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

映射配置

MyBatis的映射配置可以通过XML文件或注解进行配置。XML文件通常用于配置复杂的SQL语句,而注解则用于配置简单的SQL语句。

XML映射配置

XML映射配置文件通常包含以下内容:

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserById" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
    <insert id="insertUser" parameterType="com.example.model.User">
        INSERT INTO users (name, age) VALUES (#{name}, #{age})
    </insert>
    <update id="updateUser" parameterType="com.example.model.User">
        UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>

注解映射配置

MyBatis支持通过注解配置SQL语句,常用的注解包括:

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

    @Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
    void insertUser(User user);

    @Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
    void updateUser(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(int id);
}

MyBatis的SQL语句

MyBatis支持多种类型的SQL语句,包括查询、插入、更新和删除。通过MyBatis,开发者可以灵活地编写SQL语句,并将其与Java方法进行映射。

查询语句

查询语句是MyBatis中最常用的SQL语句类型。MyBatis支持通过<select>标签或@Select注解定义查询语句。

XML配置

<select id="selectUserById" resultType="com.example.model.User">
    SELECT * FROM users WHERE id = #{id}
</select>

注解配置

@Select("SELECT * FROM users WHERE id = #{id}")
User selectUserById(int id);

插入语句

插入语句用于向数据库中插入新记录。MyBatis支持通过<insert>标签或@Insert注解定义插入语句。

XML配置

<insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>

注解配置

@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
void insertUser(User user);

更新语句

更新语句用于更新数据库中的记录。MyBatis支持通过<update>标签或@Update注解定义更新语句。

XML配置

<update id="updateUser" parameterType="com.example.model.User">
    UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
</update>

注解配置

@Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
void updateUser(User user);

删除语句

删除语句用于从数据库中删除记录。MyBatis支持通过<delete>标签或@Delete注解定义删除语句。

XML配置

<delete id="deleteUser" parameterType="int">
    DELETE FROM users WHERE id = #{id}
</delete>

注解配置

@Delete("DELETE FROM users WHERE id = #{id}")
void deleteUser(int id);

MyBatis的注解

MyBatis支持通过注解配置SQL语句,常用的注解包括@Select@Insert@Update@Delete等。通过注解,开发者可以简化SQL语句的配置,提高代码的可读性。

@Select

@Select注解用于定义查询语句。

@Select("SELECT * FROM users WHERE id = #{id}")
User selectUserById(int id);

@Insert

@Insert注解用于定义插入语句。

@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
void insertUser(User user);

@Update

@Update注解用于定义更新语句。

@Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
void updateUser(User user);

@Delete

@Delete注解用于定义删除语句。

@Delete("DELETE FROM users WHERE id = #{id}")
void deleteUser(int id);

@Results

@Results注解用于定义结果映射。

@Results({
    @Result(property = "id", column = "id"),
    @Result(property = "name", column = "name"),
    @Result(property = "age", column = "age")
})
@Select("SELECT * FROM users WHERE id = #{id}")
User selectUserById(int id);

@Param

@Param注解用于指定参数名称。

@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
User selectUserByNameAndAge(@Param("name") String name, @Param("age") int age);

MyBatis的动态SQL

MyBatis提供了强大的动态SQL功能,允许开发者根据条件动态生成SQL语句。动态SQL主要通过<if><choose><when><otherwise><trim><where><set><foreach>等标签实现。

<if>标签用于根据条件判断是否包含某段SQL语句。

<select id="selectUserByCondition" resultType="com.example.model.User">
    SELECT * FROM users
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>

<choose>标签用于实现多条件选择,类似于Java中的switch语句。

<select id="selectUserByCondition" resultType="com.example.model.User">
    SELECT * FROM users
    <where>
        <choose>
            <when test="name != null">
                AND name = #{name}
            </when>
            <when test="age != null">
                AND age = #{age}
            </when>
            <otherwise>
                AND 1=1
            </otherwise>
        </choose>
    </where>
</select>

<trim>标签用于去除SQL语句中的多余字符,如ANDOR等。

<select id="selectUserByCondition" resultType="com.example.model.User">
    SELECT * FROM users
    <trim prefix="WHERE" prefixOverrides="AND |OR ">
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </trim>
</select>

<where>标签用于生成WHERE子句,并自动去除多余的ANDOR

<select id="selectUserByCondition" resultType="com.example.model.User">
    SELECT * FROM users
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>

<set>标签用于生成SET子句,并自动去除多余的逗号。

<update id="updateUser" parameterType="com.example.model.User">
    UPDATE users
    <set>
        <if test="name != null">
            name = #{name},
        </if>
        <if test="age != null">
            age = #{age},
        </if>
    </set>
    WHERE id = #{id}
</update>

<foreach>标签用于遍历集合,并生成相应的SQL语句。

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

MyBatis的事务管理

MyBatis支持两种事务管理方式:JDBC和MANAGED。JDBC事务管理方式由MyBatis自身管理事务,而MANAGED事务管理方式则由外部容器(如Spring)管理事务。

JDBC事务管理

JDBC事务管理方式由MyBatis自身管理事务,开发者可以通过SqlSessioncommitrollback方法手动提交或回滚事务。

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = new User();
    user.setName("John");
    user.setAge(25);
    mapper.insertUser(user);
    session.commit();
} catch (Exception e) {
    session.rollback();
    e.printStackTrace();
}

MANAGED事务管理

MANAGED事务管理方式由外部容器(如Spring)管理事务,开发者无需手动提交或回滚事务。

<transactionManager type="MANAGED"/>

MyBatis的缓存机制

MyBatis提供了两级缓存机制:一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,二级缓存是Mapper级别的缓存。

一级缓存

一级缓存是SqlSession级别的缓存,默认开启。一级缓存的作用范围是同一个SqlSession,当SqlSession关闭时,一级缓存也会被清空。

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user1 = mapper.selectUserById(1);
    User user2 = mapper.selectUserById(1);
    System.out.println(user1 == user2); // true
}

二级缓存

二级缓存是Mapper级别的缓存,默认关闭。二级缓存的作用范围是同一个Mapper,当SqlSession关闭时,二级缓存不会立即清空。

<cache/>
@CacheNamespace
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectUserById(int id);
}

MyBatis的插件

MyBatis支持插件机制,开发者可以通过插件扩展MyBatis的功能。MyBatis的插件通过实现Interceptor接口来实现。

自定义插件

@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class MyPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("Before update");
        Object result = invocation.proceed();
        System.out.println("After update");
        return result;
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }
}

注册插件

<plugins>
    <plugin interceptor="com.example.plugin.MyPlugin"/>
</plugins>

MyBatis的集成

MyBatis可以与多种框架集成,如Spring、Spring Boot等。通过集成,开发者可以简化MyBatis的配置和使用。

集成Spring

MyBatis与Spring的集成主要通过SqlSessionFactoryBeanMapperScannerConfigurer实现。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath*:com/example/mapper/*.xml"/>
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
</bean>

集成Spring Boot

MyBatis与Spring Boot的集成主要通过mybatis-spring-boot-starter实现。

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>

”`java @Mapper public interface UserMapper { @Select(“SELECT * FROM users WHERE id

推荐阅读:
  1. mybatis入门一:mybatis框架原理
  2. Mybatis框架(一)初识Mybatis框架

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

mybatis

上一篇:怎么使用Redis的共享session实现短信登录

下一篇:linux定时执行php启动任务脚本怎么写

相关阅读

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

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