首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【SSM-Mybatis(一)】java持久层框架-Mybatis!本文涵盖介绍Mybatis和基本使用,分析Mybatis核心配置文件

【SSM-Mybatis(一)】java持久层框架-Mybatis!本文涵盖介绍Mybatis和基本使用,分析Mybatis核心配置文件

作者头像
用户11865655
发布2025-10-13 17:23:33
发布2025-10-13 17:23:33
1200
代码可运行
举报
文章被收录于专栏:CSDN专栏CSDN专栏
运行总次数:0
代码可运行

Mybatis 简介

问题与解决方案
  • 原始jdbc开发存在的问题:
    • 数据库连接、创建、释放频繁造成系统资源浪费从而影响系统性能
    • sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码
    • 查询操作时,需要手动将结果集中的数据手动封装到实体中。查询操作时,需要手动将实体的数据设置到sql语句的占位符位置
  • 应对上述问题给出的解决方案:
    • 使用数据库连接池初始化连接资源
    • 将sql语句抽取到xml配置文件
    • 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
什么是Mybatis?
  • mybatis 是一个优秀的基于java的持久层(Dao)框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程
  • mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句
  • 最后 mybatis 框架执行sql 并将结果映射为java对象并返回。采用ORM(对象关系映射)思想解决了实体和数据库映射问题,对jdbc进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作
Mybatis快速入门
开发步骤:
  1. 添加Mybatis的坐标(不用maven,直接添加Mybatis相关jar包)
  2. 创建数据表(数据库中的表格,已有不用创建)
  3. 编写实体类(需要一个实体类来接收数据,有则需要)
  4. 编写映射文件xxxMapper.xml
  5. 编写核心文件SqlMapConfig.xml
  6. 编写测试类
映射文件xxxMapper.xml
代码语言:javascript
代码运行次数:0
运行
复制
<?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="userMapper">
    <!--
	id:设置命名空间中的id,每个id代表着一个方法
	resultType:指定返回对象的类型,该类型应为实体类
-->
    <select id="findAll" resultType="com.DemoTestNode.entityClass.User">
        <!-- 存放该方法中包含的sql语句 -->
        select * from person
    </select>
</mapper>
核心文件SqlMapConfig.xml
代码语言:javascript
代码运行次数:0
运行
复制
<?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="developemnt">
        <!-- 配置标识名 -->
        <environment id="developemnt">
            
            <!-- 事务类型管理设置 -->
            <transactionManager type="JDBC"></transactionManager>
            
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test_1"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
            
        </environment>
    </environments>


    <!-- 设置映射文件路径,这样在配置核心文件时也能够一并将映射文件配置 -->
    <mappers>
        <mapper resource="com/DemoTestNode/mapper/UserMapper.xml"></mapper>
    </mappers>

</configuration>
编写测试类
代码语言:javascript
代码运行次数:0
运行
复制
@Test
public void test1() throws IOException {

    // 获取核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

    // 获得session工厂对象
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);

    // 获得session回话对象
    SqlSession sqlSession = build.openSession();
    // 执行操作 。 参数:namespace . id
    List<User> userList = sqlSession.selectList("userMapper.findAll");

    System.out.println(userList);
    // 释放Session
    sqlSession.close();

}

Mybatis 上手

插入操作
代码语言:javascript
代码运行次数:0
运行
复制
@Test
public void test2() throws IOException {

    // 编写实体类
    User user = new User();
    user.setName("张老三");
    user.setSex(19);
    
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = build.openSession();
    
    // 在执行更新操作时,需要传递类
    int changeRows = sqlSession.insert("userMapper.addUser", user);
    // 当 mybatis 执行更新操作时 必须提交事务才可以对数据库的结果产生影响
    sqlSession.commit();
    sqlSession.close();

}
代码语言:javascript
代码运行次数:0
运行
复制
<select id="addUser" parameterType="com.DemoTestNode.entityClass.User">
    insert into person values(null ,#{name},#{sex})
</select>
插入操作注意问题
  • 插入语句使用insert标签
  • 在映射文件中使用parmeterType属性指定要插入的数据类型
  • sql 语句中使用#{实体属性名}方式引用实体中的属性值
  • 插入操作使用的api是sqlSession.insert(“命名空间.id”,实体类型对象);
  • 插入操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务
    • 即:sqlSession.commit();
修改操作
代码语言:javascript
代码运行次数:0
运行
复制
@Test
public void test3() throws IOException {

    User user = new User();
    user.setId(104);
    user.setName("王老吉");
    user.setSex(80);

    // 获取核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = build.openSession();

    int changeRows = sqlSession.update("userMapper.updateUser",user);
    // 当 mybatis 执行更新操作时 必须提交事务才可以对数据库的结果产生影响
    sqlSession.commit();

    System.out.println(changeRows);
    sqlSession.close();
}
代码语言:javascript
代码运行次数:0
运行
复制
<update id="updateUser" parameterType="com.DemoTestNode.entityClass.User">
    update person set name=#{name},sex=#{sex} where id=#{id}
</update>
修改操作需要注意的问题
  • 修改语句使用update标签
  • 修改操作使用的API是sqlSession(“命名空间.id”,实体对象);
删除操作
代码语言:javascript
代码运行次数:0
运行
复制
@Test
public void test4() throws IOException {
    // 获取核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = build.openSession();

    int changeRows = sqlSession.delete("userMapper.delUser",104);
    // 当 mybatis 执行更新操作时 必须提交事务才可以对数据库的结果产生影响
    sqlSession.commit();

    System.out.println(changeRows);
    sqlSession.close();
}
代码语言:javascript
代码运行次数:0
运行
复制
<delete id="delUser" parameterType="java.lang.Integer">
    delete from person where id=#{id}<!-- 因为只有一个参数,所以#{}中的内容写什么都可以 -->
</delete>
删除操作需要注意的问题:
  • 删除语句使用delete标签
  • sql语句使用#{任意字符串}方式引用传递的单个参数
  • 删除操作使用的API是sqlSession.delete(“命名空间.id”,Object)
查询操作
代码语言:javascript
代码运行次数:0
运行
复制
// 查询全部
@Test
public void test1() throws IOException {

    // 获取核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

    // 获得session工厂对象
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);

    // 获得session回话对象
    SqlSession sqlSession = build.openSession();
    // 执行操作 。 参数:namespace . id
    List<User> userList = sqlSession.selectList("userMapper.findAll");

    System.out.println(userList);
    sqlSession.close();
}

// 查询单个
@Test
public void test0() throws IOException {

    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = build.openSession();

    User user = sqlSession.selectOne("userMapper.findOne", 1);

    System.out.println(user.getName());
    sqlSession.close();
}

配置文件概述:

MyBatis核心配置文件层级关系:
  • configuration 配置:
    • properties 属性
    • settings 设置
    • typeAllases 类型别名
    • typeHandlers 类型处理器
    • objectFactory 对象工厂
    • plugins 插件
    • environments 环境
      • environment 环境变量
        • transactionManager 事务管理器
        • dataSource 数据源
    • databaseIdProvider 数据库厂商表示
    • mappers 映射器
environments 标签
  • 数据库环境的配置,支持多环境配置
代码语言:javascript
代码运行次数:0
运行
复制
<environments default="developemnt"><!-- 指定默认环境名称 -->
    <environment id="developemnt"><!-- 指定当前环境的名称 -->
        <transactionManager type="JDBC"></transactionManager><!--指定事务管理类型-->
        <dataSource type="POOLED"><!-- 指定当前数据源类型是链接池 -->
        	<!-- 数据源配置 -->    
            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/test_1"/>
            <property name="username" value="root"/>
            <property name="password" value="root"/>
        
        </dataSource>
    </environment>
</environments>
environment 标签
  • 其中事务管理器(transactionManager)类型有两种:
    • JDBC:这个配置就是直接使用JDBC回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
    • MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个声明周期(比如JEE应用服务器的上下文)。默认情况它会关闭连接,因此需要将closeConnection属性设置为false来阻止它的关闭行为
  • 其中,数据源(dataSource)类型有三种:
    • UNPOOLED:这个数据源的实现知识每次被请求时打开和关闭连接
    • POOLED:这种数据源的实现利用 “池” 的概念将JDBC连接对象组织起来
    • JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置在 JNDI 上下文的引用
Mappers 标签
  • 该标签的作用是加载映射的。
代码语言:javascript
代码运行次数:0
运行
复制
<mappers>
    <mapper resource="com/DemoTestNode/mapper/UserMapper.xml"></mapper>
</mappers>
  • 加载方式有如下几种:
    • 使用相对于类路径的资源引用,例如:<mapper resource="">
    • 使用完全限定资源定位符(URL),例如:<mapper url="">
    • 使用映射器接口实现类的完全限定类名,例如:<mapper class="">
    • 将包内的映射器接口实现全部注册为映射器,例如:<package name="">
properties 标签
代码语言:javascript
代码运行次数:0
运行
复制
<properties resource="指定properties文件"></properties>
typeAliases 标签
  • 设置别名
  • 在Mybatis中,已经存在了很多别名,例如基本的数据类型
代码语言:javascript
代码运行次数:0
运行
复制
<typeAliases>
    <typeAlias type="com.DemoTestNode.entityClass.User" alias="user"></typeAlias>
</typeAliases>
SqlSession工厂构建器 SqlSessionFactoryBuilder
  • 常用API:SqlSessionFactory build(InputStream inputStream)
  • 通过加载mybatis的核心文件的输入流的形式构建一个SqlSessonFactory对象
  • 其中,Resource工具类,这个类在org.apache.ibatis.io包中。
    • Resource类帮助你从类路径下、文件兄台那个或一个web URL中加载资源文件
  • SqlSessionFactory有多个方法创建SqlSession实例。常用有如下两个: 方法解释openSession()会默认开启一个事务,但事务不会自动提交,也就意味着需要手动提交该事务,更新操作数据才会持久化到数据库中openSession(boolean autoCommit)参数为是否自动提交,如果设置为true,那么不需要手动提交事务代理开发方式
代理开发方式介绍:
  • 采用Mybaits的代理开发方式实现DAO层的开发,这种方式是我们后面进入企业的主流
  • Mapper接口开发方法只需要程序员编写Mapper接口(相等于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法
  • Mapper接口开发需要遵循以下规范
    1. Mapper.xml 文件中的namespace与mapper接口的全限定名相同
    2. Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
    3. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
    4. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Mybatis 简介
    • 问题与解决方案
    • 什么是Mybatis?
    • Mybatis快速入门
      • 开发步骤:
      • 映射文件xxxMapper.xml
      • 核心文件SqlMapConfig.xml
      • 编写测试类
  • Mybatis 上手
    • 插入操作
      • 插入操作注意问题
    • 修改操作
      • 修改操作需要注意的问题
    • 删除操作
      • 删除操作需要注意的问题:
    • 查询操作
  • 配置文件概述:
    • MyBatis核心配置文件层级关系:
    • environments 标签
    • environment 标签
    • Mappers 标签
    • properties 标签
    • typeAliases 标签
      • SqlSession工厂构建器 SqlSessionFactoryBuilder
      • 代理开发方式介绍:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档