Java基础入门day72
day72
mybatis
mybatis的实现方式
三种实现方式:
纯xml方式,namespace随便写,id随便写,只要保证整个项目namespace+id唯一即可
xml+接口的方式,namespace必须是接口的全路径,id必须是接口的方法名,结合第一种方式,接口中不允许存在重载的方法
纯注解方式,注册时需要在mybatis的核心配置文件中设置mapper的class,或者mappers下面配置package
xml+接口方式
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings><!--日志实现--><setting name="logImpl" value="STDOUT_LOGGING"/></settings> <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/mi?useSSL=false&characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="Abc@1234"/></dataSource></environment></environments><mappers><mapper resource="com/saas/dao/ProductsMapper.xml"/> <!-- <mapper class="com.saas.dao.IProductDaoAnnotation"/>--> <!-- <package name="com.saas.dao"/>--></mappers> </configuration>在mybatis-config的核心配置文件中,设置mappers节点,里面放mapper节点,mapper标签中使用resource属性加入xml文件路径
package com.saas.pojo; import lombok.Data; @Data public class Product {private int cid ;private String title ;private String subtitle;private String wtype ;private String img ;private String cdesc ;private double oprice ;private double nprice ;private int tid ; }package com.saas.dao; import com.saas.pojo.Product; import java.util.List; public interface IProductDao { List<Product> getAllProducts(); Product getProductById(int i); int updateProduct(Product product); }<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.saas.dao.IProductDao"><select id="getAllProducts" resultType="com.saas.pojo.Product">select * from products</select> <select id="getProductById" resultType="com.saas.pojo.Product">select * from products where cid = #{cid}</select> <update id="updateProduct">update products set title = #{title}, subtitle = #{subtitle}, wtype = #{wtype} , img = #{img} ,cdesc = #{cdesc} , oprice = #{oprice}, nprice = #{nprice}, tid = #{tid} where cid = #{cid}</update> </mapper>这里要特别注意:
namespace必须是接口的全路径
id必须是接口中的每个方法的方法名
由于之前mybatis中不能存在同namespace+id的场景,所以接口中不允许存在重载方法
package com.saas.dao; import com.saas.pojo.Product; import com.saas.util.SessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class TestProducts { private SqlSession session = null; @Testpublic void testGetAllProducts() { session = SessionUtil.getSession(); IProductDao iProductDao = session.getMapper(IProductDao.class); List<Product> list = iProductDao.getAllProducts(); for (Product p : list) {System.out.println(p);} SessionUtil.closeSession(session);} @Testpublic void testGetProductById() {session = SessionUtil.getSession();IProductDao iProductDao = session.getMapper(IProductDao.class);Product product = iProductDao.getProductById(1);System.out.println(product);SessionUtil.closeSession(session);} @Testpublic void testUpdateProduct() {session = SessionUtil.getSession();IProductDao iProductDao = session.getMapper(IProductDao.class); Product product = new Product();product.setCid(3);product.setTitle("iphone");product.setOprice(16999);product.setNprice(12999);product.setCdesc("iphone 15");product.setTid(1);product.setSubtitle("iphone15promax");product.setImg("ip15.jpg");product.setWtype("taobao"); int i = iProductDao.updateProduct(product); System.out.println(i > 0); SessionUtil.closeSession(session);} }这里注意,我们需要结束SqlSession对象的getMapper()方法,方法参数设置接口的类对象,来得到接口对象
一旦有了接口对象,则借助该接口对象调用接口中的方法即可完成所有的crud功能
测试完成其crud功能
纯注解方式
按照之前两种方式,最直接的结果是,每个crud方法最终都对应一个正确的SQL语句即可,所以注解方式更“直接”
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings><!--日志实现--><setting name="logImpl" value="STDOUT_LOGGING"/></settings> <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/mi?useSSL=false&characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="Abc@1234"/></dataSource></environment></environments><mappers> <!-- <mapper resource="com/saas/dao/ProductsMapper.xml"/>--><mapper class="com.saas.dao.IProductDaoAnnotation"/> <!-- <package name="com.saas.dao"/>--></mappers> </configuration>在mybatis的核心配置文件中,mappers节点放入mapper子节点,mapper标签中使用class属性来实现主责功能
或者在mappers节点中放入package子节点,里面写name为包名,那就意味着这个包下的所有dao类都可以被一次性注册到mybatis的核心工厂之上
package com.saas.dao; import java.util.List; import com.saas.pojo.Product; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; public interface IProductDaoAnnotation { @Select("select * from products")List<Product> getAllProducts(); // @Select("select * from products limit #{param1}, #{param2}") // @Select("select * from products limit #{arg0}, #{arg1}")@Select("select * from products limit #{si}, #{ps}")List<Product> getProductsByPage(@Param("si") int si, @Param("ps") int ps); @Select("select * from products where cid = #{cid}")Product getProductById(int cid); @Insert("insert into products(title,subtitle,wtype,oprice,tid,img,cdesc,nprice) " +" values(#{title},#{subtitle},#{wtype},#{oprice},#{tid},#{img},#{cdesc},#{nprice})")int saveProduct(Product product); }第三种调用方式与第二种类似
需要借助SqlSession对象的getMapper()方法,将接口的类对象传入后得到接口对象
一旦有了接口对象,则通过接口对象的crud方法完成对应的curd功能
mybatis传参
无参:SQL语句里面不写占位符
一参:SQL语句里面#{}里面写任意合法的标识符
多参:
对象传参
map传参
arg0, arg1, arg2
param1, param2, param3
@Param(“si”), @Param("si")
config配置
properties
<properties resource="db.properties"> </properties>settings
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" value="100"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="safeResultHandlerEnabled" value="true"/> <setting name="mapUnderscoreToCamelCase" value="false"/> <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/> <setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/> <setting name="callSettersOnNulls" value="false"/> <setting name="returnInstanceForEmptyRow" value="false"/> <setting name="logPrefix" value="exampleLogPreFix_"/> <setting name="logImpl" value="SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING"/> <setting name="proxyFactory" value="CGLIB | JAVASSIST"/> <setting name="vfsImpl" value="org.mybatis.example.YourselfVfsImpl"/> <setting name="useActualParamName" value="true"/> <setting name="configurationFactory" value="org.mybatis.example.ConfigurationFactory"/> </settings>类型别名
<typeAliases><typeAlias type="com.saas.pojo.Product" alias="Product"/><package name="com.saas.pojo"/></typeAliases>环境配置
<environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${user}"/><property name="password" value="${pass}"/></dataSource></environment> </environments>其中datasource的type有三个值:
unpooled:不使用连接池
pooled:使用连接池
jndi:需要额外配置应用服务器
其中transactionManager的type值有两个:
JDBC: jdbc自身的提交或者回滚来实现事务
MANAGED:由容器自动决定事务的提交或者回滚
映射器
<mappers> <!-- <mapper resource="com/saas/dao/ProductsMapper.xml"/>--><mapper class="com.saas.dao.IProductDaoAnnotation"/> <!-- <package name="com.saas.dao"/>--></mappers>映射器的配置分为两大类
mapper子节点
resource,配置xml文件的相对路径
url: 配置xml文件的 绝对路径
class:配置映射的文件类
package子节点:该包下是所有类都会被自动映射
mapper映射
cache
– 该命名空间的缓存配置。
cache-ref
– 引用其它命名空间的缓存配置。
resultMap
– 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
parameterMap
– 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。
sql
– 可被其它语句引用的可重用语句块。
insert
– 映射插入语句。
update
– 映射更新语句。
delete
– 映射删除语句。
select
– 映射查询语句。<sql id="allPro">select * from products</sql><select id="getAllProducts" resultType="abc"><include refid="allPro"/></select><select id="getProductById" resultType="abc"><include refid="allPro"/>where cid = #{cid}</select><select id="getProductsByPage" resultType="abc"><include refid="allPro"/>limit #{si}, #{ps}</select><update id="updateProduct">update products set title = #{title}, subtitle = #{subtitle}, wtype = #{wtype} , img = #{img} ,cdesc = #{cdesc} , oprice = #{oprice}, nprice = #{nprice}, tid = #{tid} where cid = #{cid}</update>
相关文章:
Java基础入门day72
day72 mybatis mybatis的实现方式 三种实现方式: 纯xml方式,namespace随便写,id随便写,只要保证整个项目namespaceid唯一即可 xml接口的方式,namespace必须是接口的全路径,id必须是接口的方法名…...

文本编辑命令和正则表达式
一、 编辑文本的命令 正则表达式匹配的是文本内容,Linux的文本三剑客,都是针对文本内容。 文本三剑客 grep:过滤文本内容 sed:针对文本内容进行增删改查 (本文不相关) awk:按行取列 &#x…...

云手机群控功能讲解
接触云手机之前,很多企业或者个人卖家都对群控有浓厚的兴趣,云手机群控具体是什么呢?云手机群控,顾名思义,是指能够同时对多台云手机进行集中控制和管理的功能。打破了传统单台手机操作的限制,实现了规模化…...

gdb用法
创建文件 // main.cpp文件 // 稳态误差 void pid_test_wentaiwucha() {float p 1.5;int t 1; // t 1s;int target 5; // 5m/sfloat output 0;float radis 3; // 稳态误差std::cout << "output: " << std::endl;fo…...

聊一聊UDF/UDTF/UDAF是什么,开发要点及如何使用?
背景介绍 UDF来源于Hive,Hive可以允许用户编写自己定义的函数UDF,然后在查询中进行使用。星环Inceptor中的UDF开发规范与Hive相同,目前有3种UDF: A. UDF--以单个数据行为参数,输出单个数据行; UDF&#…...

配置Nginx二级域名
一、环境 (一)配置 1.服务器 linux CentOS 2.反向代理 Nginx 3.开放端口 云服务器开放端口80和443 二、域名备案 (一)腾讯云 1.腾讯云域名备案流程 备注:一级域名备案后,二级域名可以不用再备案&a…...
LeetCode——判断回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而 …...
shell:使用结构化语句(for、while循环)
1. for命令 下面是bash shell中for命令的基本格式。 for var in list docommands done每次for命令遍历值列表,它都会将列表中的下个值赋给$test变量。$test变量可以像for 命令语句中的其他脚本变量一样使用。在最后一次迭代后,$test变量的值会在shell脚…...
数据结构_绪论
1.数据结构的研究内容 研究数据的特性和数据之间的关系 用计算机解决一个问题的步骤 1.具体问题抽象成数学模型 实质: 分析问题--->提取操作对象--->找出操作对象之间的关系(数据结构)--->用数学语言描述 操作对象对象之间的关系 2.设计算法 3.编程,调试,运行 …...

AI自动生成角色和情节连续的漫画,中山大学联想提出AutoStudio,可以多轮交互式连续生成并保持主题一致性。
中山大学和联想研究院提出AutoStudio: 是一种无需训练的多代理框架,用于多轮交互式图像生成,能够在生成多样化图像的同时保持主体一致性。 AutoStudio 采用三个基于 LLM 的智能体来解释人类意图并为 SD 模型生成适当的布局指导。此外,还引入…...
【经典面试题】RabbitMQ如何防止重复消费?
RabbitMQ的消息消费是有确认机制的,正常情况下,消费者在消费消息成功后,会发送一个确认消息,消息队列接收到之后,就会将该消息从消息队列中删除,下次也就不会再投递了。 但是如果存在网络延迟的问题&#…...

如何自己录制教学视频?零基础也能上手
随着在线教育的蓬勃发展,录制教学视频成为了教师和教育工作者们不可或缺的一项技能。无论是为了远程教学、课程分享还是知识普及,教学视频的录制都变得愈发重要。可是如何自己录制教学视频呢?本文将介绍两种录制教学视频的方法,这…...
【android】用 ExpandableListView 来实现 TreeView树形菜单视图
使用 ExpandableListView 来实现 TreeView 创建一个 ExpandableListAdapter 来为其提供数据。以下演示了如何使用 ExpandableListView 来展示树形结构的数据: 首先,在布局文件中添加 ExpandableListView: <ExpandableListViewandroid:i…...
策略模式与函数式编程应用
策略模式 | 单一职责原则(Single Responsibility Principle, SRP):islenone和islentwo分别根据特定条件返回电话号码 函数式编程: ‘’ if pd.isna(self.note1) else len(re.findall(r’\d, self.note1)) 重复代码: 当…...
docker原理记录C-N-A
docker原理 容器技术的兴起源于 PaaS 技术的普及 Docker 项目通过“容器镜像”,解决了应用打包这个根本性难题容器本身没有价值,有价值的是“容器编排”Cgroups 和 Namespace Cgroups 技术是用来制造约束的主要手段,而Namespace 技术则是用…...
【LeetCode】每日一题:二叉树的层次遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 解题思路 水题 AC代码 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightN…...

单体架构改造为微服务架构之痛点解析
1.微服务职责划分之痛 1.1 痛点描述 微服务的难点在于无法对一些特定职责进行清晰划分,比如某个特定职责应该归属于服务A还是服务B? 1.2 为服务划分原则的痛点 1.2.1 根据存放主要数据的服务所在进行划分 比如一个能根据商品ID找出商品信息的接口,把…...

马面裙的故事:汉服如何通过直播电商实现产业跃迁
【潮汐商业评论/原创】 波澜壮阔的千里江山在马面裙的百褶上展开,织金花纹在女性的步伐之间若隐若现,从明清到现代,如今马面裙又流行了回来,成为女性的流行单品,2024年春节期间,马面裙更是成为华夏女孩们的…...

SaaS产品运营:维护四个不同类型的合作伙伴的实战指南
在SaaS(软件即服务)行业的竞争中,与合作伙伴建立并维护良好关系至关重要。不同类型的合作伙伴对于产品的推广、市场覆盖和用户增长都起着不同的作用。如何有效维护这四种类型合作伙伴?看个案例一起学习吧。 一、合作伙伴的四种类型…...
【监控】3.配置 Grafana 以使用 Prometheus 数据源
1 访问 Grafana 打开浏览器,访问 http://localhost:3000(默认端口)。使用默认的用户名和密码 admin/admin 登录。 2 添加 Prometheus 数据源 进入 Grafana 仪表板,点击左侧菜单中的“Configuration” -> “Data Sources”。…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...