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

MyBatis入门:简单教程详解

标签:
Java 数据库

本文详细介绍了MyBatis入门所需的基本知识,包括MyBatis简介、优势、应用场景以及环境搭建。文中还涵盖了MyBatis的核心概念、基本CRUD操作、动态SQL以及结果集处理等内容,帮助读者快速上手MyBatis入门。

MyBatis入门:简单教程详解
MyBatis简介

MyBatis是什么

MyBatis是一款优秀的持久层框架,它支持定制化SQL查询,存储过程调用,以及对象关系映射。MyBatis简化了数据访问层的开发,使得开发者能够通过简单的配置文件来管理数据库交互。

MyBatis的优势和应用场景

MyBatis的优势包括:

  • 灵活的SQL映射:与Hibernate等ORM框架相比,MyBatis提供了更灵活的SQL映射机制,允许开发者直接编写原生SQL语句,以达到更高的执行效率。
  • 轻量级:MyBatis没有复杂的框架层次结构,使得其学习成本和使用成本都很低。
  • 低侵入性:MyBatis不强制要求使用特定的编程模型,可以与现有的应用程序无缝集成。
  • 与数据库无关:虽然MyBatis提供了大量的数据库支持,但其核心逻辑与特定的数据库无关,使得迁移数据库时更灵活。

应用场景包括:

  • 中小型项目:对于中小型项目,MyBatis可以提供足够的灵活性和性能。
  • 需要复杂SQL的应用:对于需要复杂SQL的应用,MyBatis提供了强大的SQL映射能力。
  • 性能敏感的应用:对于性能敏感的应用,MyBatis提供了直接操作SQL的能力,可以避免ORM带来的性能损耗。

以下是MyBatis的基本配置示例:

<!-- mybatis-config.xml 示例 -->
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_test"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
环境搭建

开发环境准备

为了使用MyBatis,你需要准备以下开发环境:

  • JDK 8或更高版本
  • IDE(如IntelliJ IDEA或Eclipse)
  • MySQL数据库
  • Maven构建工具

安装JDK

确保你已经安装了JDK,可以通过以下命令检查JDK版本:

java -version

安装Maven

确保你已经安装了Maven,并可以通过以下命令检查Maven版本:

mvn -version

安装MySQL

安装MySQL数据库,并运行以下命令来创建数据库:

CREATE DATABASE mybatis_test;

Maven项目配置

创建一个新的Maven项目,并在pom.xml文件中添加MyBatis相关的依赖:

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

src/main/resources目录下添加一个mybatis-config.xml文件,并配置数据库连接信息:

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_test"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
</configuration>
核心概念

SqlSessionFactory和SqlSession

SqlSessionFactory接口用于创建SqlSession实例,而SqlSession负责执行SQL语句、提交事务等操作。

创建SqlSessionFactory

public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            // 创建SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSession openSession() {
        return sqlSessionFactory.openSession();
    }
}

使用SqlSession执行SQL

public static void main(String[] args) {
    SqlSession session = MyBatisUtil.openSession();
    try {
        // 执行SQL
        List<User> users = session.selectList("com.example.mapper.UserMapper.selectAll");
        for (User user : users) {
            System.out.println(user);
        }
    } finally {
        session.close();
    }
}

Mapper接口和Mapper XML配置

Mapper接口用于定义数据库操作方法,而Mapper XML文件则负责实现这些方法中的具体SQL语句。

创建Mapper接口

public interface UserMapper {
    List<User> selectAll();
}

创建Mapper XML配置文件

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectAll" resultType="com.example.model.User">
        SELECT * FROM users
    </select>
</mapper>

将Mapper XML文件添加到mybatis-config.xml中:

<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
基本CRUD操作

插入数据

创建Mapper接口

public interface UserMapper {
    int insert(User user);
}

创建Mapper XML配置文件

<mapper namespace="com.example.mapper.UserMapper">
    <insert id="insert" parameterType="com.example.model.User" keyProperty="id" useGeneratedKeys="true">
        INSERT INTO users (name, email) VALUES (#{name}, #{email})
    </insert>
</mapper>

测试插入操作

public static void main(String[] args) {
    SqlSession session = MyBatisUtil.openSession();
    try {
        User user = new User();
        user.setName("John Doe");
        user.setEmail("john.doe@example.com");
        int rows = session.insert("com.example.mapper.UserMapper.insert", user);
        System.out.println("Rows inserted: " + rows);
    } finally {
        session.close();
    }
}

查询数据

创建Mapper接口

public interface UserMapper {
    User selectById(int id);
}

创建Mapper XML配置文件

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectById" resultType="com.example.model.User" parameterType="int">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

测试查询操作

public static void main(String[] args) {
    SqlSession session = MyBatisUtil.openSession();
    try {
        User user = session.selectOne("com.example.mapper.UserMapper.selectById", 1);
        System.out.println(user);
    } finally {
        session.close();
    }
}

更新数据

创建Mapper接口

public interface UserMapper {
    int update(User user);
}

创建Mapper XML配置文件

<mapper namespace="com.example.mapper.UserMapper">
    <update id="update" parameterType="com.example.model.User">
        UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
    </update>
</mapper>

测试更新操作

public static void main(String[] args) {
    SqlSession session = MyBatisUtil.openSession();
    try {
        User user = new User();
        user.setId(1);
        user.setName("Jane Doe");
        user.setEmail("jane.doe@example.com");
        int rows = session.update("com.example.mapper.UserMapper.update", user);
        System.out.println("Rows updated: " + rows);
    } finally {
        session.close();
    }
}

删除数据

创建Mapper接口

public interface UserMapper {
    int delete(int id);
}

创建Mapper XML配置文件

<mapper namespace="com.example.mapper.UserMapper">
    <delete id="delete" parameterType="int">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>

测试删除操作

public static void main(String[] args) {
    SqlSession session = MyBatisUtil.openSession();
    try {
        int rows = session.delete("com.example.mapper.UserMapper.delete", 1);
        System.out.println("Rows deleted: " + rows);
    } finally {
        session.close();
    }
}
动态SQL

if标签

if标签用于根据条件判断是否执行某个SQL片段。

创建Mapper接口

public interface UserMapper {
    List<User> selectByCondition(User user);
}

创建Mapper XML配置文件

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectByCondition" resultType="com.example.model.User" parameterType="com.example.model.User">
        SELECT * FROM users
        <where>
            <if test="name != null">
                AND name = #{name}
            </if>
            <if test="email != null">
                AND email = #{email}
            </if>
        </where>
    </select>
</mapper>

测试if标签

public static void main(String[] args) {
    SqlSession session = MyBatisUtil.openSession();
    try {
        User user = new User();
        user.setName("John Doe");
        List<User> users = session.selectList("com.example.mapper.UserMapper.selectByCondition", user);
        for (User u : users) {
            System.out.println(u);
        }
    } finally {
        session.close();
    }
}

choose标签

choose标签类似Java中的switch语句,允许选择执行多个条件之一。

创建Mapper接口

public interface UserMapper {
    List<User> selectByPriority(User user);
}

创建Mapper XML配置文件

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectByPriority" resultType="com.example.model.User" parameterType="com.example.model.User">
        SELECT * FROM users
        <where>
            <choose>
                <when test="id != null">
                    AND id = #{id}
                </when>
                <when test="name != null">
                    AND name = #{name}
                </when>
                <otherwise>
                    AND email = #{email}
                </otherwise>
            </choose>
        </where>
    </select>
</mapper>

测试choose标签

public static void main(String[] args) {
    SqlSession session = MyBatisUtil.openSession();
    try {
        User user = new User();
        user.setName("John Doe");
        List<User> users = session.selectList("com.example.mapper.UserMapper.selectByPriority", user);
        for (User u : users) {
            System.out.println(u);
        }
    } finally {
        session.close();
    }
}

foreach标签

foreach标签用于遍历集合或数组。

创建Mapper接口

public interface UserMapper {
    List<User> selectByIds(String[] ids);
}

创建Mapper XML配置文件

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectByIds" resultType="com.example.model.User" parameterType="string[]">
        SELECT * FROM users
        WHERE id IN
        <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>
</mapper>

测试foreach标签

public static void main(String[] args) {
    SqlSession session = MyBatisUtil.openSession();
    try {
        String[] ids = {"1", "2", "3"};
        List<User> users = session.selectList("com.example.mapper.UserMapper.selectByIds", ids);
        for (User u : users) {
            System.out.println(u);
        }
    } finally {
        session.close();
    }
}
结果集处理

单一结果映射

单一结果映射通常用于映射单个字段或单个实体。

创建Mapper接口

public interface UserMapper {
    User selectById(int id);
}

创建Mapper XML配置文件

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectById" resultType="com.example.model.User" parameterType="int">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

复杂结果映射(嵌套查询)

复杂结果映射用于处理嵌套查询,如一对多关联关系。

创建Mapper接口

public interface UserMapper {
    User selectUserWithPosts(int userId);
}

创建Mapper XML配置文件

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserWithPosts" resultType="com.example.model.User" parameterType="int">
        SELECT u.id, u.name, u.email, p.id as postId, p.title, p.content
        FROM users u
        LEFT JOIN posts p ON u.id = p.user_id
        WHERE u.id = #{userId}
    </select>
</mapper>

创建User实体

public class User {
    private int id;
    private String name;
    private String email;
    private List<Post> posts;

    // getters and setters
}

public class Post {
    private int id;
    private String title;
    private String content;

    // getters and setters
}

测试复杂结果映射

public static void main(String[] args) {
    SqlSession session = MyBatisUtil.openSession();
    try {
        User user = session.selectOne("com.example.mapper.UserMapper.selectUserWithPosts", 1);
        System.out.println(user);
        for (Post post : user.getPosts()) {
            System.out.println(post);
        }
    } finally {
        session.close();
    }
}

通过以上示例,你可以看到MyBatis在处理基本CRUD操作、动态SQL以及复杂结果映射时的灵活性和强大能力。希望这篇教程能帮助你更好地理解和使用MyBatis。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消