当前位置: 首页 > news >正文

MyBatis系统学习(二)——MyBatis 核心配置与对象解析

MyBatis 核心配置与对象解析

MyBatis 是一种半自动的 ORM 框架,用于将 SQL 查询与 Java 对象相映射。它通过配置文件和映射文件来管理数据库连接、SQL 执行和结果集映射。要了解 MyBatis,首先需要理解其核心对象和配置文件的结构。

一、MyBatis 核心对象
  1. SqlSessionFactoryBuilder

    • 作用:SqlSessionFactoryBuilder 用于创建 SqlSessionFactory 实例。它使用 MyBatis 的核心配置文件构建工厂。
    • 生命周期:每次需要构建 SqlSessionFactory 时就使用一次,完成后即丢弃,不必保存其引用。
    • 用法:
      InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
      SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
      SqlSessionFactory factory = builder.build(inputStream);
      
  2. SqlSessionFactory

    • 作用:SqlSessionFactory 是一个工厂模式的实现,负责创建 SqlSession 实例。
    • 特点:通常在应用程序中作为单例存在,线程安全的,可以复用。
    • 用法:
      SqlSessionFactory factory = builder.build(inputStream);
      
  3. SqlSession

    • 作用:SqlSession 是 MyBatis 与数据库交互的主要接口,类似于 JDBC 的 Connection,用于执行 SQL、获取映射器对象以及管理事务。
    • 特点:非线程安全,每个线程都应该有自己的 SqlSession 实例,通常短生命周期。
    • 方法:
      • selectList:执行查询并返回多个结果。
      • selectOne:执行查询并返回单个结果。
      • insertupdatedelete:分别用于插入、更新和删除操作。
      • commitrollback:用于事务管理。
    • 用法:
      SqlSession session = factory.openSession();
      try {// 执行 SQL 操作
      } finally {session.close(); // 确保关闭 session
      }
      
  4. Mapper 对象

    • 作用:Mapper 是接口,定义了数据库操作的抽象方法。MyBatis 通过动态代理为 Mapper 接口生成实现类,并将接口方法映射到 SQL。
    • 用法:
      UserMapper mapper = session.getMapper(UserMapper.class);
      User user = mapper.selectUser(1);
      

二、MyBatis 核心配置文件(mybatis-config.xml)

核心配置文件是 MyBatis 的主配置文件,控制 MyBatis 的行为。它的主要元素如下:

  1. properties

    • 作用:用于外部化配置,将数据库连接等配置项提取到外部属性文件中,方便维护。
    • 配置:
      <properties resource="db.properties"/>
      
  2. settings

    • 作用:MyBatis 的全局设置,用来控制 MyBatis 的运行行为,例如缓存、懒加载等。
    • 常用设置:
      • cacheEnabled:是否启用二级缓存。
      • lazyLoadingEnabled:是否启用懒加载。
      <settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/>
      </settings>
      
  3. typeAliases

    • 作用:用于给 Java 类定义别名,减少配置文件中的全类名书写。
    • 配置:
      <typeAliases><typeAlias alias="User" type="com.example.User"/>
      </typeAliases>
      
  4. environments

    • 作用:定义数据库连接环境,例如开发、测试、生产环境。可以在不同环境之间切换。
    • 配置:
      <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/test"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment>
      </environments>
      
  5. mappers

    • 作用:指定 Mapper 接口与 XML 映射文件的位置。
    • 配置:
      <mappers><mapper resource="com/example/mapper/UserMapper.xml"/>
      </mappers>
      

三、MyBatis 映射文件(mapper.xml)

MyBatis 映射文件定义了 SQL 与 Java 方法的映射关系。常用元素如下:

  1. select

    • 作用:用于定义查询操作,将查询结果映射为 Java 对象。
    • 配置:
      <select id="selectUser" resultType="User">SELECT * FROM users WHERE id = #{id}
      </select>
      
  2. insert

    • 作用:用于定义插入操作。
    • 配置:
      <insert id="insertUser">INSERT INTO users (name, email) VALUES (#{name}, #{email})
      </insert>
      
  3. update

    • 作用:用于更新操作。
    • 配置:
      <update id="updateUser">UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
      </update>
      
  4. delete

    • 作用:用于删除操作。
    • 配置:
      <delete id="deleteUser">DELETE FROM users WHERE id = #{id}
      </delete>
      
  5. resultMap

    • 作用:用于复杂映射,将查询结果映射到复杂的 Java 对象。
    • 配置:
      <resultMap id="userResultMap" type="User"><result column="id" property="id"/><result column="name" property="name"/><result column="email" property="email"/>
      </resultMap><select id="selectUser" resultMap="userResultMap">SELECT * FROM users WHERE id = #{id}
      </select>
      

四、综合示例

1. 核心配置文件(mybatis-config.xml)

<configuration><properties resource="db.properties"/><settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/></settings><typeAliases><typeAlias alias="User" type="com.example.User"/></typeAliases><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/test"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="com/example/mapper/UserMapper.xml"/></mappers>
</configuration>

2. 映射文件(UserMapper.xml)

<mapper namespace="com.example.mapper.UserMapper"><resultMap id="userResultMap" type="User"><id column="id" property="id"/><result column="name" property="name"/><result column="email" property="email"/></resultMap><select id="selectUser" resultMap="userResultMap">SELECT * FROM users WHERE id = #{id}</select><insert id="insertUser">INSERT INTO users (name, email) VALUES (#{name}, #{email})</insert><update id="updateUser">UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}</update><delete id="deleteUser">DELETE FROM users WHERE id = #{id}</delete>
</mapper>

3. Mapper 接口

public interface UserMapper {User selectUser(int id);void insertUser(User user);void updateUser(User user);void deleteUser(int id);
}

4. 使用示例

public class MyBatisExample {public static void main(String[] args) throws IOException {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);// 插入用户User newUser = new User("John Doe", "john@example.com");mapper.insertUser(newUser);session.commit();// 查询用户User user = mapper.selectUser(1);System.out.println(user);// 更新用户user.setName("Jane Doe");mapper.updateUser(user);session.commit();// 删除用户mapper.deleteUser(1);session.commit();}}
}

此示例展示了如何配置 MyBatis 的核心对象、映射文件、Mapper 接口,并结合代码演示如何执行插入、查询、更新和删除操作。


http://www.mrgr.cn/news/27339.html

相关文章:

  • 知识竞赛活动舞台搭建要多少钱
  • stm32单片机个人学习笔记3(GPIO输出)
  • Visual Studio打开项目的一些小技巧
  • 7-14 电话聊天狂人(map)
  • 本地部署轻量级web开发框架Flask结合内网穿透公网环境访问管理界面
  • 【二十】【QT开发应用】listwidget右键菜单和删除item
  • 构建基于 Feign 的微服务:从 Eureka 到负载均衡的实践 --day05
  • 查询中的算术表达式
  • 【AutoX.js】选择器 UiSelector - 查找包名
  • 【泰克生物】酵母展示建库技术解析:构建高质量抗体文库的实用指南
  • MyBatis系统学习(一)——项目结构及其含义
  • k8s中控制器的使用
  • 关于Vue2里 v-for和v-if一起用的时候会出现的问题
  • Ubuntu20-xrdp与Windows-mstsc远程桌面连接
  • 雷·达利欧(Ray Dalio)的20条《原则》
  • c++类模板为什么不能编译到动态库中来使用
  • 139. 单词拆分
  • 业务资源管理模式语言14
  • C++基础面试题 | 什么是C++中的虚继承?
  • C/S架构和B/S架构哪个更好用一些?