MyBatis:概念简章
1. hello world
配置文件:mybatis-config.xml(核心配置文件,用于配置连接的数据库信息)(一般一个)XxxMapper.xml 该文件用于操作表(执行sql语句)(一张表一个) 细节:执行的sql语句";"可以省略一般有resource这个单词都会从类的根路径开始扫描文件
- 配置mybatis-config.xml文件
- 配置配置xxxMapper.xml文件
- 对数据库进行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 配置文件:mybatis-config.xml(核心配置文件,用于配置连接的数据库信息)(一般一个)XxxMapper.xml 该文件用于操作表(执行sql语句)(一张表一个)…...
有什么接码平台比较好用的
接码平台,也被称作短信接收平台或虚拟号码服务,主要是提供可以接收短信验证码的虚拟手机号码服务。这种服务通常被用于需要在网络平台上注册大量账号的情况,如营销推广、应用测试或是海淘购物时所需的手机号验证。下面将推荐几个较为好用的接…...
微服务之负载均衡器
1、负载均衡介绍 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上 进行执行。 根据负载均衡发生位置的不同, 一般分为服务端负载均衡和客户端负载均衡。 服务端负载均衡指的是发生在服务提供者一方ÿ…...
《时间管理九段》前四阶段学习笔记
文章目录 0.何谓时间管理九段0.1 第一段--把一件事做好0.2 第二段--把一天过好0.3 第三段--掌控两周内的固定日程0.4 第四段--掌控两周内的弹性时间0.5 第五段--科学管理3个月的项目事件0.6 第六段--实现一年的梦想0.7 第七段--明确一生的愿景0.8 第八段--正确补充和释放自身能…...
LLVM Cpu0 新后端5 静态重定位 动态重定位
想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章: LLVM 后端实践笔记 代码在这里(还没来得及准备,先用网盘暂存一下): 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…...
旅游卡是项目还是骗局?还是实实在在的旅游项目?
旅游卡是一个实实在在的旅游项目,而非骗局。以下是我对旅游卡项目的几点分析: 项目实质: 旅游卡项目是由国内外多条旅游线路整合而成的卡片,为旅游者提供方便、实惠的旅游方式。持有旅游卡,可以完全抵销跟团游线路中的…...
大模型+RAG,全面介绍!
1 、介绍 大型语言模型(LLMs)在处理特定领域或高度专业化的查询时存在局限性,如生成不正确信息或“幻觉”。缓解这些限制的一种有前途的方法是检索增强生成(RAG),RAG就像是一个外挂,将外部数据…...
智能合约中存储和计算效率漏洞
存储和计算效率 不当的存储结构或计算密集型操作可能导致高Gas费用和性能瓶颈。示例场景:频繁读取和写入大数组 假设你正在构建一个投票系统,其中每个提案都有一个独立的计票器。为了实现这一点,你可能最初会考虑使用一个映射(m…...
软件测试基础知识总结
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、软件测试概述 1、什么是软件 定义:计算机系统中与硬件相互依存的一部分&#x…...
C语言 | Leetcode C语言题解之第143题重排链表
题目: 题解: 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…...
探寻性能优化:如何衡量?如何决策?
目录 一、衡量指标说明 (一)响应时间(Response Time) 平均响应时间(Average Response Time) 百分位数响应时间(Percentile Response Time) (二)吞吐量&a…...
Python Django 5 Web应用开发实战
Django 是一个高级 Python Web 框架,它鼓励快速开发和简洁、务实的设计。下面是一个关于如何使用 Django 开发一个包含五个基本页面的 Web 应用的实战指南。请注意,这里仅提供一个概述,实际开发中会有更多细节和步骤。 1. 安装 Django 首先,你需要安装 Django。你可以使用…...
H.264官方文档下载
H.264是ITU(International Telecommunication Union,国际通信联盟)和MPEG(Motion Picture Experts Group,运动图像专家组)联合制定的视频编码标准。其官方文档可以在ITU官网上下载:https://www.…...
minio多节点部署
MinIO 是一个高性能的分布式对象存储服务,它可以配置为多节点(或多服务器)模式以提供高可用性和数据冗余。以下是一个基本的多节点MinIO部署示例: 确保你有多个服务器或虚拟机。在每个节点上安装MinIO。使用minio server命令启动多…...
2024年工业设计与制造工程国际会议(ICIDME 2024)
2024年工业设计与制造工程国际会议 2024 International Conference on Industrial Design and Manufacturing Engineering 会议简介 2024年工业设计与制造工程国际会议是一个集结全球工业设计与制造工程领域精英的盛会。本次会议旨在为业界专家、学者、工程技术人员提供一个分享…...
一次曝 9 个大模型,「字节 AI」这一年都在做什么?
字节跳动的大模型家族,会长出下一个抖音吗? 整个 2023 年,字节并没有对外官宣其内部自研的大模型。外界一度认为,大模型这一技术变革,字节入场晚了。梁汝波在去年底的年会上也提到了这一点,他表示「字节对…...
PR基本概念数学知识
1、2基本概念 监督学习与非监督学习期望风险与经验风险结构风险最小化(SRM)与经验风险最小化(ERM)期望风险的上界过拟合数据预处理模型评价方法分类与聚类 数学知识 矩阵求逆、矩阵乘法协方差矩阵的计算特征值、特征向量的计算…...
信驰达蓝牙数字钥匙方案持续创新,助推智慧汽车生态发展
随着汽车智能化的加速发展,数字钥匙正成为全球化的新趋势,它通过数字化的手段连接人、车以及更广泛的生态,引领着出行方式的革命和用户体验的转变。数字钥匙不仅仅是一个简单的访问工具,它重新定义了人与车的互动方式,…...
校园生活服务平台的设计
管理员账户功能包括:系统首页,个人中心,管理员管理,用户管理,跑腿管理,文娱活动管理,活动申请管理,备忘录管理 前台账户功能包括:系统首页,个人中心ÿ…...
gerrit 使用
添加ssh 点击 蓝色方框 复制ssh 添加即可...
【GD32F303红枫派使用手册】第十二节 ADC-双轴按键摇杆多通道循环采样实验
12.1 实验内容 本实验是通过ADC规则组多通道循环采样方式实现双轴按键摇杆传感器x和y轴电压值的读取,通过本实验主要学习以下内容: 双轴按键摇杆传感器工作原理 DMA原理 规则组多通道循环采样 12.2 实验原理 12.2.1 双轴按键摇杆传感器工作原理 摇…...
Rust-03-数据类型
在 Rust 中,每一个值都属于某一个 数据类型,这告诉 Rust 它被指定为何种数据,以便明确数据处理方式。Rust 是 静态类型语言,也就是说在编译时就必须知道所有变量的类型。根据值及其使用方式,编译器通常可以推断出我们想…...
代理IP使用api接
代理IP使用API接口,通常是指通过API接口获取代理IP地址,并将其应用于爬虫、数据采集、反爬虫等场景中,以提高数据采集效率和保护数据采集安全。 一般来说,代理IP提供商会提供API接口文档和SDK供开发者使用。你需要先注册并登录代…...
C++中的适配器模式
目录 适配器模式(Adapter Pattern) 实际应用 图形渲染库适配器 日志系统适配器 支付系统适配器 总结 适配器模式(Adapter Pattern) 适配器模式是一种结构型设计模式,它使得原本由于接口不兼容而不能一起工作的类…...
MySQL入门学习-聚合和分组.最大值(MAX()函数)
MAX() 函数用于返回表达式的最大值。它通常与聚合和分组一起使用,以计算分组中的最大值。 以下是一些常见的聚合和分组函数: 1. MAX():返回表达式的最大值。 2. MIN():返回表达式的最小值。 3. AVG():返回表达式的…...
LLM大语言模型(十六):最新开源 GLM4-9B 本地部署,带不动,根本带不动
目录 前言 本机环境 GLM4代码库下载 模型文件下载:文件很大 修改为从本地模型文件启动 启动模型cli对话demo 慢,巨慢,一个字一个字的蹦 GPU资源使用情况 GLM3资源使用情况对比 前言 GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 …...
【JVM】JVM 的内存区域
Java虚拟机(JVM)在执行Java程序时,将其运行时数据划分到若干不同的内存区域。这些内存区域的管理对Java应用程序的性能和稳定性有着重要影响。JVM的内存区域主要包括以下几部分: 方法区(Method Area)&#…...
intel新CPU性能提升68%!却在内存上违反祖训
前几天的台北电脑展「Computex」,各家都拿出了看家本领。 老朋友 AMD 在会展上发布了最新的锐龙 9000 系列和自己家移动处理器 HX AI 系列,IPC 和能效都取得了不错的进步。 当然隔壁蓝厂 intel 也没闲着,当即就掏出了下一代的低功耗移动端处…...
stm32MP135裸机编程:修改官方GPIO例程在DDR中点亮第一颗LED灯
0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf 正点原子stm32mp135开发板&原理图 STM32Cube_FW_MP13_V1.1.0 STM32CubeIDE v1.151 需要修改那些地方 1.1 修改LED引脚 本例使用开发板的PI3引脚链接的LED作为我们点亮的第一颗LED灯,…...
探索乡村振兴新模式:发挥科技创新在乡村振兴中的引领作用,构建智慧农业体系,助力美丽乡村建设
随着科技的不断进步,乡村振兴工作正迎来前所未有的发展机遇。科技创新作为推动社会发展的重要力量,在乡村振兴中发挥着越来越重要的引领作用。本文旨在探讨如何发挥科技创新在乡村振兴中的引领作用,通过构建智慧农业体系,助力美丽…...
模板手机网站建设多少钱/郑州竞价代运营公司
撰文 | JZ专栏 | 九章算法题目描述 有一个集合组成的list,如果有两个集合有相同的元素,将他们合并。返回最后还剩下几个集合。 思路点拨 先遍历所有元素,以元素为key,元素所属的集合id为value(是一个集合)建立hashmap࿰…...
wordpress文章如何调整字体/广告咨询
与WifiMonitor.java负责监控supplicant状态不同,WifiService.java负责给supplicant下命令,WifiService.java是framework中wifi的核心模块。1 WifiService是server端,WifiManager是client端WifiService处理WifiManager发来的各种命令2 AsyncCh…...
北京商地网站建设公司/微软优化大师
SimpleAdapter是ArrayList和 ListView的桥梁。这个ArrayList里边的每一项都是一个Map<String,?>类型。 ArrayList当中的每一项 Map对象都和ListView里边的每一项进行数据绑定一一对应。 SimpleAdapter的构造函数: SimpleAdapter(Context context, List<?…...
表白网页代码/公司网站优化
在微信里面,是不能通过应用宝以外的方式去直接下载app的,但是却可以通过跳转到浏览器去下载app,因此如果刚好各位公司有刚刚上线的app,可以试试这种办法。 解决方案:弹出一个遮罩,提示用户在浏览器中打开进…...
网站推广方法有/seo自然排名优化
为什么80%的码农都做不了架构师?>>> 如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或“软件即服务”(SaaS)。 “十二要素应用程序”(12-Factor App)为构建…...
香港网站服务器/91永久免费海外地域网名
假设我们有一个0和1的数组A,考虑N [i]是从索引A [0]到A [i]的第i个子数组,被解释为二进制数。我们必须找到一个布尔答案列表,其中且仅当N [i]被5整除时,答案[i]为真。因此,如果输入类似于[0,1,1,1,1,1,1],则…...