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

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

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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//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>
编写测试类
@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 . idList<User> userList = sqlSession.selectList("userMapper.findAll");System.out.println(userList);// 释放SessionsqlSession.close();}

Mybatis 上手

插入操作

@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();}
<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();

修改操作

@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();
}
<update id="updateUser" parameterType="com.DemoTestNode.entityClass.User">update person set name=#{name},sex=#{sex} where id=#{id}
</update>
修改操作需要注意的问题
  • 修改语句使用update标签
  • 修改操作使用的API是sqlSession(“命名空间.id”,实体对象);

删除操作

@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();
}
<delete id="delUser" parameterType="java.lang.Integer">delete from person where id=#{id}<!-- 因为只有一个参数,所以#{}中的内容写什么都可以 -->
</delete>
删除操作需要注意的问题:
  • 删除语句使用delete标签
  • sql语句使用#{任意字符串}方式引用传递的单个参数
  • 删除操作使用的API是sqlSession.delete(“命名空间.id”,Object)

查询操作

// 查询全部
@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 . idList<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 标签

  • 数据库环境的配置,支持多环境配置
<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 标签

  • 该标签的作用是加载映射的。
<mappers><mapper resource="com/DemoTestNode/mapper/UserMapper.xml"></mapper>
</mappers>
  • 加载方式有如下几种:
    • 使用相对于类路径的资源引用,例如:<mapper resource="">
    • 使用完全限定资源定位符(URL),例如:<mapper url="">
    • 使用映射器接口实现类的完全限定类名,例如:<mapper class="">
    • 将包内的映射器接口实现全部注册为映射器,例如:<package name="">

properties 标签

<properties resource="指定properties文件"></properties>

typeAliases 标签

  • 设置别名

  • 在Mybatis中,已经存在了很多别名,例如基本的数据类型

<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的类型相同

在这里插入图片描述

😍❤️SSM 专栏前篇

  • 【SSM-Spring(一)】初上手Spring?别急!从最底部开始学习Spring吧!从Bean开始!本文介绍Spring程序的开发、Bean的声明周期与依赖注入概念
  • 【SSM-Spring(二)】初上手Spring?别急!从最底部开始学习Spring吧!Spring连接数据库、注解开发、Junit测试
  • 【SSM-SpringMVC(一)】Spring接入Web环境!本篇开始研究SpringMVC的使用!本文介绍了SpringMVC,以及SpringMVC的执行流程和常用注解解析
  • 【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据
  • 【SSM-Spring(三)】初上手Spring?别急!从最底部开始学习Spring吧!详细介绍SpringAOP切面编程操作和Spring编程式事务控制操作

💕👉博客专栏

  • 英语专栏-涵盖绝大多数的英语语法~~基于B站英语兔视频所作的学习笔记

  • Golang专栏-包含基础、Gin、Goam等知识

  • 云原生专栏-包含k8s、docker等知识

  • 从0开始学习云计算-华为HCIP证书

  • JUC专栏-带你快速领悟JUC的知识!

  • JVM专栏-深入Java虚拟机,理解JVM的原理

  • 基于Java研究 数据结构与算法-包含贪心算法、加权图、最短路径算法等知识

  • Docker专栏-上手热门容器技术Docker

  • SpringBoot专栏-学习SpringBoot快速开发后端

  • 项目管理工具的学习-设计技术:Maven、Git、Gradle等相关管理工具

  • JavaSE-全面了解Java基础

  • JS专栏-使用JS作的一部分实例~

  • 使用CSS所作的一部分案例

相关文章:

  • 豆瓣电影Top250数据工程实践:从爬虫到智能存储的技术演进(含完整代码)
  • 【Ansible】之inventory主机清单
  • 麒麟 v10 cgroup v1 切换 cgroup v2
  • 上海海关特展:二维码讲解“外来入侵物种”的危害!
  • 小智AI客户端使用测试(Python)
  • 让 - 艾里克・德布尔与斯普林格出版公司:科技变革下的出版业探索
  • 韩国直邮新纪元:Coupang多语言支持覆盖38国市场
  • 服务网格的“解剖学” - 控制平面与数据平面
  • VIC-2D 7.0 为平面样件机械试验提供全视野位移及应变数据软件
  • 1.3 极限
  • 生成对抗网络(GAN)深度解析:理论、技术与应用全景
  • 通用RAG:通过路由模块对多源异构知识库检索生成问答思路
  • 我用Deepseek + 亮数据爬虫神器 1小时做出輿情分析器
  • 【Java学习笔记】多态数组
  • HLS图像处理:从算法到硬件的创新加速之旅
  • 【类拷贝文件的运用】
  • Android11.0 framework第三方无源码APP读写断电后数据丢失问题解决
  • Java中的​​策略模式​​和​​模板方法模式
  • 小白学习java第18天(下):mybatis
  • Babylon.js学习之路《三、创建你的第一个 3D 场景:立方体、球体与平面》
  • 体坛联播|安切洛蒂执掌巴西男足,字母哥尝试离开雄鹿
  • 中国人民抗日战争暨世界反法西斯战争胜利80周年纪念活动标识发布
  • 印称印巴军事行动总指挥同意将局势降级
  • 权益类基金发行回暖,这些老将挂帅新基,谁值得买?
  • 上海能源科技发展有限公司原董事长李海瑜一审获刑13年
  • 消费维权周报|上周涉手机投诉较多,涉拍照模糊、屏幕漏液等