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

Mybatis入门教程:简单操作和使用详解

标签:
Java 数据库
概述

Mybatis是一个强大的持久层框架,提供了动态SQL、缓存和类型映射等特性,简化了数据库操作。本文详细介绍了Mybatis的环境搭建、核心概念、CRUD操作、动态SQL以及高级用法,帮助开发者更高效地使用Mybatis。

Mybatis简介及环境搭建
Mybatis是什么

Mybatis是一个强大的持久层框架,它提供了动态SQL、缓存和类型映射等特性。Mybatis简化了数据库操作,允许开发者通过简单的Java对象来操作数据库,从而减少了编写SQL语句的复杂度。

Mybatis的优势和应用场景

Mybatis的优点包括:

  • 简化了数据库操作,通过简单的Java对象映射到数据库表。
  • 支持动态SQL,能够灵活处理复杂的查询。
  • 提供了缓存机制,以提高查询性能。
  • 与数据库无关,支持多种数据库。

应用场景包括:

  • 需要灵活使用SQL的场景。
  • 需要高效处理大数据量的场景。
  • 需要简化数据库操作的项目。
  • 需要动态查询的场景,如复杂的条件查询。
Mybatis的下载与环境搭建

下载Mybatis

Mybatis的最新版本和相关文档可以从其官方网站下载。下载完成后,解压文件,将解压后的目录放到你的项目中。

创建Spring Boot项目

使用IDE创建一个新的Spring Boot项目。添加Mybatis的依赖。例如,如果你使用的是Maven,在pom.xml中添加以下依赖:

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

配置数据库连接

application.properties文件中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.mapper-locations=classpath:mapper/*.xml

创建数据库表

创建数据库表user,用于存储用户信息:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8;
Mybatis的核心概念与配置
概念解析:SqlSessionFactory与SqlSession
  • SqlSessionFactory:工厂模式,用于创建SqlSession的工厂类。
  • SqlSession:代表一次会话,可以执行数据库的增删改查操作。

创建SqlSessionFactory

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

创建SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession();
Mybatis配置文件详解

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"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!--其他配置-->
</configuration>

类型别名配置

<typeAliases>
    <typeAlias alias="User" type="com.example.model.User"/>
</typeAliases>

映射文件位置配置

<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
Mybatis的配置步骤
  1. 创建mybatis-config.xml文件,配置数据库环境、类型别名、映射文件位置等。
  2. 创建UserMapper.xml文件,配置SQL语句。
  3. 创建User实体类。
  4. 创建UserMapper接口,声明SQL操作方法。
  5. 在主程序中,创建SqlSessionFactory和SqlSession,执行数据库操作。
// 创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
Mybatis的CRUD操作
添加数据(Insert操作)

User实体类

public class User {
    private int id;
    private String username;
    private String password;

    // 构造函数、getters和setters省略
}

UserMapper接口

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

UserMapper.xml映射文件

<mapper namespace="com.example.mapper.UserMapper">
    <insert id="insertUser">
        INSERT INTO user (username, password) VALUES (#{username}, #{password})
    </insert>
</mapper>

插入数据

SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("testUser");
user.setPassword("testPassword");
userMapper.insertUser(user);
sqlSession.commit();
sqlSession.close();
修改数据(Update操作)

UserMapper接口

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

UserMapper.xml映射文件

<update id="updateUser">
    UPDATE user SET username=#{username}, password=#{password} WHERE id=#{id}
</update>

更新数据

SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setId(1);
user.setUsername("newUsername");
user.setPassword("newPassword");
userMapper.updateUser(user);
sqlSession.commit();
sqlSession.close();
查询数据(Select操作)

UserMapper接口

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

UserMapper.xml映射文件

<select id="selectUsers" resultType="User">
    SELECT * FROM user
</select>

查询数据

SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectUsers();
sqlSession.close();
删除数据(Delete操作)

UserMapper接口

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

UserMapper.xml映射文件

<delete id="deleteUser">
    DELETE FROM user WHERE id=#{id}
</delete>

删除数据

SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int result = userMapper.deleteUser(1);
sqlSession.commit();
sqlSession.close();
Mybatis与Mapper映射文件
使用Mapper文件的好处

使用Mapper文件可以将SQL语句和Java代码完全解耦,使代码更清晰、更易于维护。Mapper文件中定义了SQL语句,Java代码中调用Mapper接口即可。

创建Mapper文件的步骤
  1. 创建Mapper接口。
  2. 创建Mapper映射文件,定义SQL语句。
  3. mybatis-config.xml配置Mapper文件位置。
  4. 在Java代码中获取Mapper接口实例,执行SQL操作。

UserMapper接口

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

UserMapper.xml映射文件

<mapper namespace="com.example.mapper.UserMapper">
    <insert id="insertUser">
        INSERT INTO user (username, password) VALUES (#{username}, #{password})
    </insert>
    <update id="updateUser">
        UPDATE user SET username=#{username}, password=#{password} WHERE id=#{id}
    </update>
    <select id="selectUsers" resultType="User">
        SELECT * FROM user
    </select>
    <delete id="deleteUser">
        DELETE FROM user WHERE id=#{id}
    </delete>
</mapper>
参数映射与结果映射

参数映射

参数映射定义了Java对象和SQL语句中的参数之间的关系。

<insert id="insertUser">
    INSERT INTO user (username, password) VALUES (#{username}, #{password})
</insert>

结果映射

结果映射定义了数据库字段和Java对象属性之间的关系。

<select id="selectUsers" resultType="User">
    SELECT * FROM user
</select>
Mybatis的动态SQL
动态SQL的必要性

动态SQL允许根据运行时的条件生成SQL语句,提高了SQL语句的灵活性。例如,可以根据不同的条件生成不同的查询语句。

if、choose、when、otherwise标签使用

if标签

if标签用于判断某个条件是否满足,如果条件满足,则生成相应的SQL代码。

<select id="selectUsers" resultType="User">
    SELECT * FROM user WHERE
    <if test="username != null">
        username = #{username}
    </if>
    <if test="password != null">
        AND password = #{password}
    </if>
</select>

choose、when、otherwise标签

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

<select id="selectUsers" resultType="User">
    SELECT * FROM user WHERE
    <choose>
        <when test="username != null">
            username = #{username}
        </when>
        <when test="password != null">
            password = #{password}
        </when>
        <otherwise>
            id = #{id}
        </otherwise>
    </choose>
</select>
set、foreach标签使用

set标签

set标签用于实现动态更新,只更新满足条件的字段。

<update id="updateUser">
    UPDATE user SET
    <set>
        <if test="username != null">username = #{username},</if>
        <if test="password != null">password = #{password},</if>
    </set>
    WHERE id = #{id}
</update>

foreach标签

foreach标签用于遍历集合,生成多个SQL语句。

<update id="updateUsers">
    UPDATE user SET
    <foreach item="item" index="index" collection="users" open="(" separator="," close=")">
        id = #{item.id}
    </foreach>
</update>
Mybatis的高级用法
分页查询

分页查询需要使用RowBounds或PageHelper插件来实现。

RowBounds分页

List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.selectUsers", null, new RowBounds(0, 10));

PageHelper分页插件

首先引入PageHelper依赖。

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

配置PageHelper插件。

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.Page;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;

PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("helperDialect", "mysql");
properties.setProperty("reasonable", "true");
pageHelper.setProperties(properties);
List<Interceptor> interceptors = new ArrayList<>();
interceptors.add(pageHelper);
Configuration configuration = new Configuration();
configuration.setInterceptors(interceptors);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, configuration);

使用PageHelper进行分页查询。

Page<User> usersPage = PageHelper.startPage(1, 10).doPageQuery();
List<User> users = usersPage.getResult();
批量插入

批量插入可以提高插入效率,通过批量插入操作,减少数据库的交互次数。

使用SqlSession批量插入

List<User> users = new ArrayList<>();
users.add(new User(1, "testUser1", "testPassword1"));
users.add(new User(2, "testUser2", "testPassword2"));
sqlSession.insert("com.example.mapper.UserMapper.batchInsertUsers", users);
sqlSession.commit();
sqlSession.close();

使用foreach标签批量插入

<insert id="batchInsertUsers">
    INSERT INTO user (username, password)
    <foreach item="item" index="index" collection="users" open="(" separator="," close=")">
        (#{item.username}, #{item.password})
    </foreach>
</insert>
使用插件

Mybatis提供了插件机制,可以通过插件扩展Mybatis的功能。

插件的创建

创建插件类,实现Interceptor接口。

public class MybatisPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 在执行SQL之前的一些处理
        Object result = invocation.proceed();
        // 在执行SQL之后的一些处理
        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.MybatisPlugin">
        <property name="property" value="value"/>
    </plugin>
</plugins>

插件的使用

在需要使用插件的地方,直接使用即可。

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

插件会在每次调用Mapper接口方法时执行。

插件可以用于日志记录、数据加密、性能监控等多种用途。

以上是Mybatis的详细介绍,包括环境搭建、核心概念、CRUD操作、动态SQL、分页查询、批量插入和插件的使用。通过这些内容,你可以详细了解和掌握Mybatis框架的使用。如果你有更多的需求和疑问,可以参考慕课网上的相关课程进行深入学习。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

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

帮助反馈 APP下载

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

公众号

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

举报

0/150
提交
取消