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

MyBatis:概念简章

1. hello world

配置文件:mybatis-config.xml(核心配置文件,用于配置连接的数据库信息)(一般一个)XxxMapper.xml 该文件用于操作表(执行sql语句)(一张表一个)
细节:执行的sql语句";"可以省略一般有resource这个单词都会从类的根路径开始扫描文件
  1. 配置mybatis-config.xml文件
  2. 配置配置xxxMapper.xml文件
  3. 对数据库进行CRUD操作 
<?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="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/study"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--路径映射,要操作的表--><mappers><mapper resource="mapper/EmployeeMapper.xml"/></mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--要进行CURD操作的表-->
<mapper namespace="EmployeeMapper"><!--<select id="selectUser" resultType="Blog">select * from Blog where id = 1</select>--><insert id="insertEmployee">insert into emp value (null, '姬如雪', 18, 2, '佛山');</insert>
</mapper>
    @Testpublic void testInsert() throws IOException {//获取对应的数据库配置信息(即要操作哪个数据库)InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//Resources.getResourceAsStream默认从类的根路径开始寻找文件//获取SqlSessionFactoryBuilder(通过该对象创建工厂)(一般一个数据库对应一个SqlSessionFactory)SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//获取SqlSessionFactory(通过该工厂创建SqlSession:Java程序和数据库之间的会话)SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//获取SqlSession执行sql语句(即要操作哪张表)SqlSession sqlSession = sqlSessionFactory.openSession();//执行sql语句int rows = sqlSession.insert("insertEmployee");//提交事务sqlSession.commit();System.out.println("rows:" + rows);}

上面测试代码的严谨写法

    @Testpublic void testSelectComplete() {SqlSession sqlSession = null;try {//获取SqlSessionFactoryBuild对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//获取SqlSessionFactory工厂SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));//获取SqlSession会话sqlSession = sqlSessionFactory.openSession();int rows = sqlSession.insert("insertEmployee");sqlSession.commit();System.out.println("rows:" + rows);} catch (IOException e) {if (sqlSession != null) {sqlSession.rollback();}e.printStackTrace();} finally {if (sqlSession != null) {sqlSession.close();}}}

2. 封装工具类SqlSessionUtil

由于每次都需要创建SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession对象,可以直接封装成工具类方便调用 

public class SqlSessionUtil {private static SqlSessionFactory sqlSessionFactory;static {try {sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));} catch (IOException e) {throw new RuntimeException(e);}}public static SqlSession openSession() {return sqlSessionFactory.openSession();}}
    @Testpublic void testSqlSessionUtil() {SqlSession sqlSession = SqlSessionUtil.openSession();int rows = sqlSession.insert("insertEmployee");sqlSession.commit();sqlSession.close();System.out.println("rows:" + rows);}

3. CRUD操作

3.1 增 

    #{} 占位符
1.如果传map对象:占位符里面的参数要和map集合中的键相一致才能获取map集合中的value值
2.如果传bean对象:占位符里面的参数要和bean对象的属性名保持一致才能获取bean对象的数据
<mapper namespace="EmployeeMapper"><insert id="insertEmployee">insert into emp values (null, #{name}, #{age}, #{deptId}, #{address})</insert>
</mapper>

方式一:通过传map对象

    @Testpublic void tesInsertEmployee() {SqlSession sqlSession = SqlSessionUtil.openSession();Map<String, Object> map = new HashMap<>();map.put("name", "肚肚龙");map.put("age", 3);map.put("deptId", 1);map.put("address", "广东");//执行sql语句  底层执行sql语句时会根据map集合的键占位符相匹配,若一致就将值赋给占位符#{}sqlSession.insert("insertEmployee", map);sqlSession.commit();sqlSession.close();}

方式二:通过传bean对象

public class Employee {private Integer id;private String name;private Integer age;private Integer deptId;private String address;
    @Testpublic void tesInsertEmployee() {SqlSession sqlSession = SqlSessionUtil.openSession();//执行sql语句  底层执行sql语句时会根据map集合的键占位符相匹配,若一致就将值赋给占位符#{}sqlSession.insert("insertEmployee", map);Employee e = new Employee(null, "肥奶龙", 2, 6, "江门");sqlSession.insert("insertEmployee", e);sqlSession.commit();sqlSession.close();}

3.2 删

<mapper namespace="EmployeeMapper"><delete id="deleteEmployee">delete from emp where id = #{id}</delete>
</mapper>
    @Testpublic void testDeleteEmployee() {//获取sql会话SqlSession sqlSession = SqlSessionUtil.openSession();//执行sql语句,由于删除只需要一个参数,故随便传即可,他会自动识别int rows = sqlSession.delete("deleteEmployee", 10028);sqlSession.commit();sqlSession.close();System.out.println("rows:" + rows);}

 3.3 改

<mapper namespace="EmployeeMapper"><update id="updateEmployee">update emp set name = #{name}, age= #{age}, dept_id = #{deptId}, address = #{address} where id = #{id}</update>
</mapper>
    @Testpublic void testUpdateEmployee() {//获取sql会话SqlSession sqlSession = SqlSessionUtil.openSession();Employee e = new Employee(10027, "胖胖龙", 1, 9, "长沙");//执行sql语句int rows = sqlSession.update("updateEmployee", e);sqlSession.commit();sqlSession.close();System.out.println("rows:" + rows);}

3.4 查

 

注意:因为查询的列大多要和bean对象的字段进行反射映射匹配赋值,故列要起别名保证和bean对象字段名一致
查询还有返回类型,要指定给查询标签,通过类型反射赋值为防止id冲突,需要引用命名空间,所有语句执行正确的写法为namespace.id

查询单个结果

<mapper namespace="EmployeeMapper"><select id="selectById" resultType="com.itgyl.mybatis.pojo.Employee">select id, name, age, dept_id deptId, address from emp where id = #{id}</select>
</mapper>
    @Testpublic void testSelectEmployeeById() {//获取sql会话SqlSession sqlSession = SqlSessionUtil.openSession();//执行sql语句 selectOne查询返回一个bean对象Object employee = sqlSession.selectOne("selectById", 1);sqlSession.close();System.out.println(employee);}

查询所有结果

<mapper namespace="EmployeeMapper"><select id="selectAll" resultType="com.itgyl.mybatis.pojo.Employee">select id, name, age, dept_id deptId, address from emp</select>
</mapper>
    @Testpublic void testSelectEmployeeAll() {SqlSession sqlSession = SqlSessionUtil.openSession();/*查询所有bean对象存入list集合中并返回 最严谨写法:namespace.id*/List<Object> employeeList = sqlSession.selectList("EmployeeMapper.selectAll");for (Object o : employeeList) {System.out.println(o);}sqlSession.close();}

4. mybatis-config.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标签:环境可以有多个即可以同时配置多个数据库数据库不唯一,可以配置多个数据库信息即可以创建多个SqlSessionFactory工厂default的值为:不指定创建哪个SqlSessionFactory时默认使用id为default值的数据库--><environments default="development"><environment id="development"><!--在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):transactionManage标签:事务管理器1.作用:指定mybatis用什么方式进行管理事务2.有两个type类型:1.JDBC:使用原生的jdbc管理容器coon.setAutoCommit(false)...coon.commit()2.MANAGED:mybatis不再管理事务,将事务管理器交给其他容器管理如javaEE容器进行管理(spring)--><transactionManager type="JDBC"/><!--dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。datasource:数据源1.作用:为程序提供Connection对象(但凡为程序提供Connection对象的都称为数据源)2.常见的数据源组件(常见的数据库连接池):druid等3.有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]"):1.UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。2.POOLED:使用mybatis自带的数据库连接池3.JNDI:集成其他第三方连接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/study"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--Mappers标签:路径映射,要操作的表表不唯一,可以同时配置多个表进行操作即可以创建多少SqlSession--><mappers><mapper resource="mapper/EmployeeMapper.xml"/></mappers>
</configuration>

 

 

相关文章:

MyBatis:概念简章

1. hello world 配置文件&#xff1a;mybatis-config.xml&#xff08;核心配置文件&#xff0c;用于配置连接的数据库信息&#xff09;&#xff08;一般一个&#xff09;XxxMapper.xml 该文件用于操作表&#xff08;执行sql语句&#xff09;&#xff08;一张表一个&#xff09;…...

有什么接码平台比较好用的

接码平台&#xff0c;也被称作短信接收平台或虚拟号码服务&#xff0c;主要是提供可以接收短信验证码的虚拟手机号码服务。这种服务通常被用于需要在网络平台上注册大量账号的情况&#xff0c;如营销推广、应用测试或是海淘购物时所需的手机号验证。下面将推荐几个较为好用的接…...

微服务之负载均衡器

1、负载均衡介绍 负载均衡就是将负载(工作任务&#xff0c;访问请求)进行分摊到多个操作单元(服务器&#xff0c;组件)上 进行执行。 根据负载均衡发生位置的不同&#xff0c; 一般分为服务端负载均衡和客户端负载均衡。 服务端负载均衡指的是发生在服务提供者一方&#xff…...

《时间管理九段》前四阶段学习笔记

文章目录 0.何谓时间管理九段0.1 第一段--把一件事做好0.2 第二段--把一天过好0.3 第三段--掌控两周内的固定日程0.4 第四段--掌控两周内的弹性时间0.5 第五段--科学管理3个月的项目事件0.6 第六段--实现一年的梦想0.7 第七段--明确一生的愿景0.8 第八段--正确补充和释放自身能…...

LLVM Cpu0 新后端5 静态重定位 动态重定位

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…...

旅游卡是项目还是骗局?还是实实在在的旅游项目?

旅游卡是一个实实在在的旅游项目&#xff0c;而非骗局。以下是我对旅游卡项目的几点分析&#xff1a; 项目实质&#xff1a; 旅游卡项目是由国内外多条旅游线路整合而成的卡片&#xff0c;为旅游者提供方便、实惠的旅游方式。持有旅游卡&#xff0c;可以完全抵销跟团游线路中的…...

大模型+RAG,全面介绍!

1 、介绍 大型语言模型&#xff08;LLMs&#xff09;在处理特定领域或高度专业化的查询时存在局限性&#xff0c;如生成不正确信息或“幻觉”。缓解这些限制的一种有前途的方法是检索增强生成&#xff08;RAG&#xff09;&#xff0c;RAG就像是一个外挂&#xff0c;将外部数据…...

智能合约中存储和计算效率漏洞

存储和计算效率 不当的存储结构或计算密集型操作可能导致高Gas费用和性能瓶颈。示例场景&#xff1a;频繁读取和写入大数组 假设你正在构建一个投票系统&#xff0c;其中每个提案都有一个独立的计票器。为了实现这一点&#xff0c;你可能最初会考虑使用一个映射&#xff08;m…...

软件测试基础知识总结

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、软件测试概述 1、什么是软件 定义&#xff1a;计算机系统中与硬件相互依存的一部分&#x…...

C语言 | Leetcode C语言题解之第143题重排链表

题目&#xff1a; 题解&#xff1a; struct ListNode* middleNode(struct ListNode* head) {struct ListNode* slow head;struct ListNode* fast head;while (fast->next ! NULL && fast->next->next ! NULL) {slow slow->next;fast fast->next-&g…...

探寻性能优化:如何衡量?如何决策?

目录 一、衡量指标说明 &#xff08;一&#xff09;响应时间&#xff08;Response Time&#xff09; 平均响应时间&#xff08;Average Response Time&#xff09; 百分位数响应时间&#xff08;Percentile Response Time&#xff09; &#xff08;二&#xff09;吞吐量&a…...

Python Django 5 Web应用开发实战

Django 是一个高级 Python Web 框架,它鼓励快速开发和简洁、务实的设计。下面是一个关于如何使用 Django 开发一个包含五个基本页面的 Web 应用的实战指南。请注意,这里仅提供一个概述,实际开发中会有更多细节和步骤。 1. 安装 Django 首先,你需要安装 Django。你可以使用…...

H.264官方文档下载

H.264是ITU&#xff08;International Telecommunication Union&#xff0c;国际通信联盟&#xff09;和MPEG&#xff08;Motion Picture Experts Group&#xff0c;运动图像专家组&#xff09;联合制定的视频编码标准。其官方文档可以在ITU官网上下载&#xff1a;https://www.…...

minio多节点部署

MinIO 是一个高性能的分布式对象存储服务&#xff0c;它可以配置为多节点&#xff08;或多服务器&#xff09;模式以提供高可用性和数据冗余。以下是一个基本的多节点MinIO部署示例&#xff1a; 确保你有多个服务器或虚拟机。在每个节点上安装MinIO。使用minio server命令启动多…...

2024年工业设计与制造工程国际会议(ICIDME 2024)

2024年工业设计与制造工程国际会议 2024 International Conference on Industrial Design and Manufacturing Engineering 会议简介 2024年工业设计与制造工程国际会议是一个集结全球工业设计与制造工程领域精英的盛会。本次会议旨在为业界专家、学者、工程技术人员提供一个分享…...

一次曝 9 个大模型,「字节 AI」这一年都在做什么?

字节跳动的大模型家族&#xff0c;会长出下一个抖音吗&#xff1f; 整个 2023 年&#xff0c;字节并没有对外官宣其内部自研的大模型。外界一度认为&#xff0c;大模型这一技术变革&#xff0c;字节入场晚了。梁汝波在去年底的年会上也提到了这一点&#xff0c;他表示「字节对…...

PR基本概念数学知识

1、2基本概念 监督学习与非监督学习期望风险与经验风险结构风险最小化&#xff08;SRM&#xff09;与经验风险最小化&#xff08;ERM&#xff09;期望风险的上界过拟合数据预处理模型评价方法分类与聚类 数学知识 矩阵求逆、矩阵乘法协方差矩阵的计算特征值、特征向量的计算…...

信驰达蓝牙数字钥匙方案持续创新,助推智慧汽车生态发展

随着汽车智能化的加速发展&#xff0c;数字钥匙正成为全球化的新趋势&#xff0c;它通过数字化的手段连接人、车以及更广泛的生态&#xff0c;引领着出行方式的革命和用户体验的转变。数字钥匙不仅仅是一个简单的访问工具&#xff0c;它重新定义了人与车的互动方式&#xff0c;…...

校园生活服务平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;跑腿管理&#xff0c;文娱活动管理&#xff0c;活动申请管理&#xff0c;备忘录管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff…...

gerrit 使用

添加ssh 点击 蓝色方框 复制ssh 添加即可...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...

Spring事务传播机制有哪些?

导语&#xff1a; Spring事务传播机制是后端面试中的必考知识点&#xff0c;特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发&#xff0c;全面剖析Spring事务传播机制&#xff0c;帮助你答得有…...