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

Mybatis持久层框架项目实战入门教程

标签:
Java 数据库
概述

本文详细介绍了Mybatis持久层框架项目实战的相关内容,包括基础概念、工作原理、优势和应用场景。文章还涵盖了环境搭建、CRUD操作详解、动态SQL使用、与Spring集成以及高级特性等实用技术。通过本文的学习,读者可以全面掌握Mybatis的使用方法和高级特性。

Mybatis持久层框架项目实战入门教程
Mybatis基础概念介绍

Mybatis简介

Mybatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。与JDBC相比,Mybatis提供了更多面向对象的API,使得操作数据库更加便捷。Mybatis通过XML或注解的方式将查询语句和Java方法进行映射。它是一种半自动化的ORM框架,可以通过半自动化的手段来完成数据持久层操作,降低了开发者的负担。Mybatis的核心目标是提供一种持久化操作的解决方案,将面向对象的概念与数据库的存储方式相结合,使得在面向对象的应用中,实现持久化操作变得更加容易。Mybatis的灵活性和易用性在很多项目中得到了广泛的应用。

Mybatis的工作原理

Mybatis的工作原理主要分为以下几步:

  1. 加载配置文件:Mybatis从配置文件中读取数据库连接信息、映射文件路径等信息。
  2. 读取映射文件:配置文件中定义了映射文件的位置,Mybatis读取这些文件,解析其中的SQL语句和映射关系。
  3. 创建会话对象:Mybatis通过SqlSessionFactory创建SqlSession,SqlSession是一个会话对象,它提供了执行SQL查询、提交事务等操作的方法。
  4. 执行SQL语句:通过SqlSession对象执行SQL语句,可以是增删改查等操作。
  5. 结果映射:将查询结果映射到Java对象中。
  6. 关闭会话对象:操作完成后关闭SqlSession对象,释放资源。

Mybatis的优势和应用场景

优势

  • 灵活的SQL支持:Mybatis允许使用原始的SQL语句,对于复杂查询有很好的支持。
  • 高性能:Mybatis直接操作数据库,避免了ORM框架中复杂的对象映射过程,提高了性能。
  • 面向应用:Mybatis不是全自动化的ORM框架,它允许用户在代码中直接编写SQL语句,增强了程序的灵活性和控制力。
  • 轻量级:Mybatis的配置文件和映射文件都是纯XML格式,易于维护,方便学习和使用。

应用场景

  • 复杂查询:适用于需要进行复杂SQL查询的场景,如分页查询、关联查询等。
  • 性能敏感:对于性能要求较高的系统,Mybatis可以直接操作数据库,避免了ORM框架带来的对象映射开销。
  • 灵活性:对于灵活性要求较高的项目,Mybatis提供了直接编写SQL语句的能力,可以更好地控制数据库操作细节。
Mybatis环境搭建

开发环境准备

为了搭建Mybatis的开发环境,你需要以下工具和库:

  • Java JDK
  • IDE(如 IntelliJ IDEA、Eclipse)
  • Maven(依赖管理和构建工具)
  • 数据库(如 MySQL)

Maven项目构建

  1. 创建一个新的Maven项目。
  2. pom.xml文件中添加Mybatis的依赖。
<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.26</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Mybatis核心配置文件编写

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="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

数据库连接配置

确保你已经创建了数据库和需要的表。例如,创建一个名为mydb的数据库,并创建一个User表:

CREATE DATABASE mydb;

USE mydb;

CREATE TABLE User (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    password VARCHAR(50)
);
Mybatis CRUD操作详解

增加数据

首先定义一个映射文件UserMapper.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.mapper.UserMapper">
    <insert id="insertUser">
        INSERT INTO User (username, password) VALUES (#{username}, #{password})
    </insert>
</mapper>

在Java代码中,定义一个接口UserMapper,并使用SqlSession执行插入操作。

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

public class MybatisExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        SqlSession session = factory.openSession();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = new User("testUser", "testPassword");
            int rows = mapper.insertUser(user);
            session.commit();
        } finally {
            session.close();
        }
    }
}

查询数据

定义查询数据的SQL语句。

<select id="getUserById" resultType="com.example.model.User">
    SELECT id, username, password FROM User WHERE id = #{id}
</select>

在Java代码中,定义一个查询方法并执行。

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

public class MybatisExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        SqlSession session = factory.openSession();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.getUserById(1);
            System.out.println(user);
        } finally {
            session.close();
        }
    }
}

更新数据

定义更新数据的SQL语句。

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

在Java代码中,定义一个更新方法并执行。

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

public class MybatisExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        SqlSession session = factory.openSession();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = new User(1, "newUsername", "newPassword");
            int rows = mapper.updateUser(user);
            session.commit();
        } finally {
            session.close();
        }
    }
}

删除数据

定义删除数据的SQL语句。

<delete id="deleteUserById">
    DELETE FROM User WHERE id = #{id}
</delete>

在Java代码中,定义一个删除方法并执行。

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

public class MybatisExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        SqlSession session = factory.openSession();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            int rows = mapper.deleteUserById(1);
            session.commit();
        } finally {
            session.close();
        }
    }
}

批量操作

定义批量插入数据的SQL语句。

<insert id="insertUsers">
    INSERT INTO User (username, password) VALUES
    <foreach item="item" index="index" collection="list" separator="," open="(" close=")">
        #{item.username}, #{item.password}
    </foreach>
</insert>

在Java代码中,定义一个批量插入方法并执行。

public interface UserMapper {
    int insertUsers(List<User> users);
}

public class MybatisExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        SqlSession session = factory.openSession();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            List<User> users = Arrays.asList(
                    new User("user1", "password1"),
                    new User("user2", "password2")
            );
            int rows = mapper.insertUsers(users);
            session.commit();
        } finally {
            session.close();
        }
    }
}
Mybatis动态SQL使用

if标签

使用if标签可以条件性地包含SQL语句片段。

<select id="selectUser" resultType="com.example.model.User">
    SELECT id, username, password FROM User
    <where>
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="username != null">
            AND username = #{username}
        </if>
    </where>
</select>

在Java代码中,定义一个查询方法并执行。

public interface UserMapper {
    User selectUser(int id, String username);
}

public class MybatisExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        SqlSession session = factory.openSession();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.selectUser(1, "testUser");
            System.out.println(user);
        } finally {
            session.close();
        }
    }
}

choose标签

使用choose标签可以实现多条件分支。

<select id="selectUser" resultType="com.example.model.User">
    SELECT id, username, password FROM User
    <where>
        <choose>
            <when test="id != null">
                AND id = #{id}
            </when>
            <when test="username != null">
                AND username = #{username}
            </when>
            <otherwise>
                AND password = #{password}
            </otherwise>
        </choose>
    </where>
</select>

foreach标签

使用foreach标签可以实现循环遍历集合。

<update id="updateUsers">
    UPDATE User SET username = #{username}, password = #{password}
    WHERE id IN
    <foreach item="item" index="index" collection="ids" separator="," open="(" close=")">
        #{item}
    </foreach>
</update>

在Java代码中,定义一个更新方法并执行。

public interface UserMapper {
    int updateUsers(List<Integer> ids, String username, String password);
}

public class MybatisExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        SqlSession session = factory.openSession();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            List<Integer> ids = Arrays.asList(1, 2);
            int rows = mapper.updateUsers(ids, "newUsername", "newPassword");
            session.commit();
        } finally {
            session.close();
        }
    }
}

set和trim标签

使用set标签可以实现自动过滤更新字段。

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

使用trim标签可以实现SQL语句的前缀和后缀处理。

<select id="selectUser" resultType="com.example.model.User">
    SELECT id, username, password FROM User
    <where>
        <trim prefix="WHERE" prefixOverrides="AND |OR ">
            <if test="id != null">AND id = #{id}</if>
            <if test="username != null">AND username = #{username}</if>
        </trim>
    </where>
</select>
Mybatis与Spring集成

Mybatis与Spring整合简介

Mybatis与Spring集成可以方便地使用Spring的依赖注入和事务管理。通过Spring的SqlSessionFactoryBeanMapperScannerConfigurer可以简化配置。

配置DataSource

在Spring配置文件中配置DataSource。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</bean>

配置SqlSessionFactory

使用SqlSessionFactoryBean配置SqlSessionFactory。

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

使用Mapper接口

Mapper接口不需要单独配置,使用MapperScannerConfigurer自动扫描。

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

事务管理

使用Spring的DataSourceTransactionManager进行事务管理。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

在Mapper接口中添加事务注解。

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

在Service中使用Mapper接口。

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

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

    @Transactional
    public int updateUser(User user) {
        return userMapper.updateUser(user);
    }
}
Mybatis高级特性

结果集映射

结果集映射可以将查询结果映射到Java对象中。

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

在Java代码中,定义一个查询方法并执行。

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

public class MybatisExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        SqlSession session = factory.openSession();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.selectUser(1);
            System.out.println(user);
        } finally {
            session.close();
        }
    }
}

分页查询

分页查询可以通过插件实现。

public class PagePlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) {
        // 实现分页插件逻辑
        return invocation.proceed();
    }
}

在配置文件中添加插件配置。

<configuration>
    <plugins>
        <plugin interceptor="com.example.plugin.PagePlugin">
            <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>
</configuration>

扩展插件

插件可以通过实现Interceptor接口实现Mybatis的扩展。

public class MybatisPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 实现插件逻辑
        return invocation.proceed();
    }
}

在配置文件中添加插件配置。

<configuration>
    <plugins>
        <plugin interceptor="com.example.plugin.MybatisPlugin">
            <property name="property" value="value"/>
        </plugin>
    </plugins>
</configuration>

二级缓存

二级缓存可以提高查询性能。

<cache/>

在配置文件中添加缓存配置。

<configuration>
    <cache-ref default="true" />
</configuration>

在Mapper文件中启用缓存。

<mapper namespace="com.example.mapper.UserMapper">
    <cache />
</mapper>

在Java代码中,定义一个查询方法并执行。

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

public class MybatisExample {
    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        SqlSession session = factory.openSession();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.selectUser(1);
            System.out.println(user);
        } finally {
            session.close();
        }
    }
}

通过以上步骤,你可以全面了解和掌握Mybatis的使用方法和高级特性。希望这个教程对你有所帮助。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消