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

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

标签:
Java 数据库
概述

本文详细介绍了Mybatis持久层框架项目实战,包括基础概念、环境搭建、核心API和映射文件详解等内容。文中通过实例深入讲解了CRUD操作、动态SQL和缓存配置等高级特性,并提供了完整的项目实战案例。希望读者通过本文能够掌握Mybatis的使用和优化方法,提升开发技能。mybatis持久层框架项目实战涵盖了从环境搭建到高级特性的全面指导。

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

Mybatis是什么

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

Mybatis的特点和优势

Mybatis的主要特点包括:

  1. 灵活性:Mybatis允许在运行时动态地生成SQL,支持存储过程调用和自定义SQL语句。
  2. 易用性:开发者可以使用简单的XML或注解来配置和映射。
  3. 性能高:Mybatis直接操作数据库,避免了中间层的阻塞。
  4. 扩展性:Mybatis支持自定义类型处理器、自定义动态SQL、自定义缓存等。
  5. 低侵入性:Mybatis的代码和业务逻辑分离,易于维护。

Mybatis的优势体现在:

  • 简单易用:Mybatis的配置和映射文件是分离的,使得业务代码和SQL语句的维护更加容易。
  • 灵活性:Mybatis允许在运行时动态生成SQL,支持存储过程调用和自定义SQL语句。
  • 强大的映射功能:Mybatis可以将Java对象映射为数据库中的记录,反之亦然。
  • 插件机制:Mybatis支持插件机制,可以自由地扩展其功能。

Mybatis与传统JDBC的区别

Mybatis与JDBC的主要区别在于:

  1. 使用方式

    • Jdbc:通过编写Java代码来实现SQL查询,使用Statement和PreparedStatement等来执行SQL语句。
    • Mybatis:通过配置文件(XML)或注解来定义SQL语句,通过执行Mapper接口中的方法来调用SQL语句。
  2. SQL语句处理

    • Jdbc:需要手动拼接SQL语句,设置参数,处理结果集。
    • Mybatis:可以配置SQL语句,Mybatis会自动处理SQL参数和结果集映射。
  3. 灵活性

    • Jdbc:灵活性较差,SQL语句的调整需要修改代码。
    • Mybatis:SQL语句的调整只需修改配置文件,不涉及代码修改。
  4. 性能

    • Jdbc:需要编写大量的SQL和手动处理结果集,性能相对较低。
    • Mybatis:通过缓存机制和动态SQL生成技术,性能较高。
  5. 代码量
    • Jdbc:需要编写大量的SQL和处理结果集的代码,代码量较大。
    • Mybatis:通过配置文件和Mapper接口减少代码量,使代码更加简洁。

例如,使用JDBC的典型代码如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcExample {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            // 连接数据库
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
            stmt = conn.createStatement();
            // 执行SQL
            ResultSet rs = stmt.executeQuery("SELECT * FROM users");
            while (rs.next()) {
                System.out.println(rs.getString("username"));
            }
            // 关闭资源
            rs.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (stmt != null)
                    stmt.close();
                if (conn != null)
                    conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

使用Mybatis的典型代码如下:

import org.apache.ibatis.session.SqlSession;
import com.example.mapper.UserMapper;

public class MybatisExample {
    public static void main(String[] args) {
        try (SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml")).openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            List<User> users = mapper.selectAllUsers();
            for (User user : users) {
                System.out.println(user.getUsername());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Mybatis环境搭建

开发环境准备

在开始搭建Mybatis环境之前,需要准备以下开发环境:

  1. Java开发环境:确保已安装Java SE开发环境。
  2. IDE:建议使用IntelliJ IDEA或Eclipse进行开发。
  3. 数据库环境:安装MySQL数据库。
  4. Maven:Mybatis项目的构建工具。

Maven项目配置Mybatis依赖

在Maven项目中配置Mybatis依赖,编辑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>
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.4</version>
    </dependency>
</dependencies>

IDEA新建Mybatis项目实例

  1. 在IntelliJ IDEA中创建一个新的Maven项目。
  2. 配置pom.xml文件,添加Mybatis依赖。
  3. 创建配置文件SqlMapConfig.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>
    <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/test"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
  1. 创建Mapper接口和对应的XML配置文件。
package com.example.mapper;

import com.example.entity.User;
import java.util.List;

public interface UserMapper {
    List<User> selectAllUsers();
}
<?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">
    <select id="selectAllUsers" resultType="com.example.entity.User">
        SELECT * FROM users
    </select>
</mapper>
  1. 创建实体类User
package com.example.entity;

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

    // 实体类的getters和setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
Mybatis核心API详解

SqlSession和SqlSessionFactory

SqlSessionFactory是Mybatis中最核心的接口之一,用于创建SqlSessionSqlSession是执行数据库操作的接口,可以获取Mapper接口的代理实现,执行SQL语句。

// 创建SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml"));

// 使用SqlSessionFactory创建SqlSession
SqlSession session = factory.openSession();
package com.example;

import com.example.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisExample {
    public static void main(String[] args) {
        try (SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml")).openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            List<User> users = mapper.selectAllUsers();
            for (User user : users) {
                System.out.println(user.getUsername());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Mapper接口和Mapper XML配置文件

Mybatis允许定义Mapper接口,并通过XML配置文件映射SQL语句。在Mapper接口中定义方法,这些方法会被映射成对应的SQL语句。

package com.example.mapper;

import com.example.entity.User;
import java.util.List;

public interface UserMapper {
    List<User> selectAllUsers();
}
<?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">
    <select id="selectAllUsers" resultType="com.example.entity.User">
        SELECT * FROM users
    </select>
</mapper>

CRUD操作的实现

Mybatis支持基本的CRUD操作(创建Create、读取Read、更新Update、删除Delete)。

插入操作

package com.example.mapper;

public interface UserMapper {
    int insert(User user);
}
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.UserMapper">
    <insert id="insert" parameterType="com.example.entity.User">
        INSERT INTO users (username, password) VALUES (#{username}, #{password})
    </insert>
</mapper>

查询操作

package com.example.mapper;

public interface UserMapper {
    List<User> selectAllUsers();
}
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectAllUsers" resultType="com.example.entity.User">
        SELECT * FROM users
    </select>
</mapper>

更新操作

package com.example.mapper;

public interface UserMapper {
    int update(User user);
}
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.UserMapper">
    <update id="update" parameterType="com.example.entity.User">
        UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}
    </update>
</mapper>

删除操作

package com.example.mapper;

public interface UserMapper {
    int delete(int id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.UserMapper">
    <delete id="delete" parameterType="int">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>
Mybatis映射文件详解

元素详解(select, insert, update, delete)

Mybatis的映射文件中定义了多种元素,包括selectinsertupdatedelete等。

select

<select id="selectAllUsers" resultType="com.example.entity.User">
    SELECT * FROM users
</select>

insert

<insert id="insert" parameterType="com.example.entity.User">
    INSERT INTO users (username, password) VALUES (#{username}, #{password})
</insert>

update

<update id="update" parameterType="com.example.entity.User">
    UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}
</update>

delete

<delete id="delete" parameterType="int">
    DELETE FROM users WHERE id = #{id}
</delete>

结果映射(resultMap)

resultMap用于定义结果集的映射规则,可以处理复杂的SQL查询结果。

<resultMap type="com.example.entity.User" id="userResultMap">
    <id column="id" property="id"/>
    <result column="username" property="username"/>
    <result column="password" property="password"/>
</resultMap>
<select id="selectAllUsers" resultMap="userResultMap">
    SELECT id, username, password FROM users
</select>

动态SQL应用

Mybatis支持动态SQL,可以根据不同的条件生成不同的SQL语句。

if

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

choosewhenotherwise

<select id="selectUsersByCondition" resultType="com.example.entity.User">
    SELECT * FROM users WHERE 1=1
    <choose>
        <when test="username != null">
            AND username = #{username}
        </when>
        <when test="password != null">
            AND password = #{password}
        </when>
        <otherwise>
            AND id = 1
        </otherwise>
    </choose>
</select>
Mybatis项目实战

实战项目需求分析

为了更好地理解Mybatis的使用,我们将实现一个简单的用户管理系统,包括用户信息的增删改查。

项目结构规划

项目的基本结构如下:

src
└──main
    ├──java
    │   └──com.example
    │       ├──entity
    │       │   └──User.java
    │       ├──mapper
    │       │   └──UserMapper.java
    │       └──MybatisExample.java
    ├──resources
    │   ├──SqlMapConfig.xml
    │   └──mapper
    │       └──UserMapper.xml

分步实现项目功能

创建实体类

首先创建用户实体类User

package com.example.entity;

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

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

创建Mapper接口

定义用户Mapper接口UserMapper

package com.example.mapper;

import com.example.entity.User;
import java.util.List;

public interface UserMapper {
    List<User> selectAllUsers();
    int insert(User user);
    int update(User user);
    int delete(int id);
}

创建Mapper XML配置文件

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">
    <select id="selectAllUsers" resultType="com.example.entity.User">
        SELECT * FROM users
    </select>

    <insert id="insert" parameterType="com.example.entity.User">
        INSERT INTO users (username, password) VALUES (#{username}, #{password})
    </insert>

    <update id="update" parameterType="com.example.entity.User">
        UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}
    </update>

    <delete id="delete" parameterType="int">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>

创建配置文件

配置Mybatis的核心设置SqlMapConfig.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/test"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

编写主程序

最后,编写主程序MybatisExample来测试各个功能:

package com.example;

import com.example.mapper.UserMapper;
import com.example.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.util.List;

public class MybatisExample {
    public static void main(String[] args) {
        try (SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml")).openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);

            // 插入操作
            User user = new User();
            user.setUsername("testUser");
            user.setPassword("testPassword");
            mapper.insert(user);

            // 查询操作
            List<User> users = mapper.selectAllUsers();
            for (User u : users) {
                System.out.println(u.getUsername());
            }

            // 更新操作
            user.setId(1);
            user.setUsername("updatedUser");
            mapper.update(user);

            // 删除操作
            mapper.delete(1);

            session.commit();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

通过上述步骤,我们完成了用户信息的增删改查操作,并进行了一定的测试,确保功能实现正确。

Mybatis高级特性和优化

使用插件进行功能扩展

Mybatis允许通过插件机制自定义功能,可以在SqlSession执行前或执行后进行拦截和扩展。定义插件的方式如下:

package com.example.plugin;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.plugin.*;

import java.util.Properties;

@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class MybatisPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Executor executor = (Executor) invocation.getTarget();
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        Object parameter = invocation.getArgs()[1];
        BoundSql boundSql = mappedStatement.getBoundSql(parameter);
        String sql = boundSql.getSql();
        // 在这里可以对sql进行处理,比如添加日志等
        System.out.println("SQL: " + sql);
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }
}

SqlMapConfig.xml中配置插件:

<configuration>
    <plugins>
        <plugin interceptor="com.example.plugin.MybatisPlugin">
            <property name="property1" value="value1"/>
        </plugin>
    </plugins>
    <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/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支持一级和二级缓存,二级缓存可以缓存所有Mapper的查询结果,提高查询效率。

开启二级缓存:

<mapper namespace="com.example.mapper.UserMapper">
    <cache/>
    <select id="selectAllUsers" resultType="com.example.entity.User">
        SELECT * FROM users
    </select>
</mapper>

在主配置文件中配置共享缓存:

<configuration>
    <cacheEnabled>true</cacheEnabled>
    <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/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可以通过配置数据库连接池来优化数据库连接管理。常用的数据库连接池工具有DBCP、C3P0和Druid等。

使用Druid连接池:

<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/test"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
                <property name="initialSize" value="5"/>
                <property name="maxActive" value="20"/>
                <property name="minIdle" value="5"/>
                <property name="maxIdle" value="10"/>
                <property name="timeBetweenEvictionRunsMillis" value="60000"/>
                <property name="minEvictableIdleTimeMillis" value="300000"/>
                <property name="validationQuery" value="SELECT 1"/>
                <property name="testWhileIdle" value="true"/>
                <property name="testOnBorrow" value="false"/>
                <property name="testOnReturn" value="false"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

通过上述配置,我们可以有效地利用数据库连接池管理数据库连接,提高应用的性能和稳定性。

结语

通过以上章节的学习和实践,我们详细介绍了Mybatis的基础概念、环境搭建、核心API、映射文件详解以及高级特性和优化。希望读者通过本文能够掌握Mybatis的基本用法,进一步提升自己的开发能力。更多详细的教程和实战案例可以参考Murong's Blog,该网站提供了丰富的Mybatis相关资源。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消