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

MyBatis资料入门教程

标签:
Java SSM 数据库
概述

MyBatis是一款优秀的持久层框架,支持定制化SQL、存储过程及高级映射,简化了Java应用与数据库之间的交互。本文详细介绍了MyBatis的基本概念、配置方法及常用标签,并提供了丰富的示例代码和调试技巧。这里包含了全面的MyBatis资料,帮助开发者更深入地理解和使用MyBatis。

MyBatis简介

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

MyBatis是什么

MyBatis是一个开源的持久层框架。它的前身是iBatis,是由中国程序员陈大年开发并开源的。MyBatis通过XML或注解的方式将Java方法和SQL语句映射起来,使得Java对象能够直接操作数据库。MyBatis简化了Java应用与数据库之间的交互,使得开发人员可以更专注于业务逻辑的实现,而不是繁琐的数据库操作。

MyBatis的优点
  1. 简化SQL操作:MyBatis将SQL语句的编写和Java代码的执行分离,使得SQL语句的编写更加灵活和方便。
  2. 支持存储过程:MyBatis支持存储过程的调用,适用于复杂的数据库操作。
  3. 支持自定义SQL:MyBatis允许开发人员编写自定义SQL语句,以适应各种复杂的数据库操作。
  4. 支持高级映射:MyBatis支持一对多、多对多等复杂关系的映射,使得数据库操作更加灵活。
  5. 轻量级框架:MyBatis相较于其他持久层框架(如Hibernate)更加轻量级,易于使用和集成。
MyBatis与Hibernate的区别
  • SQL映射方式:MyBatis使用XML或注解的方式来映射SQL语句,而Hibernate使用对象-关系映射(ORM)的方式来映射数据库。
  • 灵活性:MyBatis的SQL语句是显式的,可以手动编写复杂SQL,而Hibernate的SQL语句是隐式的,由框架自动生成。
  • 性能:MyBatis通常比Hibernate性能更高,因为MyBatis避免了对象-关系映射(ORM)的开销。
  • 配置:MyBatis的配置相对简单,而Hibernate的配置较为复杂。
MyBatis环境搭建
下载MyBatis并配置环境

首先,你需要从MyBatis官网下载最新版本的MyBatis,并将其添加到你的项目中。以下是下载和配置环境的步骤:

  1. 下载MyBatis:前往MyBatis官网下载最新版本的MyBatis。
  2. 添加依赖:在你的项目中添加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.25</version>
    </dependency>
</dependencies>
  1. 配置MyBatis:在项目的resources目录下创建mybatis-config.xml文件,配置MyBatis的核心配置。
<?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>
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="jdbcTypeForNull" value="OTHER"/>
    </settings>
    <typeAliases>
        <typeAlias type="com.example.demo.model.User" alias="User"/>
    </typeAliases>
    <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/mydatabase"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/demo/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
创建数据库和表

接下来,你需要在数据库中创建所需的表。例如,假设我们需要创建一个名为User的表,可以使用以下SQL语句:

CREATE TABLE `User` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL,
  `password` VARCHAR(50) NOT NULL,
  `email` VARCHAR(50),
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8;
配置MyBatis全局配置文件

resources目录下创建mybatis-config.xml文件,用于配置MyBatis的全局配置。以下是一个示例配置:

<?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>
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="jdbcTypeForNull" value="OTHER"/>
    </settings>
    <typeAliases>
        <typeAlias type="com.example.demo.model.User" alias="User"/>
    </typeAliases>
    <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/mydatabase"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/demo/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
MyBatis核心概念
SQL映射文件

SQL映射文件是MyBatis中最核心的部分,它定义了如何将Java方法和SQL语句映射起来。映射文件通常以.xml格式定义,包含一系列的SQL语句和映射规则。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="selectUser" resultType="com.example.demo.model.User">
        SELECT id, username, password, email, create_time, update_time
        FROM User
        WHERE id = #{id}
    </select>
</mapper>
映射元素

MyBatis定义了一些元素来映射SQL语句和Java方法。最常见的映射元素包括selectinsertupdatedelete

select

<select>元素用于映射查询操作。它包含一个id属性,用于指定该映射在Mapper接口中的方法名。resultType属性用于指定查询结果的Java类型。

<select id="selectUser" resultType="com.example.demo.model.User">
    SELECT id, username, password, email, create_time, update_time
    FROM User
    WHERE id = #{id}
</select>

insert

<insert>元素用于映射插入操作。它包含一个id属性,用于指定该映射在Mapper接口中的方法名。

<insert id="insertUser" parameterType="com.example.demo.model.User">
    INSERT INTO User (username, password, email)
    VALUES (#{username}, #{password}, #{email})
</insert>

update

<update>元素用于映射更新操作。它包含一个id属性,用于指定该映射在Mapper接口中的方法名。

<update id="updateUser" parameterType="com.example.demo.model.User">
    UPDATE User
    SET username = #{username}, password = #{password}, email = #{email}
    WHERE id = #{id}
</update>

delete

<delete>元素用于映射删除操作。它包含一个id属性,用于指定该映射在Mapper接口中的方法名。

<delete id="deleteUser" parameterType="int">
    DELETE FROM User WHERE id = #{id}
</delete>
元素详解

resultMap

<resultMap>元素用于定义一个结果映射,它将数据库中的列映射到Java对象的属性。resultMap通常用于复杂的映射关系。

<resultMap id="UserResult" type="com.example.demo.model.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="password" column="password"/>
    <result property="email" column="email"/>
    <result property="createTime" column="create_time"/>
    <result property="updateTime" column="update_time"/>
</resultMap>

parameterType

parameterType属性用于指定传入参数的Java类型。它可以是一个具体的类型,也可以是一个类型别名。

<select id="selectUser" resultType="com.example.demo.model.User" parameterType="int">
    SELECT id, username, password, email, create_time, update_time
    FROM User
    WHERE id = #{id}
</select>

resultType

resultType属性用于指定查询结果的Java类型。它可以是一个具体的类型,也可以是一个类型别名。

<select id="selectUser" resultType="com.example.demo.model.User">
    SELECT id, username, password, email, create_time, update_time
    FROM User
    WHERE id = #{id}
</select>
MyBatis常用标签详解
foreach循环标签

<foreach>标签用于遍历集合或数组。它通常用于构建动态SQL语句,例如生成多个IN子句。

<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
    #{item}
</foreach>

示例代码

假设我们有一个用户列表,想要插入多个用户,可以使用foreach标签来动态生成SQL语句。

List<User> users = new ArrayList<>();
users.add(new User(1, "user1", "password1", "user1@example.com"));
users.add(new User(2, "user2", "password2", "user2@example.com"));

SqlSession session = MyBatisUtil.getSqlSession();
for (User user : users) {
    session.insert("com.example.demo.mapper.UserMapper.insertUser", user);
}
session.commit();
session.close();
<insert id="insertUsers" parameterType="java.util.List">
    INSERT INTO User (id, username, password, email)
    VALUES
    <foreach item="user" index="index" collection="list" open="(" separator="), (" close=")">
        #{user.id}, #{user.username}, #{user.password}, #{user.email}
    </foreach>
</insert>
if条件标签

<if>标签用于条件判断。它可以根据传入的参数动态生成SQL语句。

<if test="username != null">
    AND username = #{username}
</if>

示例代码

假设我们有一个查询用户的方法,可以根据用户名或邮箱进行查询。

User user = new User();
user.setUsername("user1");
SqlSession session = MyBatisUtil.getSqlSession();
List<User> result = session.selectList("com.example.demo.mapper.UserMapper.selectUser", user);
session.close();
<select id="selectUser" resultType="com.example.demo.model.User" parameterType="com.example.demo.model.User">
    SELECT id, username, password, email, create_time, update_time
    FROM User
    WHERE 1 = 1
    <if test="username != null">
        AND username = #{username}
    </if>
    <if test="email != null">
        AND email = #{email}
    </if>
</select>
choose、when、otherwise选择标签

<choose><when><otherwise>标签用于多条件选择。它们可以根据多个条件选择一个最合适的SQL语句。

<choose>
    <when test="username != null">
        AND username = #{username}
    </when>
    <when test="email != null">
        AND email = #{email}
    </when>
    <otherwise>
        AND id = #{id}
    </otherwise>
</choose>

示例代码

假设我们有一个查询用户的方法,可以根据用户名、邮箱或ID进行查询。

User user = new User();
user.setUsername("user1");
SqlSession session = MyBatisUtil.getSqlSession();
List<User> result = session.selectList("com.example.demo.mapper.UserMapper.selectUser", user);
session.close();
<select id="selectUser" resultType="com.example.demo.model.User" parameterType="com.example.demo.model.User">
    SELECT id, username, password, email, create_time, update_time
    FROM User
    WHERE 1 = 1
    <choose>
        <when test="username != null">
            AND username = #{username}
        </when>
        <when test="email != null">
            AND email = #{email}
        </when>
        <otherwise>
            AND id = #{id}
        </otherwise>
    </choose>
</select>
MyBatis映射器与接口的使用
创建Mapper接口

Mapper接口定义了数据库操作的方法。MyBatis会根据Mapper接口的方法名和注解,自动生成相应的SQL映射文件。

public interface UserMapper {
    User selectUser(int id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

示例代码

public interface UserMapper {
    @Select("SELECT id, username, password, email, create_time, update_time FROM User WHERE id = #{id}")
    User selectUser(int id);

    @Insert("INSERT INTO User (username, password, email) VALUES (#{username}, #{password}, #{email})")
    void insertUser(User user);

    @Update("UPDATE User SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);

    @Delete("DELETE FROM User WHERE id = #{id}")
    void deleteUser(int id);
}
创建映射文件

映射文件用于定义SQL语句和映射规则。通常以.xml格式定义。

<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="selectUser" resultType="com.example.demo.model.User" parameterType="int">
        SELECT id, username, password, email, create_time, update_time
        FROM User
        WHERE id = #{id}
    </select>

    <insert id="insertUser" parameterType="com.example.demo.model.User">
        INSERT INTO User (username, password, email)
        VALUES (#{username}, #{password}, #{email})
    </insert>

    <update id="updateUser" parameterType="com.example.demo.model.User">
        UPDATE User
        SET username = #{username}, password = #{password}, email = #{email}
        WHERE id = #{id}
    </update>

    <delete id="deleteUser" parameterType="int">
        DELETE FROM User WHERE id = #{id}
    </delete>
</mapper>
在Spring中使用Mapper接口

如果你使用Spring框架,可以通过Spring Data MyBatis来使用Mapper接口。首先,需要在Spring配置文件中配置MyBatis的Mapper接口。

示例代码

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

<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.demo.mapper"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}
public class UserService {
    private SqlSession sqlSession = MyBatisUtil.getSqlSession();
    private UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    public User getUserById(int id) {
        return userMapper.selectUser(id);
    }

    public void addUser(User user) {
        userMapper.insertUser(user);
    }

    public void updateUser(User user) {
        userMapper.updateUser(user);
    }

    public void deleteUser(int id) {
        userMapper.deleteUser(id);
    }
}
MyBatis调试与维护
日志配置

MyBatis支持多种日志框架,如SLF4J、Log4j等。你可以在mybatis-config.xml文件中配置日志框架。

<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

示例代码

<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

日志输出

通过配置日志框架,可以输出详细的日志信息。日志信息包括SQL语句、参数值等,有助于排查SQL执行的问题。

SqlSession sqlSession = MyBatisUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

try {
    User user = userMapper.selectUser(1);
    System.out.println(user);
} catch (Exception e) {
    e.printStackTrace();
}
问题排查与解决

MyBatis提供了多种工具和方法来帮助你排查和解决问题。以下是一些常用的调试和维护技巧:

单元测试

编写单元测试可以帮助你验证SQL映射文件的正确性。你可以使用JUnit等单元测试框架来编写测试用例。

@Test
public void testSelectUser() {
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    User user = userMapper.selectUser(1);
    assertNotNull(user);
    sqlSession.close();
}

数据库工具

使用数据库客户端工具(如MySQL Workbench、Navicat等)来查看和调试数据库操作。这些工具可以帮助你查看执行的SQL语句和结果集。

MyBatis的API

MyBatis提供了一些API来帮助你调试和维护。例如,可以通过SqlSession对象获取执行的SQL语句和参数值。

public class UserService {
    private SqlSession sqlSession = MyBatisUtil.getSqlSession();
    private UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    public User getUserById(int id) {
        try {
            User user = userMapper.selectUser(id);
            System.out.println(user);
            return user;
        } catch (Exception e) {
            e.printStackTrace();
            List<BatchStatement> batchStatements = sqlSession.getConnection().unwrap(TransactionalConnection.class).getInternalConnection().getBatchCollector().getBatchStatements();
            for (BatchStatement batchStatement : batchStatements) {
                System.out.println(batchStatement.getSql());
            }
            return null;
        }
    }
}

通过以上方法,你可以有效地调试和维护MyBatis应用,确保其稳定运行。

public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消