亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Mybatis持久層框架教程:新手入門指南

標簽:
Java SSM 數據庫
概述

Mybatis是一个优秀的持久层框架,它通过简单的API将Java对象与数据库中的记录进行映射,简化了数据库操作的编码工作。本文将详细介绍Mybatis持久层框架教程,包括其安装配置、核心概念和基本使用方法。此外,还将探讨Mybatis的高级特性和与Spring的集成。

Mybatis持久层框架教程:新手入门指南
Mybatis简介

Mybatis的基本概念

Mybatis是一个优秀的持久层框架,它通过简单的API将Java对象与数据库中的记录进行映射。它消除了几乎所有的JDBC代码和手动设置参数及获取结果集的工作,并提供了灵活的SQL映射配置,使Java程序员可以使用SQL查询数据库,还能直接映射数据库的结果集为Java对象,从而极大地减少了程序员的工作量。Mybatis的优点包括:

  • 简化了数据库操作的编码工作
  • 支持自定义SQL查询
  • 支持存储过程的调用
  • 支持多数据库的交互

Mybatis与其他持久层框架的比较

Mybatis与Hibernate、JPA等其他持久层框架相比,最大的区别在于Mybatis需要手动编写SQL语句,而不是通过框架自动生成。这使得Mybatis在处理复杂查询时更有优势,因为它更贴近数据库的实际操作。但是,这也意味着开发人员需要更加熟悉数据库操作的细节。

  • Mybatis vs Hibernate: Hibernate通过ORM(对象关系映射)技术,自动将Java对象映射到数据库中的表,而Mybatis则需要手动编写SQL语句。
  • Mybatis vs JPA: JPA(Java Persistence API)是Java EE平台的一部分,提供了ORM功能,而Mybatis则通过编写SQL语句来操作数据库。

Mybatis的安装与配置

Mybatis的安装和配置相对简单。首先,在项目中引入Mybatis的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.mybatis</groupId>
   .<artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

然后,创建一个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.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/mybatis/UserMapper.xml"/>
    </mappers>
</configuration>

最后,初始化SqlSessionFactory对象,这是Mybatis的核心对象,用于创建SqlSession,进而执行SQL语句:

public SqlSessionFactory getSqlSessionFactory() throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    return new SqlSessionFactoryBuilder().build(inputStream);
}

动态SQL示例

动态生成SQL语句可以提高灵活性和效率。例如,定义一个根据条件查询用户的方法:

public interface UserMapper {
    List<User> selectUserByCondition(Map<String, Object> params);
}

对应的XML映射文件:

<mapper namespace="com.example.mybatis.UserMapper">
    <select id="selectUserByCondition" parameterType="map" resultType="User">
        SELECT * FROM users
        <where>
            <if test="username != null">
                AND username = #{username}
            </if>
            <if test="password != null">
                AND password = #{password}
            </if>
        </where>
    </select>
</mapper>

分页查询示例

分页查询可以有效管理大量数据。例如,定义一个分页查询所有用户的SQL语句:

public interface UserMapper {
    List<User> getUsersByPage(Map<String, Object> params);
}

对应的XML映射文件:

<mapper namespace="com.example.mybatis.UserMapper">
    <select id="getUsersByPage" parameterType="map" resultType="User">
        SELECT * FROM users
        LIMIT #{offset}, #{limit}
    </select>
</mapper>

缓存机制示例

缓存机制可以提高查询性能。例如,启用二级缓存:

<cache />

插件机制示例

插件机制允许用户通过编写插件来扩展Mybatis的功能。例如,拦截SQL执行:

@Intercepts({@Signature(type=Executor.class, method="update", args=Object[].class)})
public class MyPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 拦截逻辑
        return invocation.proceed();
    }

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

    @Override
    public void setProperties(Properties properties) {
        // 设置属性
    }
}
Mybatis的核心概念

SqlSessionFactory和SqlSession

SqlSessionFactory是Mybatis的核心对象,负责创建SqlSession。SqlSession是执行数据库操作的工作单元,可以执行增删改查等操作,并且可以提交事务。SqlSession的创建需要通过SqlSessionFactory来完成:

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

Mapper接口

Mapper接口是Mybatis中用于定义SQL映射的方法接口。通常情况下,Mapper接口中的方法名称和对应的XML文件中的SQL语句的ID一一对应。例如,定义一个UserMapper接口:

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

对应的XML映射文件UserMapper.xml

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

XML配置文件详解

Mybatis的XML配置文件mybatis-config.xml用于配置Mybatis运行环境,主要包括数据库连接信息、映射文件位置、类型处理器等。

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.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/mybatis/UserMapper.xml"/>
    </mappers>
</configuration>
  • <configuration>:根元素,包含所有其他元素。
  • <environments>:定义数据库环境。
  • <environment>:定义一个环境,包含事务管理器和数据源。
  • <transactionManager>:定义事务管理器类型。
  • <dataSource>:定义数据源类型及数据库连接信息。
  • <mappers>:定义映射文件的位置。

参数和结果映射

Mybatis提供了强大的参数和结果映射功能,使得SQL语句中的参数和结果可以灵活地与Java对象进行映射。

例如,定义一个插入用户的方法:

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

对应的XML映射文件:

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

parameterTyperesultType#{}等标签用于进行参数和结果的映射。#{}用于占位符,表示将传入的参数值传递到SQL语句中。

Mybatis的基本使用

CRUD操作(增删改查)

Mybatis支持基本的CRUD操作。

  • 查询
public interface UserMapper {
    List<User> selectAllUsers();
}

<mapper namespace="com.example.mybatis.UserMapper">
    <select id="selectAllUsers" resultType="User">
        SELECT * FROM users
    </select>
</mapper>
  • 插入
public interface UserMapper {
    int insertUser(User user);
}

<mapper namespace="com.example.mybatis.UserMapper">
    <insert id="insertUser" parameterType="User" keyProperty="id" useGeneratedKeys="true">
        INSERT INTO users (username, password) VALUES (#{username}, #{password})
    </insert>
</mapper>
  • 更新
public interface UserMapper {
    int updateUser(User user);
}

<mapper namespace="com.example.mybatis.UserMapper">
    <update id="updateUser" parameterType="User">
        UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}
    </update>
</mapper>
  • 删除
public interface UserMapper {
    int deleteUser(int id);
}

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

参数传递

Mybatis支持多种参数传递方式,例如简单类型参数、复杂类型的参数、Map类型参数等。

  • 简单类型参数
public interface UserMapper {
    User getUserById(int id);
}

<mapper namespace="com.example.mybatis.UserMapper">
    <select id="getUserById" parameterType="int" resultType="User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>
  • 复杂类型参数
public interface UserMapper {
    List<User> getUsersByCondition(User user);
}

<mapper namespace="com.example.mybatis.UserMapper">
    <select id="getUsersByCondition" parameterType="User" resultType="User">
        SELECT * FROM users WHERE username = #{username} AND password = #{password}
    </select>
</mapper>
  • Map类型参数
public interface UserMapper {
    User getUserByMap(Map<String, Object> params);
}

<mapper namespace="com.example.mybatis.UserMapper">
    <select id="getUserByMap" parameterType="map" resultType="User">
        SELECT * FROM users WHERE username = #{username} AND password = #{password}
    </select>
</mapper>

结果集的处理

Mybatis支持多种结果集的处理方式,包括单条记录、多条记录、嵌套查询等。

  • 单条记录
public interface UserMapper {
    User getUserById(int id);
}

<mapper namespace="com.example.mybatis.UserMapper">
    <select id="getUserById" parameterType="int" resultType="User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>
  • 多条记录
public interface UserMapper {
    List<User> getAllUsers();
}

<mapper namespace="com.example.mybatis.UserMapper">
    <select id="getAllUsers" resultType="User">
        SELECT * FROM users
    </select>
</mapper>
  • 嵌套查询
public interface UserMapper {
    User getUserWithOrders(int userId);
}

<mapper namespace="com.example.mybatis.UserMapper">
    <select id="getUserWithOrders" parameterType="int" resultMap="UserResultMap">
        SELECT u.*, o.id as orderId, o.order_name as orderName
        FROM users u
        LEFT JOIN orders o ON u.id = o.user_id
        WHERE u.id = #{id}
    </select>
</mapper>
<resultMap id="UserResultMap" type="User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="password" column="password"/>
    <association property="orders" javaType="List" select="getOrdersByUserId" column="id"/>
</resultMap>

<select id="getOrdersByUserId" resultType="Order">
    SELECT * FROM orders WHERE user_id = #{userId}
</select>
Mybatis的高级特性

动态SQL

Mybatis的动态SQL功能非常强大,可以动态生成SQL语句,支持条件查询、插入、更新等操作。

  • 条件查询
<mapper namespace="com.example.mybatis.UserMapper">
    <select id="selectUserByCondition" parameterType="map" resultType="User">
        SELECT * FROM users
        <where>
            <if test="username != null">
                AND username = #{username}
            </if>
            <if test="password != null">
                AND password = #{password}
            </if>
        </where>
    </select>
</mapper>
  • 插入
<mapper namespace="com.example.mybatis.UserMapper">
    <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO users (username, password) VALUES (#{username}, #{password})
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
    </insert>
</mapper>
  • 更新
<mapper namespace="com.example.mybatis.UserMapper">
    <update id="updateUser" parameterType="User">
        UPDATE users
        <set>
            <if test="username != null">
                username = #{username},
            </if>
            <if test="password != null">
                password = #{password},
            </if>
        </set>
        WHERE id = #{id}
    </update>
</mapper>

分页查询

Mybatis提供了强大的分页功能,支持SQL分页语句的自动构建。

public interface UserMapper {
    List<User> getUsersByPage(Map<String, Object> params);
}

<mapper namespace="com.example.mybatis.UserMapper">
    <select id="getUsersByPage" parameterType="map" resultType="User">
        SELECT * FROM users
        LIMIT #{offset}, #{limit}
    </select>
</mapper>

一级缓存和二级缓存

Mybatis的缓存机制可以提高查询性能,减少数据库访问次数。

  • 一级缓存

一级缓存是SqlSession级别的缓存,每个SqlSession都有自己的缓存。当同一个SqlSession执行相同的SQL查询时,会优先从缓存中获取,如果没有命中缓存才会查询数据库。

  • 二级缓存

二级缓存是Mapper级别的缓存,所有SqlSession共享同一个Mapper缓存。可以通过配置文件开启二级缓存功能:

<cache />

插件机制

Mybatis提供了一个插件机制,允许用户通过编写插件来扩展Mybatis的功能,例如拦截SQL执行、修改参数等。

@Intercepts({@Signature(type=Executor.class, method="update", args=Object[].class)})
public class MyPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 拦截逻辑
        return invocation.proceed();
    }

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

    @Override
    public void setProperties(Properties properties) {
        // 设置属性
    }
}
Mybatis与Spring的集成

使用Spring管理SqlSessionFactory

使用Spring可以方便地管理SqlSessionFactory,通过配置文件或者注解方式来创建SqlSessionFactory。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
</bean>

Mybatis与Spring事务管理

Spring的事务管理可以与Mybatis无缝集成,通过配置事务管理器和事务传播行为来控制事务的执行。

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

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" read-only="false" isolation="DEFAULT" propagation="REQUIRED" timeout="10"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="serviceOperation" expression="execution(* com.example.service.*.*(..))"/>
    <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/>
</aop:config>

Mybatis与Spring Boot的快速集成

Spring Boot可以快速集成Mybatis,通过mybatis-spring-boot-starter依赖来简化Mybatis的配置。

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

application.yml配置文件中:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.mybatis.model
实战案例

完整项目示例

本部分将通过一个完整的项目示例来展示Mybatis的使用,包括数据库连接、CRUD操作、动态SQL等。

  1. 数据库表的创建
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(255),
    password VARCHAR(255)
);
  1. Mapper接口和XML配置文件
public interface UserMapper {
    List<User> selectAllUsers();
    int insertUser(User user);
    int updateUser(User user);
    int deleteUser(int id);
    User getUserById(int id);
    List<User> getUsersByPage(Map<String, Object> params);
}
<mapper namespace="com.example.mybatis.UserMapper">
    <select id="selectAllUsers" resultType="User">
        SELECT * FROM users
    </select>

    <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO users (username, password) VALUES (#{username}, #{password})
    </insert>

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

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

    <select id="getUserById" parameterType="int" resultType="User">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <select id="getUsersByPage" parameterType="map" resultType="User">
        SELECT * FROM users LIMIT #{offset}, #{limit}
    </select>
</mapper>
  1. Mybatis配置文件
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.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/mybatis/UserMapper.xml"/>
    </mappers>
</configuration>
  1. Spring配置文件

在Spring配置文件中定义SqlSessionFactory和Mapper接口的实现类:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="userMapper" class="com.example.mybatis.UserMapperImpl">
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
  1. Java代码实现
public class User {
    private int id;
    private String username;
    private String password;

    // getters and setters
}

public class UserMapperImpl implements UserMapper {
    private SqlSessionFactory sqlSessionFactory;

    public UserMapperImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public List<User> selectAllUsers() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            return sqlSession.selectList("selectAllUsers");
        } finally {
            sqlSession.close();
        }
    }

    @Override
    public int insertUser(User user) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            return sqlSession.insert("insertUser", user);
        } finally {
            sqlSession.commit();
            sqlSession.close();
        }
    }

    @Override
    public int updateUser(User user) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            return sqlSession.update("updateUser", user);
        } finally {
            sqlSession.commit();
            sqlSession.close();
        }
    }

    @Override
    public int deleteUser(int id) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            return sqlSession.delete("deleteUser", id);
        } finally {
            sqlSession.commit();
            sqlSession.close();
        }
    }

    @Override
    public User getUserById(int id) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            return sqlSession.selectOne("getUserById", id);
        } finally {
            sqlSession.close();
        }
    }

    @Override
    public List<User> getUsersByPage(Map<String, Object> params) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            return sqlSession.selectList("getUsersByPage", params);
        } finally {
            sqlSession.close();
        }
    }
}

常见错误及调试技巧

在开发过程中,Mybatis可能会遇到一些常见错误。

  • SQL语法错误

导致原因:SQL语句编写错误,可以通过数据库工具手动执行SQL来检查是否有语法错误。

  • Mapper接口方法名与XML配置文件中的ID不一致

导致原因:Mapper接口和XML配置文件中的SQL语句ID不匹配。

  • 数据库连接问题

导致原因:数据库连接信息配置错误,检查数据库连接字符串、用户名、密码等信息。

  • Mapper接口没有被正确识别

导致原因:Mapper接口没有被Mybatis正确扫描到,检查配置文件中的mapper标签。

调试技巧:

  • 使用日志

Mybatis提供了日志功能,可以通过配置文件或者注解方式开启日志,查看SQL语句的执行情况。

  • 工具调试

使用数据库客户端工具(如MySQL Workbench)来手动执行SQL语句,检查数据库是否正确响应。

  • 单元测试

编写单元测试,通过单元测试来验证Mapper接口的方法是否正确执行。

总之,通过这些方法可以有效地解决Mybatis开发中遇到的问题,提升开发效率。

结语

本文详细介绍了Mybatis的基本概念、核心概念、高级特性以及与Spring的集成等内容,并通过示例代码进行了演示,希望能帮助读者更好地理解和使用Mybatis。更多详细信息可以参考官方文档或慕课网的相关课程进行深入学习。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消