1. Mybatis介绍
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs (Plain Old Java Objects, 普通的 Java 对象)映射成数据库中的记录。
以下是 MyBatis 的主要特点:
简单易学 :MyBatis 框架结构简单,学习门槛相对较低,易于上手。
灵活性强 :MyBatis 允许自定义 SQL、存储过程以及高级映射,以满足复杂的业务需求。
降低耦合度 :MyBatis 使得应用程序与数据库实现了解耦,便于代码的模块化管理和维护。
简化数据库操作 :MyBatis 简化了 JDBC 代码的编写,减少了手动设置参数和获取结果集的工作量。
支持事务管理 :MyBatis 可以与 Spring 框架集成,利用 Spring 的事务管理功能,确保数据的完整性和一致性。
缓存机制 :MyBatis 内置了二级缓存机制,可以在一定程度上提高查询效率。
插件化支持 :MyBatis 支持自定义插件,可以对框架进行扩展,满足特定的业务需求。
支持多数据库操作 :MyBatis 可以通过配置文件或注解的方式适配不同的数据库方言,实现对多种数据库的操作。
良好的社区支持 :MyBatis 拥有庞大的用户群体和活跃的社区,可以提供丰富的参考资料和解决方案。
支持 ActiveMQ 等异步消息队列 :通过与异步消息队列集成,MyBatis 可以实现异步数据操作,提高系统的响应速度。
2. Mybatis使用
以下是如何在 Spring Boot 项目中使用 MyBatis 的详细步骤和示例
2.1 添加依赖
首先,你需要在你的 pom.xml
文件中添加 MyBatis 和 MyBatis-Spring 的依赖。
< dependencies>
< dependency>
< groupId> org.mybatis.spring.boot groupId>
< artifactId> mybatis-spring-boot-starter artifactId>
< version> 2.2.0 version>
dependency>
dependencies>
2.2 配置数据源
在 application.properties
或 application.yml
中配置数据源信息。
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=rootpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2.3 创建实体类
创建一个实体类来表示数据库中的表。例如,一个用户实体类 User
:
public class User {
private Long id;
private String name;
private String email;
}
2.4 创建 Mapper 接口
创建一个接口来定义对数据库的操作。使用 MyBatis 的注解来定义 SQL 语句。例如,一个 UserMapper
:
import org. apache. ibatis. annotations. * ;
import java. util. List ;
import static org. apache. ibatis. annotations. Select . * ;
public interface UserMapper {
@Select ( "SELECT * FROM users WHERE id = #{id}" )
User getUserById ( Long id) ;
@Select ( "SELECT * FROM users" )
List < User > getAllUsers ( ) ;
}
2.5 在 Service 或 Controller 中使用 Mapper
你可以在你的 Service 或 Controller 中注入 UserMapper
并使用它。例如,在一个简单的 UserService:
import org. springframework. beans. factory. annotation. Autowired ;
import org. springframework. stereotype. Service ;
import java. util. List ;
import static org. springframework. transaction. annotation. Transactional ;
import static org. springframework. transaction. annotation. Propagation . * ;
@Service ( "userService" )
@Transactional ( propagation = REQUIRED )
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById ( Long id) {
return userMapper. getUserById ( id) ;
}
public List < User > getAllUsers ( ) {
return userMapper. getAllUsers ( ) ;
}
}
3. Mybatis语法
3.1 增删改查
MyBatis 在 XML 文件中定义 SQL 语句时,主要使用以下元素:
:映射器,通常作为根元素使用,它允许你为 SQL 语句定义一个命名空间。
:查询语句,用于从数据库中检索数据。
:插入语句,用于向数据库中插入数据。
:更新语句,用于更新数据库中的数据。
:删除语句,用于从数据库中删除数据。
下面是一个详细的示例,展示如何在 MyBatis 的 XML 文件中定义 SQL 语句:
< mapper namespace = " com.example.UserMapper" >
< select id = " getUserById" parameterType = " Long" resultType = " User" >
SELECT * FROM users WHERE id = #{id}
select>
< select id = " getAllUsers" resultType = " User" >
SELECT * FROM users
select>
< insert id = " insertUser" parameterType = " User" >
INSERT INTO users (name, email) VALUES (#{name}, #{email})
insert>
< update id = " updateUser" parameterType = " User" >
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
update>
< delete id = " deleteUser" parameterType = " Long" >
DELETE FROM users WHERE id = #{id}
delete>
mapper>
在上述示例中,我们定义了一个名为 “userMapper” 的映射器,并在其中定义了多个 SQL 语句。每个 SQL 语句都有一个唯一的标识符(如 “getUserById”、“getAllUsers” 等),以及参数类型和结果类型。这些 SQL 语句可以在 Java 代码中被调用,以执行相应的数据库操作。
3.2 动态SQL
MyBatis 的动态 SQL 语法允许你在 XML 映射文件中根据参数条件动态地构建 SQL 查询。它通过使用
、
、
、
等元素来构建可变的 SQL 查询。
元素 :用于条件判断,只有当指定的条件为真时,其内部的 SQL 片段才会被包含在最终的 SQL 语句中。
示例:
< select id = " findUsers" resultType = " User" >
SELECT * FROM users
WHERE 1 = 1
< if test = " name != null" >
AND name = #{name}
if>
< if test = " email != null" >
AND email = #{email}
if>
select>
在上面的示例中,如果 name
和 email
参数不为 null
,它们会被包含在最终的 SQL 语句中。
、、 元素 :这些元素可以组合使用,类似于 Java 中的 switch-case-default 结构。
示例:
< select id = " findUsersByCriteria" resultType = " User" >
SELECT * FROM users
WHERE 1 = 1
< choose>
< when test = " name != null" >
AND name = #{name}
when>
< when test = " email != null" >
AND email = #{email}
when>
< otherwise>
AND status = 'ACTIVE'
otherwise>
choose>
select>
在上面的示例中,根据参数的条件,选择相应的查询条件。如果 name
不为 null
,则包含 name 查询条件;如果 email
不为 null
,则包含 email 查询条件;否则,包含默认的查询条件。
使用 和 元素 :这些元素可以用来处理 SQL 的 WHERE
子句,避免多余的 AND
或 OR
关键字。
示例:
< select id = " findUsers" resultType = " User" >
SELECT * FROM users
< trim prefix = " WHERE" prefixOverrides = " AND | OR " >
< if test = " name != null" > AND name = #{name} if>
< if test = " email != null" > AND email = #{email} if>
trim>
select>
在上面的示例中,如果 name
和 email
都为 null
,则最终的 SQL 将不包含 WHERE
子句;如果任一参数不为 null
,则相应的查询条件将被添加到 WHERE
子句中。使用
和
可以避免多余的 AND
或 OR
关键字。
使用 元素 :该元素用于构建更新(UPDATE)语句中的 SET 子句。它支持多个
元素和
元素,以根据提供的参数动态地构建 SET 子句。
< update id = " updateUsers" parameterType = " map" >
UPDATE users
< set>
< if test = " name != null" > name = #{name}, if>
< if test = " email != null" > email = #{email}, if>
< if test = " phone != null" > phone = #{phone}, if>
set>
WHERE id = #{id}
update>
在上面的示例中,
元素用于构建动态的 SET 子句。根据提供的参数(name
、email
和 phone
),只有非 null
的参数才会被包含在 SET 子句中。注意,我们在每个条件后面添加了一个逗号(,
),以确保生成的 SQL 是正确的。
使用 元素 :该元素用于在 SQL 中迭代集合或数组。它可以与
、
和
元素一起使用,以处理集合或数组参数。
< insert id = " insertUsers" parameterType = " list" >
INSERT INTO users (id, name, email, phone)
VALUES
< foreach collection = " list" item = " user" separator = " ," >
(#{user.id}, #{user.name}, #{user.email}, #{user.phone})
foreach>
insert>
< resultMap id = " userResultMap" type = " User" >
< id property = " id" column = " id" />
< result property = " name" column = " name" />
< result property = " email" column = " email" />
< result property = " phone" column = " phone" />
resultMap>
< select id = " getUsersByList" resultMap = " userResultMap" >
SELECT * FROM users
WHERE id IN
< foreach collection = " list" item = " userId" open = " (" separator = " ," close = " )" >
#{userId}
foreach>
select>
在上面的
示例中,
元素用于迭代集合。在
元素中,我们指定了集合的名称(list
)、每个元素的别名(user
)和元素之间的分隔符(,
)。然后,我们使用 #{user.id}
、#{user.name}
等语法来引用每个元素的属性。最后,我们将每个插入语句以逗号分隔的形式列出。
在上面的
示例中:
我们首先定义了一个结果集映射 userResultMap
,用于将查询结果映射到 User
类型的 Java 对象。
然后,在
元素中,我们使用
元素来迭代传入的集合参数 list
。
元素的属性指定了集合的名称(list
)、每个元素的别名(userId
)和元素之间的分隔符(,
)。在
元素内部,我们使用 #{userId}
来引用每个元素的属性。
最后,查询语句中的 IN
子句使用了
元素生成的子查询,以匹配传入的集合中的用户ID。
结果映射 :当数据库中的列名与 Java 对象的属性名不匹配时,或者当查询返回多个结果集时,你需要定义结果映射。这可以通过使用
元素来完成。
< resultMap id = " userResultMap" type = " User" >
< id property = " id" column = " id" />
< result property = " name" column = " name" />
< result property = " email" column = " email" />
< result property = " phone" column = " phone" />
resultMap>
< select id = " getUserById" resultMap = " userResultMap" >
SELECT id, name, email, phone FROM users WHERE id = #{id}
select>
在上面的示例中:
首先,我们定义了一个名为 userResultMap
的结果集映射。该映射指定了 Java 对象的属性与数据库表的列之间的对应关系。通过
元素指定主键列,并通过
元素指定其他列。
然后,在
元素中,我们使用 resultMap
属性引用了之前定义的结果集映射 userResultMap
。这样,查询结果将根据该映射进行映射,并将查询结果转换为 User
类型的 Java 对象。
3.3 其他
多表联接查询 :如果你需要执行涉及多个表的复杂查询,可以使用
元素来定义多表联接查询。
别名 :为了简化 SQL 语句,可以使用别名来引用表或列。例如, 可以使你使用 user.column_name
来引用列。
使用注解 :虽然 MyBatis 的 XML 配置提供了很大的灵活性,但你也可以在接口方法上使用注解来简化 SQL 语句的定义。例如,@Select
、@Insert
、@Update
和 @Delete
注解可以直接在接口方法上定义 SQL 语句。
存储过程和函数 :除了标准的 CRUD 操作,MyBatis 也支持存储过程和函数的映射。
使用表达式语言 (EL) :MyBatis 支持使用表达式语言 (EL) 来简化 SQL 语句的编写,例如 ${}
可以用于直接插入变量值。但是要注意,为了防止 SQL 注入攻击,建议仅在已知安全的上下文中使用 ${}
。通常,建议使用 #{}
来传递参数。
类型处理器 (Type Handlers) :MyBatis 支持自定义类型处理器,用于处理数据库中的特殊类型和 Java 中的特殊类型之间的转换。
事务管理 :虽然 MyBatis 本身不负责事务管理,但它与 Spring 等框架集成时可以很好地支持事务管理。
插件 (Plugins) :MyBatis 支持插件,允许你拦截和修改 MyBatis 的行为,例如在执行 SQL 之前或之后执行某些操作。
命名空间和别名 :在大型项目中,为了避免 XML 文件之间的命名冲突,可以使用命名空间和别名来组织映射器。
分页插件 :对于分页功能,MyBatis 有一些流行的分页插件,如 PageHelper
和 MyBatis-Plus
,它们提供了方便的分页功能。
日志和监控 :MyBatis 支持各种日志实现,如 SLF4J、Log4j 等,这有助于监控和调试 SQL 语句的执行。
XML 配置文件的位置 :通常,MyBatis 的 XML 配置文件位于 src/main/resources/mybatis/mapper
目录下,与对应的接口位于同一包中。
高级特性 :MyBatis 还支持高级特性,如缓存、延迟加载等。这些通常需要根据具体需求进行配置。
你可能感兴趣的:(知识库,spring,boot,mybatis,tomcat,java)
JSON 与 AJAX
Auscy
json ajax 前端
一、JSON(JavaScriptObjectNotation)1.数据类型与语法细节支持的数据类型:基本类型:字符串(需用双引号)、数字、布尔值(true/false)、null。复杂类型:数组([])、对象({})。严格语法规范:键名必须用双引号包裹(如"name":"张三")。数组元素用逗号分隔,最后一个元素后不能有多余逗号。数字不能以0开头(如012会被解析为12),不支持八进制/十六进制
JavaScript 树形菜单总结
Auscy
microsoft
树形菜单是前端开发中常见的交互组件,用于展示具有层级关系的数据(如文件目录、分类列表、组织架构等)。以下从核心概念、实现方式、常见功能及优化方向等方面进行总结。一、核心概念层级结构:数据以父子嵌套形式存在,如{id:1,children:[{id:2}]}。节点:树形结构的基本单元,包含自身信息及子节点(若有)。展开/折叠:子节点的显示与隐藏切换,是树形菜单的核心交互。递归渲染:因数据层级不固定,
精通Canvas:15款时钟特效代码实现指南
烟幕缭绕
本文还有配套的精品资源,点击获取简介:HTML5的Canvas是一个用于绘制矢量图形的API,通过JavaScript实现动态效果。本项目集合了15种不同的时钟特效代码,帮助开发者通过学习绘制圆形、线条、时间更新、旋转、颜色样式设置及动画效果等概念,深化对Canvas的理解和应用。项目中的CSS文件负责时钟的样式设定,而JS文件则包含实现各种特效的逻辑,通过不同的函数或类处理时间更新和动画绘制,提
深入剖析OpenJDK 18 GA源码:Java平台最新发展
想法臃肿
本文还有配套的精品资源,点击获取简介:OpenJDK18GA作为Java开发的关键里程碑,提供了诸多新特性和改进。本文章深入探讨了OpenJDK18GA源码,揭示其内部机制,帮助开发者更好地理解和利用这个版本。文章还涵盖了PatternMatching、SealedClasses、Records、JEP395、JEP406和JEP407等特性,以及HotSpot虚拟机、编译器、垃圾收集器、内存模型
Java大厂面试实录:谢飞机的电商场景技术问答(Spring Cloud、MyBatis、Redis、Kafka、AI等)
Java大厂面试实录:谢飞机的电商场景技术问答(SpringCloud、MyBatis、Redis、Kafka、AI等)本文模拟知名互联网大厂Java后端岗位面试流程,以电商业务为主线,由严肃面试官与“水货”程序员谢飞机展开有趣的对话,涵盖SpringCloud、MyBatis、Redis、Kafka、SpringSecurity、AI等热门技术栈,并附详细解析,助力求职者备战大厂面试。故事设定谢
【超硬核】JVM源码解读:Java方法main在虚拟机上解释执行
HeapDump性能社区
java 开发语言 后端 jvm
本文由HeapDump性能社区首席讲师鸠摩(马智)授权整理发布第1篇-关于Java虚拟机HotSpot,开篇说的简单点开讲Java运行时,这一篇讲一些简单的内容。我们写的主类中的main()方法是如何被Java虚拟机调用到的?在Java类中的一些方法会被由C/C++编写的HotSpot虚拟机的C/C++函数调用,不过由于Java方法与C/C++函数的调用约定不同,所以并不能直接调用,需要JavaC
算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
在计算机科学和数学领域,蒙特卡洛算法(MonteCarloAlgorithm)以其独特的随机抽样思想,成为解决复杂问题的有力工具。从圆周率的计算到金融风险评估,从物理模拟到人工智能,蒙特卡洛算法都发挥着不可替代的作用。本文将深入剖析蒙特卡洛算法的思想、解题思路,结合实际应用场景与Java代码实现,并融入考研408的相关考点,穿插图片辅助理解,帮助你全面掌握这一重要算法。蒙特卡洛算法的基本概念蒙特卡
Java大厂面试故事:谢飞机的互联网音视频场景技术面试全纪录(Spring Boot、MyBatis、Kafka、Redis、AI等)
来旺
Java场景面试宝典 Java Spring Boot MyBatis Kafka Redis 微服务 AI
Java大厂面试故事:谢飞机的互联网音视频场景技术面试全纪录(SpringBoot、MyBatis、Kafka、Redis、AI等)互联网大厂技术面试不仅考察技术深度,更注重业务场景与系统设计能力。本篇以严肃面试官与“水货”程序员谢飞机的对话,带你体验音视频业务场景下的Java面试全过程,涵盖主流技术栈,并附详细答案解析,助你面试无忧。故事场景设定谢飞机是一名有趣但技术基础略显薄弱的程序员,这次应
【前端】jQuery数组合并去重方法总结
在jQuery中合并多个数组并去重,推荐使用原生JavaScript的Set对象(高效简单)或$.unique()(仅适用于DOM元素,不适用于普通数组)。以下是完整解决方案:方法1:使用ES6Set(推荐)//定义多个数组constarr1=[1,2,3];constarr2=[2,3,4];constarr3=[3,4,5];//合并数组并用Set去重constmergedArray=[...
MySQL Explain 详解:从入门到精通,让你的 SQL 飞起来
引言:为什么Explain是SQL优化的“照妖镜”?在Java开发中,我们常常会遇到数据库性能瓶颈的问题。一条看似简单的SQL语句,在数据量增长到一定规模后,可能会从毫秒级响应变成秒级甚至分钟级响应,直接拖慢整个应用的性能。此时,你是否曾困惑于:为什么这条SQL突然变慢了?索引明明建了,为什么没生效?到底是哪里出了问题?答案就藏在MySQL的EXPLAIN命令里。EXPLAIN就像一面“照妖镜”,
Java特性之设计模式【责任链模式】
Naijia_OvO
Java特性 java 设计模式 责任链模式
一、责任链模式概述顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推主要解决:职责链上的处理者负责处理请求,客户只需要将
日历插件-FullCalendar的详细使用
老马聊技术
JavaScript 前端 javascript
一、介绍FullCalendar是一个功能强大、高度可定制的JavaScript日历组件,用于在网页中显示和管理日历事件。它支持多种视图(月、周、日等),可以轻松集成各种框架,并提供丰富的事件处理功能。二、实操案例具体代码如下:FullCalendar日期选择body{font-family:Arial,sans-serif;margin:20px;}#calendar{max-width:900
react-native android 环境搭建
环境:macjava版本:Java11最重要:一定要一定要一定要react涉及到很多的依赖下载,gradle和react相关的,第一次安装环境时有外网环境会快速很多。安装nodejs安装react-nativenpminstallreact-native-clinpminstallreact-native创建一个新项目react-nativeinitfirstReact替换gradle下载源rep
Spring Cloud Gateway 的执行链路详解
愤怒的代码
SpringCloud spring cloud
SpringCloudGateway的执行链路详解核心目标明确SpringCloudGateway的请求处理全过程(从接收到请求→到转发→到返回响应),方便你在合适的生命周期节点插入你的逻辑。核心执行链路图(执行顺序)┌──────────────┐│客户端请求│└────┬─────────┘↓┌────┴─────────────┐│NettyHttpServer│←→ReactorNetty
RocketMQ 核心特性实战详解
愤怒的代码
RocketMQ实战 rocketmq
RocketMQ核心特性实战详解本文基于RocketMQ4.x+rocketmq-spring-boot-starter2.3.1,从零搭建,逐步讲解RocketMQ11大核心特性,每一段代码都能直接跑。0.项目环境准备依赖引入在pom.xml文件添加:org.apache.rocketmqrocketmq-spring-boot-starter2.3.1配置文件application.ymlse
Java 调用 HTTP 接口的 7 种方式:全网最全指南
Java调用HTTP接口的7种方式:全网最全指南在开发过程中,调用HTTP接口是最常见的需求之一。本文将详细介绍Java中7种主流的调用HTTP接口的方式,包括每种工具的优缺点和完整代码实现。1.使用RestTemplateRestTemplate是Spring提供的同步HTTP客户端,适用于传统项目。尽管从Spring5开始被标记为过时,它仍然是许多开发者的首选。示例代码importorg.sp
Java三年经验程序员技术栈全景指南:从前端到架构,对标阿里美团全栈要求
可曾去过倒悬山
java 前端 架构
Java三年经验程序员技术栈全景指南:从前端到架构,对标阿里美团全栈要求三年经验是Java程序员的分水岭,技术栈深度决定你成为“业务码农”还是“架构师候选人”。本文整合阿里、美团、滴滴等大厂招聘要求,为你绘制可落地的进阶路线。一、Java核心:从语法糖到JVM底层三年经验与初级的核心差异在于系统级理解,大厂面试常考以下能力:JVM与性能调优内存模型(堆外内存、元空间)、GC算法(G1/ZGC适用场
javascript高级程序设计第3版——第12章 DOM2与DOM3
weixin_30687587
javascript 数据结构与算法 ViewUI
12章——DOM2与DOM3为了增强D0M1,DOM级规范定义了一些模块。DOM2核心:为不同的DOM类型引入了一些与XML命名空间有关的方法,还定义了以编程方式创建Document实例的方法;DOM2级样式:针对操作元素的样式而开发;其特性总结:1.每个元素都有一个关联的style对象,可用来确定和修改行内样式;2.要确定某个元素的计算样式,可使用getComgetComputedStyle()
Java设计模式实战:高频场景解析与避坑指南
mckim_
笔记 学习 java 设计模式
引言设计模式是软件开发的基石,但许多开发者面对23种模式时容易陷入“学完就忘”或“滥用模式”的困境。本文从工业级项目视角出发,精选10种高频设计模式,结合真实代码案例与主流框架应用,帮你建立模式思维,拒绝纸上谈兵。一、创建型模式:告别new的暴力美学1.工厂方法模式(FactoryMethod)核心痛点:对象创建逻辑散落各处,难以统一管理。场景案例:电商平台需要支持多种支付方式(支付宝、微信、银联
JavaScript 基础09:Web APIs——日期对象、DOM节点
梦想当全栈
JavaScript javascript 前端 开发语言
JavaScript基础09:WebAPIs——日期对象、DOM节点进一步学习DOM相关知识,实现可交互的网页特效能够插入、删除和替换元素节点。能够依据元素节点关系查找节点。一、日期对象掌握Date日期对象的使用,动态获取当前计算机的时间。ECMAScript中内置了获取系统时间的对象Date,使用Date时与之前学习的内置对象console和Math不同,它需要借助new关键字才能使用。1.实例
《Java前端开发全栈指南:从Servlet到现代框架实战》
前言在当今Web开发领域,Java依然是后端开发的主力语言,而随着前后端分离架构的普及,Java开发者也需要掌握前端技术栈。本文将全面介绍JavaWeb前端开发的核心技术,包括传统Servlet/JSP体系、现代前端框架集成方案,以及全栈开发的最佳实践。通过本文,您将了解如何构建现代化的JavaWeb应用前端界面。一、JavaWeb前端技术演进1.1传统技术栈Servlet:JavaWeb基础,处
javaSE面试题---语法基础、面向对象、常用类、集合、多线程、文件和IO
yang_xiao_wu_
java 面试 开发语言 javase java基础 多线程 文件和IO
目录语法基础1.jdkjrejvm区别2.基本数据类型3.引用数据类型4.自动类型转换、强制类型转换5.常见的运算符6.&和&&区别7.++--在前和在后的区别8.+=有什么作用9.switch..case中switch支持哪些数据类型10.break和continue区别11.while和dowhile区别12.如何生成一个取值范围在[min,max]之间的随机数13.数组的长度如何获取?数组下
JAVA 高频八股文 Day03
Conqueror675
java 开发语言
12.TCP和Http的区别是什么TCP是传输层协议,负责建立可靠的点对点连接,确保数据有序、完整地传输(如铁路轨道);HTTP是应用层协议,基于TCP构建,定义了Web服务交互的报文格式和规则(如货运订单)。TCP关注数据如何可靠送达,通过三次握手建立连接、流量控制等机制保证传输;HTTP关注传输内容的意义,提供请求/响应语义(GET/POST等)和无状态通信。补充:说一下什么是三次握手四次挥手
JVM字节码加载与存储中的细节
问题引出:为什么Java定义int型变量为32767时使用的是bipush32767,而定义int型变量为32768时使用的是ldc#4?在Java中,如果这样定义int型变量:publicclassTest{publicstaticvoidmain(String[]args){inti=0;intj=5;intk=6;intm=32768;intn=32767;}}变量对应的字节码文件内容是这样
JVM与Spring Boot核心解析
AIHacksCash
Java场景面试宝典 Java JVM Spring Boot
我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、Spri
HashMap的Get(),Put()源码解析
Ttang23
哈希算法 散列表 算法
1、什么是HashMap?HashMap是Java中用于存储键值对(Key-Value)的集合类,它实现了Map接口。其核心特点是:无序性:不保证元素的存储顺序,也不保证顺序恒定不变。唯一性:键(Key)不能重复,若插入重复键会覆盖原有值。允许null:允许一个null键和任意数量的null值。非线程安全:相比HashTable,HashMap不支持同步,性能更高。2.核心数据结构:哈希表(Has
Java中的Tomcat,开启Web应用腾飞【基础版】
目录一、Tomcat初登场:揭开神秘面纱(一)啥是Tomcat(二)为啥要有Tomcat二、Tomcat的安装与启动:开启第一步(一)下载Tomcat(二)启动Tomcat三、Tomcat的目录结构:探秘内部布局(一)核心目录介绍(二)目录间的协同工作四、部署JavaWeb应用到Tomcat:让应用上线(一)打包Web应用为WAR文件(二)部署WAR文件到Tomcat五、Tomcat的配置优化:让
Java Web 之 Session 详解
艾伦~耶格尔
java 开发语言 后端 前端 session
在JavaWeb开发中,Session就像网站的专属记忆管家,为每个用户保管着重要的信息和状态,确保用户在网站的旅程顺畅无阻。场景一:想象你去一家大型超市购物,推着购物车挑选商品。这个购物车就如同Session,它记录了你的购物信息,方便你在结账时一次性结算。场景二:你在玩一个在线游戏,登录账号后,你的游戏进度、等级、装备等信息都会被保存在Session中,即使你中途关闭游戏,下次登录时依然可以继
Spring WebFlux 响应式编程原理与实战指南
SpringWebFlux响应式编程原理与实战指南一、技术背景与应用场景随着微服务与高并发的迅速发展,传统的阻塞式编程模型在处理大量并发请求时容易导致线程资源耗尽、响应延迟增高。SpringWebFlux基于ReactiveStreams规范,通过非阻塞、背压机制,实现高吞吐、低延迟的Web服务。典型应用场景包括:实时数据推送:WebSocket或Server-SentEvents场景。高并发AP
老系统改造增加初始化,自动化数据源配置(tomcat+jsp+springmvc)
老系统改造增加初始化,自动化数据源配置一、前言二、改造描述1、环境说明2、实现步骤简要思考三、开始改造1、准备sql初始化文件2、启动时自动读取jdbc文件,创建数据源,如未配置,需要一个默认的临时数据源2.1去掉spingmvc原本配置的固定dataSource,改为动态dataSource2.2代码类,这里是示例,我就不管规范了,放到一起2.2.1DynamicDataSourceConfig
java工厂模式
3213213333332132
java 抽象工厂
工厂模式有
1、工厂方法
2、抽象工厂方法。
下面我的实现是抽象工厂方法,
给所有具体的产品类定一个通用的接口。
package 工厂模式;
/**
* 航天飞行接口
*
* @Description
* @author FuJianyong
* 2015-7-14下午02:42:05
*/
public interface SpaceF
nginx频率限制+python测试
ronin47
nginx 频率 python
部分内容参考:http://www.abc3210.com/2013/web_04/82.shtml
首先说一下遇到这个问题是因为网站被攻击,阿里云报警,想到要限制一下访问频率,而不是限制ip(限制ip的方案稍后给出)。nginx连接资源被吃空返回状态码是502,添加本方案限制后返回599,与正常状态码区别开。步骤如下:
java线程和线程池的使用
dyy_gusi
ThreadPool thread Runnable timer
java线程和线程池
一、创建多线程的方式
java多线程很常见,如何使用多线程,如何创建线程,java中有两种方式,第一种是让自己的类实现Runnable接口,第二种是让自己的类继承Thread类。其实Thread类自己也是实现了Runnable接口。具体使用实例如下:
1、通过实现Runnable接口方式 1 2
Linux
171815164
linux
ubuntu kernel
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.1.2-unstable/
安卓sdk代理
mirrors.neusoft.edu.cn 80
输入法和jdk
sudo apt-get install fcitx
su
Tomcat JDBC Connection Pool
g21121
Connection
Tomcat7 抛弃了以往的DBCP 采用了新的Tomcat Jdbc Pool 作为数据库连接组件,事实上DBCP已经被Hibernate 所抛弃,因为他存在很多问题,诸如:更新缓慢,bug较多,编译问题,代码复杂等等。
Tomcat Jdbc P
敲代码的一点想法
永夜-极光
java 随笔 感想
入门学习java编程已经半年了,一路敲代码下来,现在也才1w+行代码量,也就菜鸟水准吧,但是在整个学习过程中,我一直在想,为什么很多培训老师,网上的文章都是要我们背一些代码?比如学习Arraylist的时候,教师就让我们先参考源代码写一遍,然
jvm指令集
程序员是怎么炼成的
jvm 指令集
转自:http://blog.csdn.net/hudashi/article/details/7062675#comments
将值推送至栈顶时 const ldc push load指令
const系列
该系列命令主要负责把简单的数值类型送到栈顶。(从常量池或者局部变量push到栈顶时均使用)
0x02 &nbs
Oracle字符集的查看查询和Oracle字符集的设置修改
aijuans
oracle
本文主要讨论以下几个部分:如何查看查询oracle字符集、 修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题。
一、什么是Oracle字符集
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货
png在Ie6下透明度处理方法
antonyup_2006
css 浏览器 Firebug IE
由于之前到深圳现场支撑上线,当时为了解决个控件下载,我机器上的IE8老报个错,不得以把ie8卸载掉,换个Ie6,问题解决了,今天出差回来,用ie6登入另一个正在开发的系统,遇到了Png图片的问题,当然升级到ie8(ie8自带的开发人员工具调试前端页面JS之类的还是比较方便的,和FireBug一样,呵呵),这个问题就解决了,但稍微做了下这个问题的处理。
我们知道PNG是图像文件存储格式,查询资
表查询常用命令高级查询方法(二)
百合不是茶
oracle 分页查询 分组查询 联合查询
----------------------------------------------------分组查询 group by having --平均工资和最高工资 select avg(sal)平均工资,max(sal) from emp ; --每个部门的平均工资和最高工资
uploadify3.1版本参数使用详解
bijian1013
JavaScript uploadify3.1
使用:
绑定的界面元素<input id='gallery'type='file'/>$("#gallery").uploadify({设置参数,参数如下});
设置的属性:
id: jQuery(this).attr('id'),//绑定的input的ID
langFile: 'http://ww
精通Oracle10编程SQL(17)使用ORACLE系统包
bijian1013
oracle 数据库 plsql
/*
*使用ORACLE系统包
*/
--1.DBMS_OUTPUT
--ENABLE:用于激活过程PUT,PUT_LINE,NEW_LINE,GET_LINE和GET_LINES的调用
--语法:DBMS_OUTPUT.enable(buffer_size in integer default 20000);
--DISABLE:用于禁止对过程PUT,PUT_LINE,NEW
【JVM一】JVM垃圾回收日志
bit1129
垃圾回收
将JVM垃圾回收的日志记录下来,对于分析垃圾回收的运行状态,进而调整内存分配(年轻代,老年代,永久代的内存分配)等是很有意义的。JVM与垃圾回收日志相关的参数包括:
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc
-XX:+PrintGC
通
Toast使用
白糖_
toast
Android中的Toast是一种简易的消息提示框,toast提示框不能被用户点击,toast会根据用户设置的显示时间后自动消失。
创建Toast
两个方法创建Toast
makeText(Context context, int resId, int duration)
参数:context是toast显示在
angular.identity
boyitech
AngularJS AngularJS API
angular.identiy 描述: 返回它第一参数的函数. 此函数多用于函数是编程. 使用方法: angular.identity(value); 参数详解: Param Type Details value
*
to be returned. 返回值: 传入的value 实例代码:
<!DOCTYPE HTML>
java-两整数相除,求循环节
bylijinnan
java
import java.util.ArrayList;
import java.util.List;
public class CircleDigitsInDivision {
/**
* 题目:求循环节,若整除则返回NULL,否则返回char*指向循环节。先写思路。函数原型:char*get_circle_digits(unsigned k,unsigned j)
Java 日期 周 年
Chen.H
java C++ c C#
/**
* java日期操作(月末、周末等的日期操作)
*
* @author
*
*/
public class DateUtil {
/** */
/**
* 取得某天相加(减)後的那一天
*
* @param date
* @param num
*
[高考与专业]欢迎广大高中毕业生加入自动控制与计算机应用专业
comsci
计算机
不知道现在的高校还设置这个宽口径专业没有,自动控制与计算机应用专业,我就是这个专业毕业的,这个专业的课程非常多,既要学习自动控制方面的课程,也要学习计算机专业的课程,对数学也要求比较高.....如果有这个专业,欢迎大家报考...毕业出来之后,就业的途径非常广.....
以后
分层查询(Hierarchical Queries)
daizj
oracle 递归查询 层次查询
Hierarchical Queries
If a table contains hierarchical data, then you can select rows in a hierarchical order using the hierarchical query clause:
hierarchical_query_clause::=
start with condi
数据迁移
daysinsun
数据迁移
最近公司在重构一个医疗系统,原来的系统是两个.Net系统,现需要重构到java中。数据库分别为SQL Server和Mysql,现需要将数据库统一为Hana数据库,发现了几个问题,但最后通过努力都解决了。
1、原本通过Hana的数据迁移工具把数据是可以迁移过去的,在MySQl里面的字段为TEXT类型的到Hana里面就存储不了了,最后不得不更改为clob。
2、在数据插入的时候有些字段特别长
C语言学习二进制的表示示例
dcj3sjt126com
c basic
进制的表示示例
# include <stdio.h>
int main(void)
{
int i = 0x32C;
printf("i = %d\n", i);
/*
printf的用法
%d表示以十进制输出
%x或%X表示以十六进制的输出
%o表示以八进制输出
*/
return 0;
}
NsTimer 和 UITableViewCell 之间的控制
dcj3sjt126com
ios
情况是这样的:
一个UITableView, 每个Cell的内容是我自定义的 viewA viewA上面有很多的动画, 我需要添加NSTimer来做动画, 由于TableView的复用机制, 我添加的动画会不断开启, 没有停止, 动画会执行越来越多.
解决办法:
在配置cell的时候开始动画, 然后在cell结束显示的时候停止动画
查找cell结束显示的代理
MySql中case when then 的使用
fanxiaolong
casewhenthenend
select "主键", "项目编号", "项目名称","项目创建时间", "项目状态","部门名称","创建人"
union
(select
pp.id as "主键",
pp.project_number as &
Ehcache(01)——简介、基本操作
234390216
cache ehcache 简介 CacheManager crud
Ehcache简介
目录
1 CacheManager
1.1 构造方法构建
1.2 静态方法构建
2 Cache
2.1&
最容易懂的javascript闭包学习入门
jackyrong
JavaScript
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊
提升网站转化率的四步优化方案
php教程分享
数据结构 PHP 数据挖掘 Google 活动
网站开发完成后,我们在进行网站优化最关键的问题就是如何提高整体的转化率,这也是营销策略里最最重要的方面之一,并且也是网站综合运营实例的结果。文中分享了四大优化策略:调查、研究、优化、评估,这四大策略可以很好地帮助用户设计出高效的优化方案。
PHP开发的网站优化一个网站最关键和棘手的是,如何提高整体的转化率,这是任何营销策略里最重要的方面之一,而提升网站转化率是网站综合运营实力的结果。今天,我就分
web开发里什么是HTML5的WebSocket?
naruto1990
Web html5 浏览器 socket
当前火起来的HTML5语言里面,很多学者们都还没有完全了解这语言的效果情况,我最喜欢的Web开发技术就是正迅速变得流行的 WebSocket API。WebSocket 提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法,从客户端使用简单的语法有效地推动消息到服务器。让我们看一看6个HTML5教程介绍里 的 WebSocket API:它可用于客户端、服
Socket初步编程——简单实现群聊
Everyday都不同
socket 网络编程 初步认识
初次接触到socket网络编程,也参考了网络上众前辈的文章。尝试自己也写了一下,记录下过程吧:
服务端:(接收客户端消息并把它们打印出来)
public class SocketServer {
private List<Socket> socketList = new ArrayList<Socket>();
public s
面试:Hashtable与HashMap的区别(结合线程)
toknowme
昨天去了某钱公司面试,面试过程中被问道
Hashtable与HashMap的区别?当时就是回答了一点,Hashtable是线程安全的,HashMap是线程不安全的,说白了,就是Hashtable是的同步的,HashMap不是同步的,需要额外的处理一下。
今天就动手写了一个例子,直接看代码吧
package com.learn.lesson001;
import java
MVC设计模式的总结
xp9802
设计模式 mvc 框架 IOC
随着Web应用的商业逻辑包含逐渐复杂的公式分析计算、决策支持等,使客户机越
来越不堪重负,因此将系统的商业分离出来。单独形成一部分,这样三层结构产生了。
其中‘层’是逻辑上的划分。
三层体系结构是将整个系统划分为如图2.1所示的结构[3]
(1)表现层(Presentation layer):包含表示代码、用户交互GUI、数据验证。
该层用于向客户端用户提供GUI交互,它允许用户