Java的Mybatis框架

5 阅读1分钟

Java的Mybatis框架

思路来源

www.cnblogs.com/java-note/p…

整理

(一)架构层次

  1. 接口层(Mapper 接口)
  • Mapper 接口是 MyBatis 中定义数据操作接口的地方。它是一个普通的 Java 接口,接口中的方法对应于数据库的操作,如查询、插入、更新、删除等。这些方法的返回值可以是单个对象、对象列表或者受影响的行数等。例如,一个用户管理系统的 UserMapper 接口可能包含如下方法:

    public interface UserMapper {
        User selectUserById(int id);
        List<User> selectAllUsers();
        void insertUser(User user);
        void updateUser(User user);
        void deleteUser(int id);
    }
    
  • Mapper 接口中的方法与 SQL 映射文件中的 SQL 语句是一一对应的。MyBatis 会在运行时根据接口和映射文件的配置,动态地生成接口的实现类,从而使得开发者可以通过调用接口方法来完成数据库操作。

2. SQL 映射层(Mapper XML 文件)

  • Mapper XML 文件是 MyBatis 中定义 SQL 映射的地方。它是一个 XML 文件,用于将 Mapper 接口中的方法与具体的 SQL 语句进行映射。在 XML 文件中,每个 <select><insert><update><delete> 等标签对应于 Mapper 接口中的一个方法。例如,与上面的 UserMapper 接口对应的 XML 文件可能如下:

    <mapper namespace="com.example.mapper.UserMapper">
        <select id="selectUserById" parameterType="int" resultType="com.example.model.User">
            SELECT * FROM users WHERE id = #{id}
        </select>
        <select id="selectAllUsers" resultType="com.example.model.User">
            SELECT * FROM users
        </select>
        <insert id="insertUser" parameterType="com.example.model.User">
            INSERT INTO users (name, age) VALUES (#{name}, #{age})
        </insert>
        <update id="updateUser" parameterType="com.example.model.User">
            UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
        </update>
        <delete id="deleteUser" parameterType="int">
            DELETE FROM users WHERE id = #{id}
        </delete>
    </mapper>
    
  • 在 XML 文件中,namespace 属性指定了对应的 Mapper 接口的全限定名,id 属性对应于接口中的方法名,parameterType 属性指定了方法的参数类型,resultType 属性指定了返回值的类型。#{} 占位符用于绑定方法参数到 SQL 语句中,MyBatis 会自动进行参数的替换和处理。

3. SQL 会话层(SqlSession)

  • SqlSession 是 MyBatis 中非常重要的一个类,它代表了一次数据库会话。通过 SqlSession,开发者可以执行 SQL 语句、获取映射器(Mapper)以及管理事务。SqlSession 是线程不安全的,因此每次使用后都应该关闭它,以释放数据库连接等资源。

  • SqlSession 提供了多种方法来执行 SQL 语句,例如 selectOneselectListinsertupdatedelete 等。这些方法的底层实现会根据 Mapper XML 文件中的配置,将 SQL 语句发送到数据库执行,并返回相应的结果。例如:

  •   try (SqlSession session = sqlSessionFactory.openSession()) {
          User user = session.selectOne("com.example.mapper.UserMapper.selectUserById", 1);
          System.out.println(user.getName());
      }
    

4. 配置层(SqlSessionFactory 和 SqlSessionFactoryBuilder)

  • SqlSessionFactory 是 MyBatis 中的另一个核心类,它负责创建 SqlSession 实例。SqlSessionFactory 是线程安全的,通常在整个应用程序的生命周期中只需要创建一个实例。它可以通过 SqlSessionFactoryBuilder 来构建。

  • SqlSessionFactoryBuilder 是一个用于构建 SqlSessionFactory 的工具类。它通过读取 MyBatis 的配置文件(通常是 mybatis-config.xml 文件)来初始化 MyBatis 的运行环境,包括加载映射文件、解析配置信息、初始化插件等。例如:

  •   String resource = "mybatis-config.xml";
      InputStream inputStream = Resources.getResourceAsStream(resource);
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
  • 在 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/mydatabase"/>
                    <property name="username" value="root"/>
                    <property name="password" value="password"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="com/example/mapper/UserMapper.xml"/>
        </mappers>
    </configuration>
    
  • 在这个配置文件中,environments 节定义了数据库环境的配置,transactionManager 定义了事务管理方式(这里使用的是 JDBC 自带的事务管理),dataSource 定义了数据库连接池的配置。mappers 节定义了 Mapper XML 文件的位置。

mybatis实际case举例

  1. 方法声明及参数绑定,写在dal文件夹下,mapper子文件夹内的XXXMapper.java文件内

  2. 具体的sql,写在resources文件夹下,mapper子文件夹下内的XXXMapper.xml内,与java文件对应

MyBatis 参数绑定用法解析

这是 MyBatis 框架中的参数绑定语法,用于将 Java 方法参数映射到 SQL 语句中。

@Param 注解作用
CrowdDocketPO selectLatestByShop(@Param("shopId") Long shopId, @Param("platform") Integer platform);
参数说明:
  • @Param("shopId")****: 将方法参数 shopId 绑定为 SQL 中的 shopId 参数

  • @Param("platform")****: 将方法参数 platform 绑定为 SQL 中的 platform 参数

对应的 SQL 使用方式:

在 XML 映射文件中,可以这样使用:

<select id="selectLatestByShop" resultType="CrowdDocketPO">
    SELECT * FROM crowd_docket 
    WHERE shop_id = #{shopId} 
      AND platform = #{platform}
    ORDER BY create_time DESC 
    LIMIT 1
</select>
功能推测:

根据方法名 selectLatestByShop**,这个方法的作用是:**

  • 根据店铺ID (shopId) 和平台 (platform) 查询

  • 返回最新的一条围观工单记录 (CrowdDocketPO)

  • 通常按创建时间倒序排列,取第一条

为什么使用 @Param:
  1. 多参数场景:当方法有多个参数时,MyBatis 需要明确参数名称

  2. 可读性:让 SQL 中的参数名更清晰易懂

  3. 避免歧义:防止参数顺序错乱导致的问题

一些用法记录

sql别名

这个是类似alias的用法,用allfields替代ID,RelateID,AppType,Scenario,ShopID,Platform,Result,AccountId,AddTime,UpdateTime这一堆字段的意思

<sql id="allfields">
        ID,RelateID,AppType,Scenario,ShopID,Platform,Result,AccountId,AddTime,UpdateTime
    </sql>

数据库配置

Q:resources/spring/database/appcontext-datasource.xml的作用是什么?

A:spring/database/appcontext-datasource.xml文件的作用是配置应用程序的数据库连接和数据源。具体来说,它实现了以下功能:

  1. 定义了应用程序使用的数据源(DataSource)对象,这些对象负责管理与数据库的连接

  2. 配置了两个主要的数据源:

    • report.main.dataSource:主要的数据源,用于CaseDao和InfoDao等DAO访问数据库

    • credibilityAuditDataSource:用于可信度审核的数据源

  3. 使用了Zebra数据源(com.dianping.zebra.group.jdbc.GroupDataSource),这是点评内部的一个数据库中间件,提供了读写分离、分库分表等功能

  4. 通过${credit-case-server.dataSource.jdbcRef}这样的占位符引用外部配置,这些值通常来自Lion配置中心(点评/美团的配置管理系统)

  5. 配置了连接池参数,如最小连接数、最大连接数、初始连接数等,用于优化数据库连接的使用

  6. 创建了mysqlJdbcTemplate,这是Spring提供的JDBC操作模板,简化了JDBC操作

这个文件是Spring应用程序中数据访问层的核心配置,它将应用程序与具体的数据库实现解耦,使得应用程序可以通过配置的方式连接到不同的数据库,而不需要修改代码。

${credit-case-server.dataSource.jdbcRef}这样的值是从Lion配置中心获取的,Lion是美团点评的配置管理系统,可以集中管理各种配置项,并支持动态修改。在应用启动时,这些占位符会被Lion中实际配置的值替换。