目录
使用MyBatis完成CRUDz--增删改查
3.1 insert(Create)
3.2 delete(Delete)
3.3 update(Update)
3.4 select(Retrieve)
查询一条数据
查询多条数据
使用MyBatis完成CRUDz--增删改查
创建module(Maven的普通Java模块):mybatis-002-crud
pom.xml
mybatis依赖
mysql驱动依赖
junit依赖
logback依赖
mybatis-config.xml放在类的根路径下
CarMapper.xml放在类的根路径下
logback.xml放在类的根路径下
提供com.powernode.mybatis.utils.SqlSessionUtil工具类
创建测试用例:com.powernode.mybatis.CarMapperTest
3.1 insert(Create)
分析以下SQL映射文件中SQL语句存在的问题
CarMapper.xml:
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values('103', '奔驰E300L', 50.3, '2022-01-01', '燃油车')
存在的问题是:SQL语句中的值不应该写死,值应该是用户提供的。之前的JDBC代码是这样写的:
JDBC:
// JDBC中使用 ? 作为占位符。那么MyBatis中会使用什么作为占位符呢?
String sql = "insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(?,?,?,?,?)";
// ......
// 给 ? 传值。那么MyBatis中应该怎么传值呢?
ps.setString(1,"103");
ps.setString(2,"奔驰E300L");
ps.setDouble(3,50.3);
ps.setString(4,"2022-01-01");
ps.setString(5,"燃油车");
在MyBatis中可以这样做: 在Java程序中,将数据放到Map集合中 在sql语句中使用 #{map集合的key} 来完成传值,#{} 等同于JDBC中的 ? ,#{}就是占位符 Java程序这样写:
CarMapperTest.testInsertCar():
package com.dong.mybatis;
import com.powernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
/**
* 测试MyBatis的CRUD
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class CarMapperTest {
@Test
public void testInsertCar(){
// 准备数据
Map map = new HashMap<>();
map.put("k1", "103");
map.put("k2", "奔驰E300L");
map.put("k3", 50.3);
map.put("k4", "2020-10-01");
map.put("k5", "燃油车");
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句(使用map集合给sql语句传递数据)
int count = sqlSession.insert("insertCar", map);
System.out.println("插入了几条记录:" + count);
}
}
SQL语句这样写:
CarMapper.xml
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{k1},#{k2},#{k3},#{k4},#{k5})
#{} 的里面必须填写map集合的key,不能随便写。 运行测试程序,查看数据库:
如果#{}里写的是map集合中不存在的key会有什么问题?
CarMapper.xml:
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{kk},#{k2},#{k3},#{k4},#{k5})
运行程序:
通过测试,看到程序并没有报错。正常执行。不过 #{kk} 的写法导致无法获取到map集合中的数据,最终导致数据库表car_num插入了NULL。
在以上sql语句中,可以看到#{k1} #{k2} #{k3} #{k4} #{k5}的可读性太差,为了增强可读性,我们可以将Java程序做如下修改:
CarMapperTest.testInsertCar()
Map map = new HashMap<>();
// 让key的可读性增强
map.put("carNum", "103");
map.put("brand", "奔驰E300L");
map.put("guidePrice", 50.3);
map.put("produceTime", "2020-10-01");
map.put("carType", "燃油车");
SQL语句做如下修改,这样可以增强程序的可读性:
CarMapper.xml
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
运行程序,查看数据库表:
使用Map集合可以传参,那使用pojo (简单普通的java对象)可以完成传参吗?测试一下:
Car.java:
package com.dong.mybatis.pojo;
/**
* POJOs,简单普通的Java对象。封装数据用的。
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class Car {
private Long id;
private String carNum;
private String brand;
private Double guidePrice;
private String produceTime;
private String carType;
@Override
public String toString() {
return "Car{" +
"id=" + id +
", carNum='" + carNum + '\'' +
", brand='" + brand + '\'' +
", guidePrice=" + guidePrice +
", produceTime='" + produceTime + '\'' +
", carType='" + carType + '\'' +
'}';
}
public Car() {
}
public Car(Long id, String carNum, String brand, Double guidePrice, String produceTime, String carType) {
this.id = id;
this.carNum = carNum;
this.brand = brand;
this.guidePrice = guidePrice;
this.produceTime = produceTime;
this.carType = carType;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCarNum() {
return carNum;
}
public void setCarNum(String carNum) {
this.carNum = carNum;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Double getGuidePrice() {
return guidePrice;
}
public void setGuidePrice(Double guidePrice) {
this.guidePrice = guidePrice;
}
public String getProduceTime() {
return produceTime;
}
public void setProduceTime(String produceTime) {
this.produceTime = produceTime;
}
public String getCarType() {
return carType;
}
public void setCarType(String carType) {
this.carType = carType;
}
}
第二步:Java程序
CarMapperTest.testInsertCarByPOJO():
@Test
public void testInsertCarByPOJO(){
// 创建POJO,封装数据
Car car = new Car();
car.setCarNum("103");
car.setBrand("奔驰C200");
car.setGuidePrice(33.23);
car.setProduceTime("2020-10-11");
car.setCarType("燃油车");
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL,传数据
int count = sqlSession.insert("insertCarByPOJO", car);
System.out.println("插入了几条记录" + count);
}
第三步:SQL语句
CarMapper.xml:
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
#{} 里写的是POJO的属性名,如果写成其他的会有问题吗?
CarMapper.xml
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{a},#{brand},#{guidePrice},#{produceTime},#{carType})
运行程序,出现了以下异常:
错误信息中描述:在Car类中没有找到a属性的getter方法。
修改POJO类Car的代码,只将getCarNum()方法名修改为getA(),其他代码不变 ,如下:
再运行程序,查看数据库表中数据:
经过测试得出结论: 如果采用map集合传参,#{} 里写的是map集合的key,如果key不存在不会报错,数据库表中会插入NULL。 如果采用POJO传参,#{} 里写的是get方法的方法名去掉get之后将剩下的单词首字母变小写(例如:getAge对应的是#{age},getUserName对应的是#{userName}),如果这样的get方法不存在会报错。 注意:其实传参数的时候有一个属性parameterType,这个属性用来指定传参的数据类型,不过这个属性是可以省略的
CarMapper.xml
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
3.2 delete(Delete)
需求:根据car_num进行删除。 SQL语句这样写:
CarMapper.xml:
delete from t_car where car_num = #{SuiBianXie}
Java程序这样写:
CarMapperTest.testDeleteByCarNum:
@Test
public void testDeleteByCarNum(){
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
int count = sqlSession.delete("deleteByCarNum", "102");
System.out.println("删除了几条记录:" + count);
}
运行结果:
注意:当占位符只有一个的时候,${} 里面的内容可以随便写。
3.3 update(Update)
需求:修改id=34的Car信息,car_num为102,brand为比亚迪汉,guide_price为30.23,produce_time为2018-09-10,car_type为电车
修改前:
SQL语句如下:
CarMapper.xml:
update t_car set
car_num = #{carNum}, brand = #{brand},
guide_price = #{guidePrice}, produce_time = #{produceTime},
car_type = #{carType}
where id = #{id}
Java代码如下:
CarMapperTest.testUpdateCarByPOJO:
@Test
public void testUpdateCarByPOJO(){
// 准备数据
Car car = new Car();
car.setId(34L);
car.setCarNum("102");
car.setBrand("比亚迪汉");
car.setGuidePrice(30.23);
car.setProduceTime("2018-09-10");
car.setCarType("电车");
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
int count = sqlSession.update("updateCarByPOJO", car);
System.out.println("更新了几条记录:" + count);
}
运行结果:
当然了,如果使用map 传数据也是可以的。
3.4 select(Retrieve)
select语句和其它语句不同的是:查询会有一个结果集。 来看mybatis是怎么处理结果集的!!!
查询一条数据
需求:查询id为1的Car信息 SQL语句如下:
CarMapper.xml:
select * from t_car where id = #{id}
Java程序如下:
CarMapperTest.testSelectCarById:
@Test
public void testSelectCarById(){
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
Object car = sqlSession.selectOne("selectCarById", 1);
System.out.println(car);
}
运行结果如下:
运行结果出现了异常:
### Error querying database. Cause: org.apache.ibatis.executor.ExecutorException:
A query was run and no Result Maps were found for the Mapped Statement 'car.selectCarById'. 【翻译】:对于一个查询语句来说,没有找到查询的结果映射。
It's likely that neither a Result Type nor a Result Map was specified. 【翻译】:很可能既没有指定结果类型,也没有指定结果映射。
以上的异常大致的意思是:对于一个查询语句来说,你需要指定它的“结果类型”或者“结果映射”。 所以说,你想让mybatis查询之后返回一个Java对象的话,至少你要告诉mybatis返回一个什么类型的Java对象,可以在标签中添加resultType属性,用来指定查询要转换的类型:
CarMapper.xml:
select * from t_car where id = #{id}
运行结果:
运行后之前的异常不再出现了,这说明添加了resultType属性之后,解决了之前的异常,可以看出resultType是不能省略的。
仔细观察控制台的日志信息,不难看出,结果查询出了一条。并且每个字段都查询到值了:Row: 1, 100, 宝马520Li, 41.00, 2022-09-01, 燃油车
但是奇怪的是返回的Car对象,只有id和brand两个属性有值,其它属性的值都是null,这是为什么呢?我们来观察一下查询结果列名和Car类的属性名是否能一一对应:
查询结果集的列名:id, car_num, brand, guide_price, produce_time, car_type
Car类的属性名:id, carNum, brand, guidePrice, produceTime, carType
通过观察发现:只有id和brand是一致的,其他字段名和属性名对应不上,这是不是导致null的原因呢?我们尝试在sql语句中使用as关键字来给查询结果列名起别名试试:
CarMapper.xml:
select
id, car_num as carNum, brand, guide_price as guidePrice, produce_time as produceTime, car_type as carType
from
t_car
where
id = #{id}
运行结果如下:
通过测试得知,如果当查询结果的字段名和java类的属性名对应不上的话,可以采用as关键字起别名,当然还有其它解决方案,我们后面再看
查询多条数据
需求:查询所有的Car信息。 SQL语句如下:
CarMapper.xml:
select
id, car_num as carNum, brand, guide_price as guidePrice, produce_time as produceTime, car_type as carType
from
t_car
Java代码如下:
CarMapperTest.testSelectCarAll:
@Test
public void testSelectCarAll(){
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句
List cars = sqlSession.selectList("selectCarAll");
// 输出结果
cars.forEach(car -> System.out.println(car));
}
运行结果如下:
你可能感兴趣的:(数据库学习记录,mybatis学习记录,Java知识学习,mybatis,学习,java)
SpringBoot整合DeepSeek技术指南(2025版)
hjy1821
AI 人工智能
SpringBoot整合DeepSeek技术指南(2025版)环境准备com.deepseekdeepseek-java-sdk2.5.0org.springframework.bootspring-boot-starter-webflux配置中心设置#application.ymldeepseek:api:base-url:https://api.deepseek.com/v2token:${D
二维随机变量
Shockang
机器学习数学通关指南 机器学习 人工智能 数学 概率论
前言本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见《机器学习数学通关指南》正文1.二维随机变量基础1.1基本定义二维随机变量(X,Y)(X,Y)(X,Y)是由两个定义在同一概率空间上的随机变量XXX和YYY组成的向量样本空间:每个试验结果e∈Se\inSe∈S对应到平面上的一个点(X(e),Y(e))(
似然函数与极大似然估计
Shockang
机器学习数学通关指南 机器学习 人工智能 数学 概率论
前言本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见《机器学习数学通关指南》正文1.似然函数:直观理解与数学定义核心概念似然函数是机器学习中参数估计的基石,它从数据与模型之间的关系出发,提供了一种优化参数的数学框架。直观理解:假设你正在调整相机参数以拍摄最清晰的照片。似然函数就像是一个"清晰度指标",告诉
正交投影与内积空间:机器学习的几何基础
Shockang
机器学习数学通关指南 机器学习 人工智能 线性代数 数学
前言本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见《机器学习数学通关指南》正文1.内积空间的数学定义1.1代数定义✏️两个维度相同的向量a=[a1,…,an]\mathbf{a}=[a_1,\dots,a_n]a=[a1,…,an]和b=[b1,…,bn]\mathbf{b}=[b_1,\dots,b_
特征值与特征向量
Shockang
机器学习数学通关指南 机器学习 线性代数 矩阵 数学
前言本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见《机器学习数学通关指南》正文一、定义与数学表达特征向量:对于方阵AAA,若存在非零向量v\mathbf{v}v满足Av=λvA\mathbf{v}=\lambda\mathbf{v}Av=λv,则v\mathbf{v}v称为AAA的特征向量。特征值:对应
奖学金(c++)
金牛座的zxs
题目描述查看题目信息某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5
C 语言经典练习题:从基础到算法的实战演练
Aphelios380
C语言 c语言 算法 开发语言
在学习C语言的过程中,通过实际的练习题来巩固知识是非常有效的方法。下面我将分享一些C语言的经典练习题,涵盖了登录验证、函数递归、数据查找与排序等多个方面,希望能对正在学习C语言的小伙伴们有所帮助。练习题1:连续登录3次,锁定账号题目描述实现一个简单的登录验证系统,用户有3次尝试登录的机会,如果连续3次输入的用户名或密码错误,则锁定账号。代码实现#define_CRT_SECURE_NO_WARNI
AWS Amazon Aurora MySQL 性能监控与安全治理实战指南
ivwdcwso
运维 aws mysql 安全 rds
引言AmazonAuroraMySQL凭借其云原生架构和高性能特性,已成为企业核心数据库的首选。然而,缺乏体系化的监控与安全治理可能导致资源浪费、性能瓶颈甚至数据泄露。本文结合AWS官方最佳实践与真实运维场景,从监控工具、性能调优、安全加固到自动化治理,构建全链路解决方案。©ivwdcwso(ID:u012172506)一、监控体系搭建:工具选型与指标解读1.原生工具组合:精准捕捉核心指标Clou
Oracle 数据库基础入门(五):限制查询与范式三约定深度解析
Aphelios380
Oracle 数据库 oracle 学习 java
在Oracle数据库的学习进程中,限制查询与范式三约定是两个极为重要的概念。限制查询帮助我们精准获取特定范围的数据,而范式三约定则为数据库设计提供了科学的指导框架。对于Java全栈开发者而言,掌握这些知识不仅有助于高效地从数据库中提取数据,更能设计出结构合理、性能优良的数据库,为构建强大的应用系统奠定坚实基础。目录一、Oracle限制查询(一)与MySQL限制查询的对比(二)伪列的奥秘(三)限制查
ReactNative组件详解
Code4Android
编程语言 android ios react-native
ReactNative学习记录传送门ReactNative核心思想就是组件化,它基于前端框架React,在我们使用其开发Android和iOS的时候,共用一套组件即一套代码,增加了代码复用性。今天的这篇文章不不分析过多的知识点,主要介绍如下内容:如何进行自定义组件如何使用自定义组件组件的生命周期自定义组件ReactNative中我们实现的UI都是有组件组成的,但是有时候为了实现我们想要的效果,并且
7-11 sdut-String-5 图书价格汇总(II) (10 分)
灯火穿透了
PTA Java题 java
假设图书馆中图书信息的格式为:Java程序设计:34;Web程序设计:56;JSP程序设计:20按要求输出每本图书的名称及价格,计算所有图书的总价格并输出。输入格式:读入一行图书信息。如:Java程序设计:34;Web程序设计:56;JSP程序设计:20提示:每本书的价格是整数,价格与下一本书的名字之间有一个中文;价格前可能有空格,可能没有。输出格式:分别输出每本图书的名称及价格,一本书占一行,形
三、Jvm内存分配
刘总Java
Java虚拟机 jvm java 开发语言
今天的博客主题Java虚拟机——》Jvm内存分配什么是JVM内存分配呢?就是当我们创建一个对象的时候,要在JVM内存空间里为这个对象分配一些空间,来存放对象的一些属性信息。对象创建的流程1)类加载检查在创建对象的过程中,也就是new一个对象的时候。首先检查new指令的参数在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载,解析和初始化过。如有没有,说明这个类没有被加载使用过
Java生成LRC纵向冗余校验
YunFeiDong
Java java 开发语言 Modbus ASCII
纵向冗余校验(LongitudinalRedundancyCheck,简称:LRC)是通信中常用的一种校验形式,也称LRC校验或纵向校验;它是一种从纵向通道上的特定比特串产生校验比特的错误检测方法;通常Modbus协议ASCII模式采用LRC算法。1.生成LRC校验/***生成LRC校验值:**1)对需要校验的数据(2n个字符)两两组成一个16进制的数值求和;*2)将求和结果与256求模;*3)用
Java基础之JVM对象内存分配机制简介
aoneword
JVM基础 jvm java 开发语言
一对象内存分配1.1运行时数据区域1.2常见java应用启动JVM参数:-Xss:每个线程的栈大小(单位kb)-Xms:堆的初始大小,默认物理内存的1/64,示例:-Xms:4g-Xms:10m-Xmx:堆的最大可用大小,默认物理内存的1/4-Xmn:新生代大小-XX:NewRatio:默认2,表示新生代占老年代的1/2,占整个堆内存的1/3-XX:SurvivorRatio:默认8,表示一个su
python文件修改后不生效_pycharm修改代码后第一次运行不生效解决
weixin_39959126
python文件修改后不生效
SVN搭建简单教程一.引言笔者曾经试图在网上搜索一篇关于SVN源代码服务器搭建方面的中文技术文章,可惜,所找到的,要么是不完整,要么就是对笔者没什么帮助的文章,TortoiseSvn的帮助文档固然强大,但因为是英文,...java零碎知识点1.字符串有整型的相互转换12Stringa=String.valueOf(2);//integertonumericstringinti=Integer.pa
golang mysql分表_go分库分表 主从分离例子
连根塞
golang mysql分表
网上有很多介绍分库分表的文章,方法很多:```分区表切分垂直切分水平切分区间切分取模切分```这里不细说分库分表简单,但后期会带来一系列的难题:```事务Join分页```**数据库:**```master和slave是一个主从架构imagespider_db:[ImageSpider](https://github.com/bccber/imagespider)项目采集回来的数据,不需要部署主从
react 基础
理想和远方_在路上
react.js jsx
一.什么是react?react是一种用于构建用户界面的javaScript库react主要用来写html,或构建web应用如果用mvc的角度来看,react仅仅是视图层(v),也就是只负责视图的渲染,并不是提供了完成的M和C的功能。二.react的特点1.声明式只需要描述html看起来是什么样,就跟写html一样。react负责渲染UI,并在数据变化是更新UI。constjsx=HelloRea
go mysql 中间件_GitHub - wushilong/go-sharding: Mysql 分库分表中间件
网络安全技术联盟
go mysql 中间件
Go-Sharding简介数据库分库分表中间件,尽可能兼容ShardingSphere的golang实现,基于小米Gaea魔改,但是路由算法支持ShardingSphere的inline表达式风格,而不是Mycat/kingshard这类晦涩而又不灵活的配置,移除多租户功能(配置太复杂了,部署多套即可)为什么造这个轮子尝试了ShardingSphereProxy,其有着糟糕的insert性能和CP
java excel 导入 加校验_Java通过POI为Excel添加数据验证
夏至未至
java excel 导入 加校验
Stringpath="d:\\success.xlsx";StringsheetName="sheetlist";XSSFWorkbookwb=null;XSSFSheetsheetlist=null;FileinputFile=newFile(path);if(inputFile.exists()){wb=newXSSFWorkbook(newFileInputStream(path));}e
SpringAI赋能Java开发打造智能应用
java技术小馆
java AI编程
一、SpringAI是什么?为什么你需要它?想象一下,你的Java应用能够:理解自然语言自动生成代码智能分析数据提供个性化推荐这就是SpringAI带来的变革!它是Spring官方推出的AI集成框架,让你的Java应用轻松获得AI能力。传统开发vsSpringAI开发对比:能力传统开发SpringAI开发自然语言处理需要集成第三方SDK开箱即用开发效率手动实现复杂逻辑自动生成代码维护成本高低可扩展
IDEA编写JAVA的常用快捷键
峥嵘轻稠
intellij-idea java intellij idea
(摘要:这是我平常使用IDEA的快捷键,希望能帮到和我一样刚入门的小白~~创作不易,希望能得到点赞关注支持嘿嘿嘿~~~)Ctrl+A:全选Ctrl+Z:撤销Ctrl+X:剪切Ctrl+C:复制Ctrl+V:粘贴Ctrl+Y:删除当前行Ctrl+D:复制当前行到下一行Ctrl+O:选择可重写的方法Ctrl+I:重写接口方法Ctrl+/:快速单行注释Ctrl+Shift+/:快速多行注释Ctrl+Al
JAVA学习——DAY1
E卤蛋
JAVA学习 java
几个cmd终端命令:cls——清屏cd——移至所在路径,后跟绝对路径or相对路径ip-config——查看本机ip信息java开发环境:JDK——java开发环境,包含:JRE(Java运行时环境),JVM(java虚拟机),以及各类开发库文件;安装目录:bin目录:两个重要——javac.exe(java编译工具),从.java文件编译为.class(字节码文件),java.exe(Java运行
JVM两种内存分配方式
小白,想脱白
jvm
1、指针碰撞如果jvm内存是规整的,就是一边是已使用的内存,另外一边是未使用的内存,中间是指针,jvm需要给新对象分配内存时,就会将指针往未使用的内存移动一段和新对象一样大小的距离,这样jvm就完成了内存分配。2、空闲列表如果jvm内存不是规整的,已使用的,未使用的内存,都是杂乱无章的,这个时候就不可能使用指针碰撞,Java虚拟机就会维护一个空闲列表,用来记录哪些内存是可用的,然后jvm给新对象分
JAVA多线程详解(超详细)
m0_74823434
面试 学习路线 阿里巴巴资料职业发展 java python 开发语言 后端
目录一、线程简介1、进程、线程2、并发、并行、串行3、进程的三态二、线程实现1、继承Thread类2、实现Runnable接口3、实现Callable接口(不常用)三、线程常用方法1、线程的状态2、线程常用方法四、多线程1、守护(Deamon)线程2、多线程并发与同步3、死锁4、Lock(锁)5、线程协作6、线程池一、线程简介1、进程、线程程序:开发写的代码称之为程序。程序就是一堆代码,一组数据和
JMeter 不同协议测试最佳实践汇总
那片海还在吗
test jmeter 测试工具
JMeter不同协议测试最佳实践汇总一、JMeter测试HTTPS(一)环境准备JMeter安装:从JMeter官方网站下载并解压JMeter到本地。Java环境:确保系统已安装Java运行环境(JRE)或开发环境(JDK),建议使用Java8及以上版本。(二)创建测试计划启动JMeter,默认有一个测试计划。右键点击测试计划,选择“添加”->“线程(用户)”->“线程组”,可设置线程数、循环次数
图数据库Neo4j面试内容整理-图遍历和最短路径
不务正业的猿
面试 Neo4j 数据库 neo4j 网络 面试 职场和发展 图数据库
图遍历和最短路径是图数据库中两个非常重要的概念,尤其是在图数据结构中,它们是解决许多问题(如社交网络分析、推荐系统、网络分析等)的核心算法。Neo4j提供了强大的图遍历和最短路径查询能力,帮助用户有效地从图中提取信息。1.图遍历(GraphTraversal)
图数据库Neo4j面试内容整理-Cypher 查询优化
不务正业的猿
面试 Neo4j 数据库 neo4j 面试 职场和发展 图数据库
Cypher查询优化是在Neo4j中提高查询性能的关键部分。Cypher是Neo4j的查询语言,允许我们通过图的结构进行高效的数据检索。然而,随着数据量的增大和查询复杂度的提高,查询性能可能会变差。为了优化Cypher查询,我们可以使用多种策略,包括合理设计查询、利用索引和约束、避免不必要的查询操作等。以下是一些Cypher查询优化的最佳实践和策略:1.使用索引(Index)
oracle分区方式
狂野弘仁
数据库基础 oracle 数据库
oracle分区表的分区有四种类型:范围分区、散列分区、列表分区和复合分区。1、范围分区就是根据数据库表中某一字段的值的范围来划分分区。数据中有空值,Oracle机制会自动将其规划到maxvalue的分区中。2、散列分区根据字段的hash值进行均匀分布,尽可能地实现各分区所散列的数据相等。散列分区即为哈希分区,Oracle采用哈希码技术分区,具体分区如何由Oracle说的算,也可能我下一次搜索就不
【React全解】React起手式
caihuayuan4
面试题汇总与解析 spring sql java 大数据
如何引入React从bootcdn引入React按顺序引入React然后引入ReactDOMCommonJSVSUMD规范JavaScript的模块定义和加载机制,降低了学习和使用各种框架的门槛,能够以一种统一的方式去定义和使用模块,提高开发效率,降低了应用维护成本CommonJSCommonJS是一种规范,NodeJS是这种规范的实现CommonJS模块是对象,是运行时加载,运行时才把模块挂载在
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别
caihuayuan4
面试题汇总与解析 spring sql java 大数据 课程设计
com.mysql.jdbc.Driver是mysql-connector-java5中的com.mysql.cj.jdbc.Driver是mysql-connector-java6中的所以在使用的时候一定要注意版本com.mysql.jdbc.DriverdriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/te
解读Servlet原理篇二---GenericServlet与HttpServlet
周凡杨
java HttpServlet 源理 GenericService 源码
在上一篇《解读Servlet原理篇一》中提到,要实现javax.servlet.Servlet接口(即写自己的Servlet应用),你可以写一个继承自javax.servlet.GenericServletr的generic Servlet ,也可以写一个继承自java.servlet.http.HttpServlet的HTTP Servlet(这就是为什么我们自定义的Servlet通常是exte
MySQL性能优化
bijian1013
数据库 mysql
性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间。性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等。本文介绍方法的主要有:
a.优化查询
b.优化数据库结构
ThreadPool定时重试
dai_lm
java ThreadPool thread timer timertask
项目需要当某事件触发时,执行http请求任务,失败时需要有重试机制,并根据失败次数的增加,重试间隔也相应增加,任务可能并发。
由于是耗时任务,首先考虑的就是用线程来实现,并且为了节约资源,因而选择线程池。
为了解决不定间隔的重试,选择Timer和TimerTask来完成
package threadpool;
public class ThreadPoolTest {
Oracle 查看数据库的连接情况
周凡杨
sql oracle 连接
首先要说的是,不同版本数据库提供的系统表会有不同,你可以根据数据字典查看该版本数据库所提供的表。
select * from dict where table_name like '%SESSION%';
就可以查出一些表,然后根据这些表就可以获得会话信息
select sid,serial#,status,username,schemaname,osuser,terminal,ma
类的继承
朱辉辉33
java
类的继承可以提高代码的重用行,减少冗余代码;还能提高代码的扩展性。Java继承的关键字是extends
格式:public class 类名(子类)extends 类名(父类){ }
子类可以继承到父类所有的属性和普通方法,但不能继承构造方法。且子类可以直接使用父类的public和
protected属性,但要使用private属性仍需通过调用。
子类的方法可以重写,但必须和父类的返回值类
android 悬浮窗特效
肆无忌惮_
android
最近在开发项目的时候需要做一个悬浮层的动画,类似于支付宝掉钱动画。但是区别在于,需求是浮出一个窗口,之后边缩放边位移至屏幕右下角标签处。效果图如下:
一开始考虑用自定义View来做。后来发现开线程让其移动很卡,ListView+动画也没法精确定位到目标点。
后来想利用Dialog的dismiss动画来完成。
自定义一个Dialog后,在styl
hadoop伪分布式搭建
林鹤霄
hadoop
要修改4个文件 1: vim hadoop-env.sh 第九行 2: vim core-site.xml <configuration> &n
gdb调试命令
aigo
gdb
原文:http://blog.csdn.net/hanchaoman/article/details/5517362
一、GDB常用命令简介
r run 运行.程序还没有运行前使用 c cuntinue
Socket编程的HelloWorld实例
alleni123
socket
public class Client
{
public static void main(String[] args)
{
Client c=new Client();
c.receiveMessage();
}
public void receiveMessage(){
Socket s=null;
BufferedRea
线程同步和异步
百合不是茶
线程同步 异步
多线程和同步 : 如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法
多线程和异步:多线程可以做不同的事情,涉及到线程通知
&
JSP中文乱码分析
bijian1013
java jsp 中文乱码
在JSP的开发过程中,经常出现中文乱码的问题。
首先了解一下Java中文问题的由来:
Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,
js实现页面跳转重定向的几种方式
bijian1013
JavaScript 重定向
js实现页面跳转重定向有如下几种方式:
一.window.location.href
<script language="javascript"type="text/javascript">
window.location.href="http://www.baidu.c
【Struts2三】Struts2 Action转发类型
bit1129
struts2
在【Struts2一】 Struts Hello World http://bit1129.iteye.com/blog/2109365中配置了一个简单的Action,配置如下
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configurat
【HBase十一】Java API操作HBase
bit1129
hbase
Admin类的主要方法注释:
1. 创建表
/**
* Creates a new table. Synchronous operation.
*
* @param desc table descriptor for table
* @throws IllegalArgumentException if the table name is res
nginx gzip
ronin47
nginx gzip
Nginx GZip 压缩
Nginx GZip 模块文档详见:http://wiki.nginx.org/HttpGzipModule
常用配置片段如下:
gzip on; gzip_comp_level 2; # 压缩比例,比例越大,压缩时间越长。默认是1 gzip_types text/css text/javascript; # 哪些文件可以被压缩 gzip_disable &q
java-7.微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如 h1 , h2 ,判断这俩个链表是否相交
bylijinnan
java
public class LinkListTest {
/**
* we deal with two main missions:
*
* A.
* 1.we create two joined-List(both have no loop)
* 2.whether list1 and list2 join
* 3.print the join
Spring源码学习-JdbcTemplate batchUpdate批量操作
bylijinnan
java spring
Spring JdbcTemplate的batch操作最后还是利用了JDBC提供的方法,Spring只是做了一下改造和封装
JDBC的batch操作:
String sql = "INSERT INTO CUSTOMER " +
"(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
[JWFD开源工作流]大规模拓扑矩阵存储结构最新进展
comsci
工作流
生成和创建类已经完成,构造一个100万个元素的矩阵模型,存储空间只有11M大,请大家参考我在博客园上面的文档"构造下一代工作流存储结构的尝试",更加相信的设计和代码将陆续推出.........
竞争对手的能力也很强.......,我相信..你们一定能够先于我们推出大规模拓扑扫描和分析系统的....
base64编码和url编码
cuityang
base64 url
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
web应用集群Session保持
dalan_123
session
关于使用 memcached 或redis 存储 session ,以及使用 terracotta 服务器共享。建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单个对象比较大,而且数据类型丰富,不只是缓存 session,还可以做其他用途,一举几得啊。1、使用 filter 方法存储这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简
Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
dcj3sjt126com
数据库
public function getMinLimit () { $sql = "..."; $result = yii::app()->db->createCo
solr StatsComponent(聚合统计)
eksliang
solr聚合查询 solr stats
StatsComponent
转载请出自出处:http://eksliang.iteye.com/blog/2169134
http://eksliang.iteye.com/ 一、概述
Solr可以利用StatsComponent 实现数据库的聚合统计查询,也就是min、max、avg、count、sum的功能
二、参数
百度一道面试题
greemranqq
位运算 百度面试 寻找奇数算法 bitmap 算法
那天看朋友提了一个百度面试的题目:怎么找出{1,1,2,3,3,4,4,4,5,5,5,5} 找出出现次数为奇数的数字.
我这里复制的是原话,当然顺序是不一定的,很多拿到题目第一反应就是用map,当然可以解决,但是效率不高。
还有人觉得应该用算法xxx,我是没想到用啥算法好...!
还有觉得应该先排序...
还有觉
Spring之在开发中使用SpringJDBC
ihuning
spring
在实际开发中使用SpringJDBC有两种方式:
1. 在Dao中添加属性JdbcTemplate并用Spring注入;
JdbcTemplate类被设计成为线程安全的,所以可以在IOC 容器中声明它的单个实例,并将这个实例注入到所有的 DAO 实例中。JdbcTemplate也利用了Java 1.5 的特定(自动装箱,泛型,可变长度
JSON API 1.0 核心开发者自述 | 你所不知道的那些技术细节
justjavac
json
2013年5月,Yehuda Katz 完成了JSON API(英文,中文) 技术规范的初稿。事情就发生在 RailsConf 之后,在那次会议上他和 Steve Klabnik 就 JSON 雏形的技术细节相聊甚欢。在沟通单一 Rails 服务器库—— ActiveModel::Serializers 和单一 JavaScript 客户端库——&
网站项目建设流程概述
macroli
工作
一.概念
网站项目管理就是根据特定的规范、在预算范围内、按时完成的网站开发任务。
二.需求分析
项目立项
我们接到客户的业务咨询,经过双方不断的接洽和了解,并通过基本的可行性讨论够,初步达成制作协议,这时就需要将项目立项。较好的做法是成立一个专门的项目小组,小组成员包括:项目经理,网页设计,程序员,测试员,编辑/文档等必须人员。项目实行项目经理制。
客户的需求说明书
第一步是需
AngularJs 三目运算 表达式判断
qiaolevip
每天进步一点点 学习永无止境 众观千象 AngularJS
事件回顾:由于需要修改同一个模板,里面包含2个不同的内容,第一个里面使用的时间差和第二个里面名称不一样,其他过滤器,内容都大同小异。希望杜绝If这样比较傻的来判断if-show or not,继续追究其源码。
var b = "{{",
a = "}}";
this.startSymbol = function(a) {
Spark算子:统计RDD分区中的元素及数量
superlxw1234
spark spark算子 Spark RDD分区元素
关键字:Spark算子、Spark RDD分区、Spark RDD分区元素数量
Spark RDD是被分区的,在生成RDD时候,一般可以指定分区的数量,如果不指定分区数量,当RDD从集合创建时候,则默认为该程序所分配到的资源的CPU核数,如果是从HDFS文件创建,默认为文件的Block数。
可以利用RDD的mapPartitionsWithInd
Spring 3.2.x将于2016年12月31日停止支持
wiselyman
Spring 3
Spring 团队公布在2016年12月31日停止对Spring Framework 3.2.x(包含tomcat 6.x)的支持。在此之前spring团队将持续发布3.2.x的维护版本。
请大家及时准备及时升级到Spring
fis纯前端解决方案fis-pure
zccst
JavaScript
作者:zccst
FIS通过插件扩展可以完美的支持模块化的前端开发方案,我们通过FIS的二次封装能力,封装了一个功能完备的纯前端模块化方案pure。
1,fis-pure的安装
$ fis install -g fis-pure
$ pure -v
0.1.4
2,下载demo到本地
git clone https://github.com/hefangshi/f