一.讲解MyBatis思路
一个使用JDBC或者JDBCTempalte的例子
一个使用MyBatis的例子(不和spring整合,单独使用MyBatis)
参考: MyBatis学习总结任务: 参考上述例子从0搭建起一个使用MyBatis的例子。注意:不要使用Spring 3. MyBatis基本概念: XML配置文件 SqlSessionFactory 从 SqlSessionFactory 中获取 SqlSession 映射器Mapper 其他:SqlSessionFactoryBuilder 4. Mapper XML 文件 一个简单的例子:见附件"mapper XML.zip" 查询、自动映射: 更新:useGeneratedKeys=”true”,从数据库返回新插入的主键 参数 结果集 cache 5. 动态SQL 6. MyBatis与Spring整合(例子) svn(一个MyBatis教学用案例): svn(一个使用maven、整合Spring与MyBatis的例子): svn(一个整合SpringMVC、MyBatis与EasyUi的例子):
MyBatis工具MyBatis Generator 详解
日志
MyBatis进阶重要参考资料-MyBatis相关工具
二.MyBatis官方文档入门导读
应事先给出一个配置好的mybatis案例,在案例上进行学习实践。 官方文档主要用来查询基本概念,不适合新手从头到尾浏览。
1. 入门
2. XML配置
熟练掌握:typeAliases、映射器(mappers) 简单了解:typeHandlers、对象工厂(objectFactory)
3. Mapper XML映射文件(重点掌握)
3.1 基本概念
SQL 映射文件有很少的几个顶级元素:cache、cache-ref、resultMap、sql、insert、update、delete、select。
resultMap
:描述如何从数据库结果集中来加载对象,即如何将字段名映射到对象属性。
3.2 insert
insert
: 插入。如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置到目标属性上就OK了。例如,如果上面的 Author 表已经对 id 使用了自动生成的列类型,那么语句可以修改为:
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
则插入后得到的Author对象的id属性为新插入记录所得到的id值。
插入多行,传入一个Authors数组或集合,并返回自动生成的主键:
insert into Author (username, password, email, bio) values
(#{item.username}, #{item.password}, #{item.email}, #{item.bio})
对于不支持自动生成类型的数据库或可能不支持自动生成主键 JDBC 驱动来说,MyBatis 有另外一种方法来生成主键。使用insert语句的selectKey 子元素,selectKey例子如下(这里只是一个演示selectKey的例子,MySql数据本身可以支持自动生成主键)
SELECT LAST_INSERT_ID()
insert into college (name)
values (#{name,jdbcType=VARCHAR})
3.3 参数(Parameters):
select id, username, password
from users
where id = #{id}
这个简单的例子中,可以不用设置parameterType 。如果参数是一个对象,例子如下:
insert into users (id, username, password)
values (#{id}, #{username}, #{password})
其中User为参数,id、username、password均为User对象的属性。 参数也可以指定一个特殊的数据类型,如#{property,javaType=int,jdbcType=NUMERIC}
。 保留两位小数的例子:#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}
但一般来说,仅需指定属性名,其他的事情 MyBatis 会自己去推断,最多你需要为可能为空的列名指定 jdbcType,例子如下:
#{middleInitial,jdbcType=VARCHAR}
#{lastName}
默认情况下,使用#{}格式的语法会导致 MyBatis 创建预处理语句属性并安全地设置值(比如?)。这样做更安全,更迅速,通常也是首选做法
3.4 sql
:可被其他语句引用的可重用语句块
例子如下:
${alias}.id,${alias}.username,${alias}.password
这个 SQL 片段可以被包含在其他语句中,例如:
select
,
from some_table t1
cross join some_table t2
3.5 Result Maps
resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事情。
select id, username, hashedPassword
from some_table
where id = #{id}
这个例子中id, username, hashedPassword属性映射到User对象的相应属性。如果列名没有精确匹配,你可以在列名上使用 select 字句的别名(一个 基本的 SQL 特性)来匹配标签
select
user_id as "id",
user_name as "userName",
hashed_password as "hashedPassword"
from some_table
where id = #{id}
也可以用resultMap来解决:
select user_id, user_name, hashed_password
from some_table
where id = #{id}
3.6 高级结果映射:
一个复杂查询的例子
select
B.id as blog_id,
B.title as blog_title,
B.author_id as blog_author_id,
A.id as author_id,
A.username as author_username,
A.password as author_password,
A.email as author_email,
A.bio as author_bio,
A.favourite_section as author_favourite_section,
P.id as post_id,
P.blog_id as post_blog_id,
P.author_id as post_author_id,
P.created_on as post_created_on,
P.section as post_section,
P.subject as post_subject,
P.draft as draft,
P.body as post_body,
C.id as comment_id,
C.post_id as comment_post_id,
C.name as comment_name,
C.comment as comment_text,
T.id as tag_id,
T.name as tag_name
from Blog B
left outer join Author A on B.author_id = A.id
left outer join Post P on B.id = P.blog_id
left outer join Comment C on P.id = C.post_id
left outer join Post_Tag PT on PT.post_id = P.id
left outer join Tag T on PT.tag_id = T.id
where B.id = #{id}
其对应的resultMap如下:
在这个例子中涉及到的对象由Blog、Author、Post、Comment、Tag。
一个Blog对应一个Author,一个Post集合(一对多)。
Post集合中的每个Post对应一个Author、一个Comment集合、一个Tag集合、一个DraftPost(如果draft列的值为1的时候)。
构造方法 :
对应下面这个对象的构造方法
public class User {
//...
public User(int id, String username) {
//...
}
//...
}
3.7 id & result:
id 表示的结果将是当比较对象实例时用到的标识属性。这帮助来改进整体表现,特别是**缓存和嵌入结果映射(也就是联合映射) **。总的来说id就是用于标识对象,以方便缓存,在随后的对象组装、执行查询时,速度更快。
3.8 关联( ,一对一)
关联元素处理“有一个”类型的关系。比如,在我们的示例中,一个博客有一个用户。见下面的使用resultMap映射对象 。
加载关联对象,如上面的查询中,查询一个博客时同时加载与该博客对应的用户对象。可以有两种方式:
嵌套查询:通过执行另外一个SQL映射语句(产生N+1问题)
嵌套结果:使用嵌套结果映射。如上面的复杂SQL语句,一下就把多个表中的所有数据取出。也是我们比较熟悉的一种查询方式。
嵌套查询 的一个例子:
SELECT * FROM BLOG WHERE ID = #{id}
SELECT * FROM AUTHOR WHERE ID = #{id}
既然嵌套查询会带来N+1性能问题,什么时候使用嵌套查询呢?
比如上面的selectBlog返回的Blog对象,包含一个Author对象。有的时候我们只需加载Blog对象,只有在需要的时候再加载Author对象。那么我们可以使用嵌套查询,只有在需要的时候再执行selectAuthor,当然这会执行两条select语句。这就是所谓的MyBatis的延迟加载。
MyBatis 能延迟加载这样的查询就是一个好处,因此你可以分散这些语句同时运行的消耗。然而,如果你加载一个列表,之后迅速迭代来访问嵌套的数据,你会调用所有的延迟加 载,这样的行为可能是很糟糕的。如一个Author有一个Post集合(n个post),如果你使用懒加载,然后在程序中遍历这个Post集合(可能是一个List),那么你还要执行n个selectPost语句。
3.9 延迟加载
例子如下:
1.首先需要在mybatis-config.xml中加入如下配置,才能使延迟加载功能生效
2.相应的mapper文件中加入如下设置:
select * from student where id= #{id}
select * from College where id =#{id}
3.测试代码如下:
@Test
public void test0SelectStudentLazyLoadOneToOne(){
System.out.println("TestCollege.test0SelectStudentLazyLoadOneToOne()");
SqlSession session;
session = sqlSessionFactory.openSession();
int id = 1;
try {
System.out.println("=====测试LazyLoad=====");
StudentMapper mapper = session.getMapper(StudentMapper.class);
Student student = mapper.selectStudentLazyLoad(id);
System.out.println(student.getName());
System.out.println("=====现在才开始加载College=====");
System.out.println(student.getCollege());
} finally {
session.close();
}
}
对Collection的延迟加载也适用。
4.如果全局打开延迟加载,但希望对个别方法进行积极加载,可以设置fetchType为eager:
实验证明: 如果不进行任何设置,那么默认为积极加载。只能通过在 设置设置为全局懒加载,然后对个别方法设置为积极加载,如上例。
3.10 多表联合查询解决N+1性能问题
延迟加载会碰到N+1性能问题。碰到这种问题,我们一般直接使用嵌套结果方式(联合查询),例子如下。
select
B.id as blog_id,
B.title as blog_title,
B.author_id as blog_author_id,
A.id as author_id,
A.username as author_username,
A.password as author_password,
A.email as author_email,
A.bio as author_bio
from Blog B left outer join Author A on B.author_id = A.id
where B.id = #{id}
我们看到,只使用了一条select语句。就把两个对象的值一次性填入。 resultMap还支持使用前缀columnPrefix重用映射。具体例子见官网
3.11 集合 :
对应private List posts;
一个集合嵌套查询的例子:
SELECT * FROM BLOG WHERE ID = #{id}
SELECT * FROM POST WHERE BLOG_ID = #{id}
javaType也可不需要,也可简化为:
3.12 集合的嵌套结果(更常用)
select
B.id as blog_id,
B.title as blog_title,
B.author_id as blog_author_id,
P.id as post_id,
P.subject as post_subject,
P.body as post_body,
from Blog B
left outer join Post P on B.id = P.blog_id
where B.id = #{id}
3.13 鉴别器
对于某一列的不同值,可能对应不同类型的对象,可以使用
,如下属例子
一个简单的例子
详解见官方文档。
3.14 自动映射
一般情况可以直接列名映射为属性名(忽略大小写),如 ID列(数据库字段)->id属性(对象属性)。 通常数据库列使用大写单词命名,单词间用下划线分隔,如User_Name
;而java属性一般遵循驼峰命名法(userName)。 为了在这两种命名方式之间启用自动映射,需要将 mapUnderscoreToCamelCase设置为true。 即在mybatis-config.xml中设置
`
还可以混合使用自动映射和配置映射(id和userName被自动映射,hashed_password 列将根据配置映射):
select
user_id as "id",
user_name as "userName",
hashed_password
from some_table
where id = #{id}
3.15 缓存
使用
开启,默认情况下没有开启。 一个例子
这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会 导致冲突。
详见官方文档。 具体例子见后面缓存。
4. 动态SQL(重点掌握)
5. Java API(简单了解)
专题1.使用resultMap映射对象(sql语句映射)
如果使用JDBC从数据库获取数据的一般流程:
创建Connection
使用PreparedStatement执行sql语句
使用ResultSet获取数据,并创建model对象,执行对象的setter方法为对象赋值。
关闭ResultSet、PreparedStatement、Connection
其中第2、3步,mybatis可使用配置文件来完成。 假设有如下sql语句:select e.*,s.id as siteId,s.name as siteName, s.longitude as longitude,s.latitude as latitude from t_equipment e, t_site s where e.sid = s.id
,相关的model对象如下:
public class Site {
private Integer id;
private String name;
private Double longitude;
private Double latitude;
......
}
public class EquipmentDetail {
private Integer id;
private Site site;//注意这里
private String name;
private String type;
private String version;
private String brand;
private String phonenumber;
.....
}
传统的对象组装流程:
EquipmentDetail equipment = new EquipmentDetail();
Site site = new Site();
//从resultset中取指定列名的数据,执行对应的equipment的setter方法,
//从resultset中取指定列名的数据,执行对应的一堆site的setter方法
equipment.setSite(site);
//组装完毕
上面这个过程完全写好配置文件,让mybatis按照配置文件进行自动组装,而无需自己编写代码。 上面的过程主要包含几个关键信息: 1. 列名及其对应的属性名。 2.主键、外键信息。 对应的mybatis配置文件如下:
select e.*,s.id as siteId,s.name as siteName, s.longitude as longitude,s.latitude as latitude from t_equipment e, t_site s where e.sid = s.id
其中resultMap="EquipmentDetailResultMap"
表示当sql语句取到数据后可按照其配置信息来进行对象的组装。 实际上resultMap="EquipmentDetailResultMap"
就是代表对象组装的配置信息。这个配置信息可以在多个地方用到。比如下面这段配置信息也复用到了EquipmentDetailResultMap
select e.*,s.id as siteId,s.name as siteName, s.longitude as longitude,s.latitude as latitude from t_equipment e, t_site s where e.sid = s.id and e.id = #{id}
结论: resultMap 用来描述组装数据到对象这样的一个过程,并且可以很方便的进行复用。这使我们无需使用硬编码的方式进行繁琐的组装对象的过程。只需要写好配置文件,mybatis就默默地按照配置文件的指示完成对象的组装。
参考
Mybatis 高级结果映射 ResultMap Association Collection
专题2.动态SQL
动态指定条件子句: 使用
:
select e.*,s.id as siteId,s.name as siteName, s.longitude as longitude,s.latitude as latitude from t_equipment e, t_site s where e.sid = s.id
and s.id = #{sid}
and e.name like '%${name}%'
也可以使用
SELECT * FROM BLOG
state = #{state}
AND title like #{title}
AND author_name like #{author.name}
MyBatis还支持: choose, when, otherwise表达式,只选择其中一个 trim, set(更新的时候用) foreach(对集合进行遍历,常用语sql中包含IN)
SELECT *
FROM POST P
WHERE ID in
#{item}
专题3.MyBatis Generator
安装插件:Eclipse Market中安装MyBatis Generator插件
新建配置文件:在项目src目录中选择File-New-Other-MyBatis Generator Configuration File
运行:配置文件建立好后,右键点击该配置文件选择“Generate MyBatis/iBATIS Artifacts”。或者直接点击Run as....
使用MyBatis Generator自动生成相关文件后,还需自行在mybatis-config.xml中添加 。
第2步建立的配置文件内容:
主要说明:
指定连接数据库的jar
targetRuntime="MyBatis3Simple"
不生成Example
数据库连接配置
配置实体类,targetProject填入相对路径
mapper配置文件
mapper java文件,如dao文件
对所有的表都生成相关文件
标识id为主键,且insert时会返回刚插入对象的主键。
配置文件详解请见:MyBatis Generator 详解
专题4.MyBatis中的缓存
MyBatis中缓存分为一级缓存和二级缓存:
一级缓存的作用域:session。 只要session不关闭,对相同记录的访问都可从一级缓存中直接取出。如果开两个session,如session1、session2,那么即使session1已经获取到某条记录,session2获取相同记录时仍需访问数据库。 session关闭(close)后,一级缓存中的内容清空。执行CUD(增、改、删)操作时,缓存中的内容也将清空。。
二级缓存的作用域:namespace。 在同一个namespace中开两个session,不同的session取相同记录会从二级缓存中获取。
缓存说明:
映射语句文件中的所有 select 语句将会被缓存。
映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
注意: 最好打开log4j以方便查看是否从缓存中取数据
缓存参考资料:
MyBatis学习总结(七)——Mybatis缓存
官网参考资料
参考资料:
mybatis官方中文文档MyBatis Generator 详解重要参考资料-MyBatis相关工具 说明: 涉及MyBatis的方方面面,包含几个MyBatis框架的例子外部链接-MyBatis魔法堂:即学即用篇 说明: 前期例子不整合spring的例子,后期例子整合spring。
你可能感兴趣的:(mybatis,数据库,mysql,java,hibernate)
清晰易懂的Java8安装教程
Tee xm
windows java
小白也能看懂的Java8安装教程(JDK和JRE分目录安装)本教程将手把手教你如何在Windows系统上安装Java8(JDK1.8),并将JDK和JRE安装到不同的目录中,同时提供国内Java8下载源和方法。即使你是编程小白,也能轻松学会!一、准备工作操作系统:Windows10或更高版本。下载工具:一个浏览器(如Chrome、Edge)。存储空间:确保你的电脑有至少500MB的可用空间。二、下
Python 的 ORM(Object-Relational Mapping)工具浅讲
Code_Geo
python 开发语言
SQLAlchemy相关讲解1.SQLAlchemy是什么?定义:一个Python的ORM(Object-RelationalMapping)工具,允许开发者通过Python类与对象操作数据库,而非直接编写SQL。核心组件:Core:底层SQL表达式语言,提供数据库无关的SQL操作接口。ORM:基于Core的高层抽象,将数据库表映射为Python类(模型),记录映射为对象。适用场景:需要灵活操作数
AI 时代,学习 Java 应如何入手?
琢磨先生David
人工智能 java
一、Java的现状:生态繁荣与AI融合的双重机遇在2025年的技术版图中,Java依然稳坐企业级开发的“头把交椅”。根据行业统计,Java在全球企业级应用中的市场份额仍超过65%,尤其在微服务架构、大数据平台和物联网(IoT)领域占据核心地位。随着云原生技术的普及,Java生态正经历新一轮进化:轻量化框架通过无服务器架构优化,启动速度提升300%,内存占用降低50%,使得Java在容器化部署中更具
Java 处理 json 格式数据解析为 csv 格式
李昊哲小课
数据分析 Java 大数据 java json 开发语言 大数据 数据分析
Java处理json格式数据解析为csv格式如果不使用JSON工具库,你可以手动解析JSON格式字符串并将其转换为CSV格式字符串。以下是一个简单示例,展示如何实现这一功能。示例代码下面的示例代码手动处理JSON字符串,将其转换为CSV格式字符串:/***接收JSON字符串,去掉开头和结尾的方括号,按对象划分。*通过extractKeys方法提取字段名,添加到CSV的第一行。*逐项解析JSON对象
Java数据类型 Arrays VS ArraysList VS LikedList 解析
fantasy_4
Java java
在学习Java过程中,在刷题时总是搞不清楚这三种数据结构的区别,打算写篇文章记录一下ArraysVSArrayListArrayListVSLinkedList总结ArraysVSArrayListArraysArrayList类型Java的基本数据类型Java集合框架中的一个类,实现了List接口存储内容基本数据类型+对象引用对象引用可变性数组长度创建后不可变长度可变适用场景查询元素会比较快,直
信创系统安全优化与持续改进策略有哪些?
weixin_37579147
系统安全 安全
信创系统(信息技术应用创新系统)的安全优化与持续改进是保障国产化技术生态安全可靠运行的关键。以下从技术、管理、组织等多个维度提出系统性策略,并结合实际场景展开说明:一、技术层面的安全优化策略1.核心组件安全加固国产化组件漏洞管理:建立针对国产操作系统(如统信UOS、麒麟)、数据库(达梦、OceanBase)的漏洞扫描与修复机制,联合厂商建立漏洞情报共享平台。硬件层可信计算:采用基于国产芯片(如鲲鹏
HashMap 的底层实现
宋发元
哈希算法 算法
HashMap的底层实现HashMap简介HashMap主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一,是非线程安全的。HashMap可以存储null的key和value,但null作为键只能有一个,null作为值可以有多个JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.
vue3+springboot电影院售票选座管理系统
qq_3166678367
spring boot 后端 java
目录本系统(已开发完成)->成品实现截图开发技术本系统支持的技术栈源码获取详细视频演示:文章底部获取博主联系方式!!!!本课题重点核心代码部分展示论文提纲来自指导老师帅的肯定视频演示/源码获取本系统(已开发完成)->成品实现截图开发技术关键技术实现:在Java的开发过程中,可以使用HTML、CSS、JavaScript等前端技术来实现系统的用户界面设计和交互功能。后端可以使用Java语言编写业务逻
NL2SQL 优化之 Schema 编写标准
kakaZhui
oracle 数据库 AIGC python llama chatgpt
写在前面在自然语言转SQL(NL2SQL,或Text-to-SQL)任务中,数据库Schema的质量和表示方式对模型的性能有着至关重要的影响。一个清晰、规范、易于理解的Schema能够帮助模型更好地理解数据库结构,从而生成更准确的SQL查询。相反,一个混乱、不规范的Schema会增加模型的理解难度,导致生成的SQL查询错误百出。本文将深入探讨NL2SQL任务中Schema的编写标准,详细介绍如何为
weixin049校园外卖平台设计与实现+ssm(文档+源码)_kaic
开心毕设kaic_kaic
模拟退火算法 散列表 随机森林 支持向量机 启发式算法 逻辑回归
校园外卖平台设计与实现摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了校园外卖平台的开发全过程。通过分析校园外卖平台管理的不足,创建了一个计算机管理校园外卖平台的方案。文章介绍了校园外卖平台的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。本校园外卖平台有管理员,用户,商家。管理员功能有个人中心,用户管理,商家管理,菜
2025年计算机毕业设计springboot 智慧社区管理系统
zhihao503
课程设计 spring boot 后端
本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容选题背景关于智慧社区管理系统的研究,现有成果多聚焦于单一功能模块的数字化(如物业缴费或门禁系统),缺乏对多场景服务整合与用户体验优化的系统性研究。国外研究侧重物联网技术应用(如新加坡“智慧国”计划中的社区传感器网络),而国内研究更多关注管理平台的基础框架设计,但针对业主、物业、设备多方
java实现二叉树的深度优先遍历
开往1982
深度优先 算法 java
深度优先三种遍历方法1.先序遍历2.中序遍历3.后序遍历1.定义树节点(这里我重构了tostring方法)packagecom.data.tree;publicclassNode{intvalue;Nodeleft;Noderight;publicNode(intval){value=val;}@OverridepublicStringtoString(){return"Node[value="+
java for循环内执行多线程
m0_74823434
面试 学习路线 阿里巴巴资料职业发展 java python 开发语言 后端
目录一、java用多线程来加快循环效率(推荐第3种!!!!)?第一种:线程池搭配闭锁?第二种:分页概念执行线程?第三种:分页概念执行线程进阶版!!!!一、java用多线程来加快循环效率(推荐第3种!!!!)第一种:线程池搭配闭锁涉及知识:Executors(线程池)、CountDownLatch(闭锁)优点:代码简洁,方便阅读,性能稳定;缺点:Executors创建的线程池是公用的,如果多个地方使
MyBatisPlus 代码生成器如何使用?一篇文章学会它!!!
程序猿ZhangSir
Java 数据库 # MyBatis java spring 数据库
目录一.MP代码生成器简介二.准备工作2.1建立数据库和表2.1创建项目三.编写工具类3.1创建类3.2定义数据库连接变量3.3定义单表代码生成函数3.4扩展为任意表自动生成代码四.测试代码生成器4.1测试单表生成model方法一.MP代码生成器简介代码生成器是MyBatis-Plus提供的一个非常实用的功能,可以快速生成Entity、Mapper、MapperXML、Service、Contro
MyBatis-Plus分页查询IPage的使用方法,如何自定义分页查询功能?
程序猿ZhangSir
Spring全家桶 微服务 # MyBatis mybatis 开发语言
目录1.MyBatis-Plus分页插件介绍2.准备工作-创建项目配置环境2.1创建数据库表Product商品表2.2创建Maven项目,创建包,接口,类2.3添加MyBatisPlus依赖和Lombok插件2.4编写Configuration分页插件配置文件2.5编写application.properties配置文件2.6实体类代码,接口代码3.IPage分页的使用方式4.自定义分页查询5.Q
【数据库】MySQL的索引详解
此木|西贝
数据库 数据库 mysql
简介索引是一种用于快速查询和检索数据的数据结构,类似于书的目录。在几百页的书通过几页目录就可以精确定位到我们想看的章节优点和缺点优点正确的使用索引可以大大提高检索速度可以使用唯一索引保证数据在库中的唯一性使用聚合索引减少回表,降低IO次数缺点索引不宜创建的太多,否则增删改时不仅修改数据,还要修改大量的索引数据索引也会占用磁盘空间索引结构B树:多路平衡查找树,B树的所有节点都会存储key(索引)和d
【数据库】MySQL事务详解
此木|西贝
数据库 数据库 mysql
事务的隔离级别读未提交(read-uncommitted):最低级的隔离级别,允许其他事务读到未提交的值;读已提交(read-committed):事务只能读取到其他事务提交的数据;可重复读(repeatable-read):对同一条数据多次读取结果都是一样(mysql默认隔离级别);串行化(serializable):最高的隔离级别,所有事务穿行执行,事务间不会产生干扰隔离级别存在的问题读未提交
Java开发者必看!零成本集成DeepSeek-R1打造AI办公神器,源码级实战教程让你效率翻倍!
Leaton Lee
java 人工智能 开发语言
目录开篇互动一、为什么是DeepSeek-R1?它凭什么碾压传统AI工具?二、手把手部署DeepSeek-R1本地环境(附避坑指南)步骤1:Docker一键部署步骤2:下载模型步骤3:验证部署三、Java整合DeepSeek-R1:从理论到实战1.添加HTTP客户端依赖(以SpringBoot为例)2.封装AI工具类(核心代码解析)3.实战场景1:自动生成周报(附Prompt技巧)四、高阶玩法:A
列出0 racle Forms配置文件?思维导图 代码示例(java 架构)
用心去追梦
java 架构 开发语言
OracleForms配置文件OracleForms应用程序的配置涉及到多个文件,这些文件用于定义运行时环境、数据库连接、安全设置等。以下是与OracleForms相关的常见配置文件:1.formsweb.cfg位置:通常位于/forms/server/formsweb.cfg或WebLogic域中的指定目录。用途:此文件包含启动Forms应用所需的各种参数和属性,如表单模块名称、数据库连接字符串
小白学java日记day22--单例实例
兰翎翡竹
定义一个类只允许有一个对象,建立一个全局的访问点,提供出去供大家使用.分析:1.我们肯定要建立一个单例类来描述2.只允许有一个对象3.全局的访问点:说的就是当前的s----通过static实现的4.提供出去5.给大家使用总括:1.传值.作为全局的访问点.解决一个全局使用的类,频繁创建和销毁。拥有对象的唯一性,并保证内存中对象的唯一。可以节省内存,因为单例共用一个实例,有利于Java的垃圾回收机制。
Java集合之HashSet集合
小白的编程日记
java java
文章目录前言一、HashSet集合特点二、HashSet集合的初始化三、HashSet集合中的成员方法1.添加集合元素2.删除集合元素3.查询集合元素4.修改集合元素5、其他成员方法四、集合的遍历总结前言HashSet集合继承了AbstractSet类,实现了Set接口。其框架图如下:一、HashSet集合特点存放单列元素,无序而且不重复。线程不安全,效率高。集合元素可以为null。没有下标,不可
深入理解 TypeScript 中的迭代器(Iterators)与生成器(Generators)
念九_ysl
typescript 前端 typescript
一、为什么需要迭代协议?在现代JavaScript/TypeScript开发中,我们经常需要处理各种集合型数据:数组、Map、Set甚至是自定义数据结构。ES6引入的迭代协议(IterationProtocols)正是为了解决统一遍历机制的问题。通过迭代器模式,我们可以:为不同的数据结构提供统一的访问接口实现惰性计算(LazyEvaluation)支持现代语言特性(for...of,扩展运算符等)
Neo4j GDS-02-graph-data-science 简单聊一聊图数据科学插件库
后端java
neo4japoc系列Neo4jAPOC-01-图数据库apoc插件介绍Neo4jAPOC-01-图数据库apoc插件安装neo4jonwindows10Neo4jAPOC-03-图数据库apoc实战使用使用Neo4jAPOC-04-图数据库apoc实战使用使用apoc.path.spanningTree最小生成树Neo4jAPOC-05-图数据库apoc实战使用使用labelFilter是什么?
YashanDB日志管理
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E6%95%B0%E6%8D%AE%...日志管理章节所述范围为运维相关的日志管理,不包括与数据相关的redo/归档日志,对于redo/归档日志的管理将在文件管理章节描述。日志分类YashanDB的运维类日志分类如下:运行日志runlog:运行日志记录了数据库各服务运
如何有效判断与排查Java GC问题
java算法
目录一、GC的重要性与对性能的影响(一)GC对性能的影响简要分析1.GC暂停与应用停顿2.GC吞吐量与资源利用率3.GC对内存管理的作用:资源回收4.GC策略与优化的选择(二)GC的双刃剑二、GC性能评价标准(一)GC性能评价标准:延迟(Latency)与吞吐量(Throughput)延迟STW(Latency)吞吐量(Throughput)(二)SLA与实际业务需求的结合1.如何结合SLA和GC
06.动态代理设计模式
java
06.动态代理设计模式目录介绍01.为何要动态代理1.1为何要动态代理1.2动态代理思考02.动态代理的概念2.1动态代理定义2.2动态代理类比理解2.3动态代理参与者2.4动态代理步骤03.动态代理的实现3.1罗列一个场景3.2用一个例子理解代理3.3基于接口动态代理3.4基于类动态代理3.5动态代理模版代码04.动态代理案例4.1动态代理和反射4.2Java中代理4.3Retrofit核心思想
Java的泛型
一朵忧伤的蔷薇
java windows 开发语言
Java的泛型(Generics)是一种编程技术,它允许类、接口和方法在定义时使用参数化类型。通过泛型,可以编写更加通用和类型安全的代码。以下是Java泛型的一些关键知识点:1.泛型类(GenericClass)定义泛型类时,使用尖括号{privateTt;publicvoidset(Tt){this.t=t;}publicTget(){returnt;}}这里的T是一个类型参数,可以在实例化类时
Java的正则表达式
一朵忧伤的蔷薇
java 正则表达式 开发语言
Java中的正则表达式(RegularExpressions,简称regex)是一种强大的工具,用于在字符串中搜索、匹配和替换特定的模式。以下是Java正则表达式的一些基础知识点:1.基本语法字符类:.匹配任意单个字符(除了换行符)。\d匹配任意数字,相当于[0-9]。\D匹配任意非数字。\w匹配任意字母、数字或下划线,相当于[a-zA-Z0-9_]。\W匹配任意非字母、数字或下划线。\s匹配任意
如何在MySQL中创建定时任务?
数据库mysql
在mysql中我们可以可以通过事件调度器(EventScheduler),让MySQL定时为我们执行一些任务。例如:在MySQL中实现每天凌晨0点定时清空指定的test表,并在一个月后自动停止该定时任务。以下是完整步骤:步骤1:启用MySQL事件调度器默认情况下事件调度器可能关闭,需手动启用:--临时启用(重启失效)SETGLOBALevent_scheduler=ON;--永久启用(修改配置文件
使用sqlite创建数据库
@云初
sqlite 数据库 database
使用sqlite创建数据库#sqlite3.exe数据库名.dbSQLiteversion3.36.02021-06-1818:36:39Enter".help"forusagehints.sqlite>在sqlite里面创建一张表并添加数据#.databases#.tables#createtableperson(idint,namevarchar(20),addressvarchar(20))
二分查找排序算法
周凡杨
java 二分查找 排序 算法 折半
一:概念 二分查找又称
折半查找(
折半搜索/
二分搜索),优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而 查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表 分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步
java中的BigDecimal
bijian1013
java BigDecimal
在项目开发过程中出现精度丢失问题,查资料用BigDecimal解决,并发现如下这篇BigDecimal的解决问题的思路和方法很值得学习,特转载。
原文地址:http://blog.csdn.net/ugg/article/de
Shell echo命令详解
daizj
echo shell
Shell echo命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:
echo string
您可以使用echo实现更复杂的输出格式控制。 1.显示普通字符串:
echo "It is a test"
这里的双引号完全可以省略,以下命令与上面实例效果一致:
echo Itis a test 2.显示转义
Oracle DBA 简单操作
周凡杨
oracle dba sql
--执行次数多的SQL
select sql_text,executions from (
select sql_text,executions from v$sqlarea order by executions desc
) where rownum<81;
&nb
画图重绘
朱辉辉33
游戏
我第一次接触重绘是编写五子棋小游戏的时候,因为游戏里的棋盘是用线绘制的,而这些东西并不在系统自带的重绘里,所以在移动窗体时,棋盘并不会重绘出来。所以我们要重写系统的重绘方法。
在重写系统重绘方法时,我们要注意一定要调用父类的重绘方法,即加上super.paint(g),因为如果不调用父类的重绘方式,重写后会把父类的重绘覆盖掉,而父类的重绘方法是绘制画布,这样就导致我们
线程之初体验
西蜀石兰
线程
一直觉得多线程是学Java的一个分水岭,懂多线程才算入门。
之前看《编程思想》的多线程章节,看的云里雾里,知道线程类有哪几个方法,却依旧不知道线程到底是什么?书上都写线程是进程的模块,共享线程的资源,可是这跟多线程编程有毛线的关系,呜呜。。。
线程其实也是用户自定义的任务,不要过多的强调线程的属性,而忽略了线程最基本的属性。
你可以在线程类的run()方法中定义自己的任务,就跟正常的Ja
linux集群互相免登陆配置
林鹤霄
linux
配置ssh免登陆
1、生成秘钥和公钥 ssh-keygen -t rsa
2、提示让你输入,什么都不输,三次回车之后会在~下面的.ssh文件夹中多出两个文件id_rsa 和 id_rsa.pub
其中id_rsa为秘钥,id_rsa.pub为公钥,使用公钥加密的数据只有私钥才能对这些数据解密 c
mysql : Lock wait timeout exceeded; try restarting transaction
aigo
mysql
原文:http://www.cnblogs.com/freeliver54/archive/2010/09/30/1839042.html
原因是你使用的InnoDB 表类型的时候,
默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,
因为有的锁等待超过了这个时间,所以抱错.
你可以把这个时间加长,或者优化存储
Socket编程 基本的聊天实现。
alleni123
socket
public class Server
{
//用来存储所有连接上来的客户
private List<ServerThread> clients;
public static void main(String[] args)
{
Server s = new Server();
s.startServer(9988);
}
publi
多线程监听器事件模式(一个简单的例子)
百合不是茶
线程 监听模式
多线程的事件监听器模式
监听器时间模式经常与多线程使用,在多线程中如何知道我的线程正在执行那什么内容,可以通过时间监听器模式得到
创建多线程的事件监听器模式 思路:
1, 创建线程并启动,在创建线程的位置设置一个标记
2,创建队
spring InitializingBean接口
bijian1013
java spring
spring的事务的TransactionTemplate,其源码如下:
public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations, InitializingBean{
...
}
TransactionTemplate继承了DefaultT
Oracle中询表的权限被授予给了哪些用户
bijian1013
oracle 数据库 权限
Oracle查询表将权限赋给了哪些用户的SQL,以备查用。
select t.table_name as "表名",
t.grantee as "被授权的属组",
t.owner as "对象所在的属组"
【Struts2五】Struts2 参数传值
bit1129
struts2
Struts2中参数传值的3种情况
1.请求参数绑定到Action的实例字段上
2.Action将值传递到转发的视图上
3.Action将值传递到重定向的视图上
一、请求参数绑定到Action的实例字段上以及Action将值传递到转发的视图上
Struts可以自动将请求URL中的请求参数或者表单提交的参数绑定到Action定义的实例字段上,绑定的规则使用ognl表达式语言
【Kafka十四】关于auto.offset.reset[Q/A]
bit1129
kafka
I got serveral questions about auto.offset.reset. This configuration parameter governs how consumer read the message from Kafka when there is no initial offset in ZooKeeper or
nginx gzip压缩配置
ronin47
nginx gzip 压缩范例
nginx gzip压缩配置 更多
0
nginx
gzip
配置
随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢?
gzip(GNU-ZIP)是一种压缩技术。经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用
java-13.输入一个单向链表,输出该链表中倒数第 k 个节点
bylijinnan
java
two cursors.
Make the first cursor go K steps first.
/*
* 第 13 题:题目:输入一个单向链表,输出该链表中倒数第 k 个节点
*/
public void displayKthItemsBackWard(ListNode head,int k){
ListNode p1=head,p2=head;
Spring源码学习-JdbcTemplate queryForObject
bylijinnan
java spring
JdbcTemplate中有两个可能会混淆的queryForObject方法:
1.
Object queryForObject(String sql, Object[] args, Class requiredType)
2.
Object queryForObject(String sql, Object[] args, RowMapper rowMapper)
第1个方法是只查
[冰川时代]在冰川时代,我们需要什么样的技术?
comsci
技术
看美国那边的气候情况....我有个感觉...是不是要进入小冰期了?
那么在小冰期里面...我们的户外活动肯定会出现很多问题...在室内呆着的情况会非常多...怎么在室内呆着而不发闷...怎么用最低的电力保证室内的温度.....这都需要技术手段...
&nb
js 获取浏览器型号
cuityang
js 浏览器
根据浏览器获取iphone和apk的下载地址
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" content="text/html"/>
<meta name=
C# socks5详解 转
dalan_123
socket C#
http://www.cnblogs.com/zhujiechang/archive/2008/10/21/1316308.html 这里主要讲的是用.NET实现基于Socket5下面的代理协议进行客户端的通讯,Socket4的实现是类似的,注意的事,这里不是讲用C#实现一个代理服务器,因为实现一个代理服务器需要实现很多协议,头大,而且现在市面上有很多现成的代理服务器用,性能又好,
运维 Centos问题汇总
dcj3sjt126com
云主机
一、sh 脚本不执行的原因
sh脚本不执行的原因 只有2个
1.权限不够
2.sh脚本里路径没写完整。
二、解决You have new mail in /var/spool/mail/root
修改/usr/share/logwatch/default.conf/logwatch.conf配置文件
MailTo =
MailFrom
三、查询连接数
Yii防注入攻击笔记
dcj3sjt126com
sql WEB安全 yii
网站表单有注入漏洞须对所有用户输入的内容进行个过滤和检查,可以使用正则表达式或者直接输入字符判断,大部分是只允许输入字母和数字的,其它字符度不允许;对于内容复杂表单的内容,应该对html和script的符号进行转义替换:尤其是<,>,',"",&这几个符号 这里有个转义对照表:
http://blog.csdn.net/xinzhu1990/articl
MongoDB简介[一]
eksliang
mongodb MongoDB简介
MongoDB简介
转载请出自出处:http://eksliang.iteye.com/blog/2173288 1.1易于使用
MongoDB是一个面向文档的数据库,而不是关系型数据库。与关系型数据库相比,面向文档的数据库不再有行的概念,取而代之的是更为灵活的“文档”模型。
另外,不
zookeeper windows 入门安装和测试
greemranqq
zookeeper 安装 分布式
一、序言
以下是我对zookeeper 的一些理解: zookeeper 作为一个服务注册信息存储的管理工具,好吧,这样说得很抽象,我们举个“栗子”。
栗子1号:
假设我是一家KTV的老板,我同时拥有5家KTV,我肯定得时刻监视
Spring之使用事务缘由(2-注解实现)
ihuning
spring
Spring事务注解实现
1. 依赖包:
1.1 spring包:
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.
iOS App Launch Option
啸笑天
option
iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有此程序启动的原因。
launchOptions中的可能键值见UIApplication Class Reference的Launch Options Keys节 。
1、若用户直接
jdk与jre的区别(_)
macroli
java jvm jdk
简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。
JDK就是Java Development Kit JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。 如果安装了JDK,会发同你
Updates were rejected because the tip of your current branch is behind
qiaolevip
学习永无止境 每天进步一点点 众观千象 git
$ git push joe prod-2295-1
To
[email protected] :joe.le/dr-frontend.git
! [rejected] prod-2295-1 -> prod-2295-1 (non-fast-forward)
error: failed to push some refs to '
[email protected]
[一起学Hive]之十四-Hive的元数据表结构详解
superlxw1234
hive hive元数据结构
关键字:Hive元数据、Hive元数据表结构
之前在 “[一起学Hive]之一–Hive概述,Hive是什么”中介绍过,Hive自己维护了一套元数据,用户通过HQL查询时候,Hive首先需要结合元数据,将HQL翻译成MapReduce去执行。
本文介绍一下Hive元数据中重要的一些表结构及用途,以Hive0.13为例。
文章最后面,会以一个示例来全面了解一下,
Spring 3.2.14,4.1.7,4.2.RC2发布
wiselyman
Spring 3
Spring 3.2.14、4.1.7及4.2.RC2于6月30日发布。
其中Spring 3.2.1是一个维护版本(维护周期到2016-12-31截止),后续会继续根据需求和bug发布维护版本。此时,Spring官方强烈建议升级Spring框架至4.1.7 或者将要发布的4.2 。
其中Spring 4.1.7主要包含这些更新内容。