为了账号安全,请及时绑定邮箱和手机立即绑定

MyBatis入门教程:轻松掌握数据持久化

概述

MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程和高级映射,简化了数据库操作并提高了性能。本文将详细介绍如何搭建MyBatis环境,配置数据库连接,并进行基本的CRUD操作。此外,还将探讨动态SQL的使用和MyBatis与Spring的集成。

MyBatis简介

MyBatis是什么

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

MyBatis的优点

  • 简化数据库操作:MyBatis通过XML或注解进行配置,可以将复杂的SQL语句映射成Java代码,简化了数据库操作。
  • 灵活性:MyBatis使用XML或注解来配置SQL语句,可以非常灵活地进行SQL调整和优化。
  • 支持复杂查询:MyBatis支持存储过程和动态SQL,可以非常方便地进行复杂查询。
  • 性能优越:MyBatis通过直接映射到数据库中的表,省去了繁琐的对象关系映射,提高了性能。
  • 易于学习:MyBatis的学习曲线平缓,容易上手,易于维护。
环境搭建

下载MyBatis

首先,访问MyBatis的官方GitHub仓库地址,下载MyBatis的最新版本:

https://github.com/mybatis/mybatis-3/releases

下载完成后,解压文件,就可以使用其中的jar包进行开发了。

创建项目并引入MyBatis依赖

创建一个Java项目。在项目中引入MyBatis的相关依赖。这里以Maven项目为例,通过在pom.xml文件中添加依赖配置:

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.6</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>
</dependencies>

配置数据库连接

在项目的resources目录下创建一个数据库连接配置文件db.properties,用于存储数据库连接信息:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=123456

初始化SqlSessionFactory

在Java代码中,我们需要初始化SqlSessionFactory,这可以通过读取配置文件来实现。以下是一个示例代码:

public SqlSessionFactory getSqlSessionFactory() {
    try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        return sqlSessionFactory;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}
MyBatis核心配置

mybatis-config.xml配置文件详解

MyBatis使用mybatis-config.xml作为全局配置文件,它包含数据库连接信息和设置等配置。

示例配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 配置数据库连接信息 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置映射文件的位置 -->
    <mappers>
        <mapper resource="com/example/mapping/UserMapper.xml"/>
    </mappers>
</configuration>

指定数据源和事务管理器

在配置文件中,environments标签下定义了不同的环境配置,每个环境配置包括一个transactionManager和一个dataSourcetransactionManager可以设置为JDBCMANAGEDUNMANAGEDdataSource可以设置为UNPOOLEDPOOLEDJNDI

示例代码:

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
    .build(Resources.getResourceAsReader("mybatis-config.xml"));
CRUD操作详解

创建数据表和示例数据

首先,创建一个简单的数据库表user,表结构如下:

CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    password VARCHAR(50),
    email VARCHAR(50)
);

然后,插入一些示例数据:

INSERT INTO user (username, password, email) VALUES ('john', 'password', 'john@example.com');
INSERT INTO user (username, password, email) VALUES ('jane', 'password', 'jane@example.com');

编写Mapper接口和XML映射文件

定义一个UserMapper接口,该接口映射了数据库操作方法:

public interface UserMapper {
    List<User> selectAllUsers();
    User selectUserById(int id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

然后,创建对应的XML映射文件UserMapper.xml

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectAllUsers" resultType="com.example.entity.User">
        SELECT * FROM user
    </select>
    <select id="selectUserById" resultType="com.example.entity.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <insert id="insertUser">
        INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email})
    </insert>
    <update id="updateUser">
        UPDATE user SET username=#{username}, password=#{password}, email=#{email} WHERE id=#{id}
    </update>
    <delete id="deleteUser">
        DELETE FROM user WHERE id=#{id}
    </delete>
</mapper>

执行增删改查操作

通过SqlSession对象执行数据库操作:

public class UserMapperTest {
    private SqlSessionFactory sqlSessionFactory;

    private SqlSessionFactory getSqlSessionFactory() {
        return new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
    }

    public List<User> selectAllUsers() {
        try (SqlSession session = getSqlSessionFactory().openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.selectAllUsers();
        }
    }

    public User selectUserById(int id) {
        try (SqlSession session = getSqlSessionFactory().openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.selectUserById(id);
        }
    }

    public void insertUser(User user) {
        try (SqlSession session = getSqlSessionFactory().openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            mapper.insertUser(user);
            session.commit();
        }
    }

    public void updateUser(User user) {
        try (SqlSession session = getSqlSessionFactory().openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            mapper.updateUser(user);
            session.commit();
        }
    }

    public void deleteUser(int id) {
        try (SqlSession session = getSqlSessionFactory().openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            mapper.deleteUser(id);
            session.commit();
        }
    }
}
动态SQL的使用

条件查询

MyBatis通过<if><choose><when><otherwise>等标签来实现动态SQL。

示例配置文件UserMapper.xml

<select id="selectUserByCondition" resultType="com.example.entity.User">
    SELECT * FROM user
    WHERE 1=1
    <if test="username != null">
        AND username = #{username}
    </if>
    <if test="email != null">
        AND email = #{email}
    </if>
</select>

示例代码:

public List<User> selectUserByCondition(String username, String email) {
    try (SqlSession session = getSqlSessionFactory().openSession()) {
        UserMapper mapper = session.getMapper(UserMapper.class);
        Map<String, Object> params = new HashMap<>();
        params.put("username", username);
        params.put("email", email);
        return mapper.selectUserByCondition(params);
    }
}

多表关联查询

MyBatis通过<resultMap><association>标签来实现多表关联查询。

假设我们有一个role表和user_role表,以及它们之间的关系:

CREATE TABLE role (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
);

CREATE TABLE user_role (
    user_id INT,
    role_id INT,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES user(id),
    FOREIGN KEY (role_id) REFERENCES role(id)
);

UserMapper.xml中添加多表关联查询:

<resultMap id="UserResultMap" type="com.example.entity.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="password" column="password"/>
    <result property="email" column="email"/>
    <association property="roles" javaType="java.util.List" column="id" select="selectRolesByUserId"/>
</resultMap>

<select id="selectAllUsersWithRoles" resultMap="UserResultMap">
    SELECT * FROM user
</select>

<select id="selectRolesByUserId" resultType="com.example.entity.Role">
    SELECT r.* FROM role r JOIN user_role ur ON r.id = ur.role_id WHERE ur.user_id = #{id}
</select>

示例代码:

public class UserMapperTest {
    private SqlSessionFactory sqlSessionFactory;

    public List<User> selectAllUsersWithRoles() {
        try (SqlSession session = getSqlSessionFactory().openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            return mapper.selectAllUsersWithRoles();
        }
    }
}
MyBatis与Spring集成

配置Spring集成MyBatis

在Spring项目中,可以通过配置SqlSessionFactoryBeanMapperScannerConfigurer来实现MyBatis与Spring的集成。

示例applicationContext.xml配置文件:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>

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

使用注解简化开发流程

在Spring项目中,可以通过@Mapper注解来简化Mapper接口的配置:

@Mapper
public interface UserMapper {
    List<User> selectAllUsers();
    User selectUserById(int id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);

    List<User> selectUserByCondition(@Param("username") String username, @Param("email") String email);
}

applicationContext.xml中,可以通过<context:component-scan>标签来扫描带有@Mapper注解的接口:

<context:component-scan base-package="com.example"/>

示例代码:

public class UserMapperTest {
    private ApplicationContext context;

    public UserMapperTest() {
        this.context = new ClassPathXmlApplicationContext("applicationContext.xml");
    }

    public List<User> selectAllUsers() {
        UserMapper mapper = context.getBean(UserMapper.class);
        return mapper.selectAllUsers();
    }

    public List<User> selectUserByCondition(String username, String email) {
        UserMapper mapper = context.getBean(UserMapper.class);
        return mapper.selectUserByCondition(username, email);
    }
}

通过以上步骤,您已经掌握了MyBatis的基本使用方法,包括环境搭建、核心配置、CRUD操作、动态SQL的使用以及与Spring的集成。希望本文能帮助您更好地理解和使用MyBatis框架。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消