动态SQL
Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。
(比如多条件查询的设置,实现判空等)
1、if
创建DynamicSQLMapper接口,DynamicSQLMapper.xml文件
DynamicSQLMapper接口:
List getEmpByCondition(Emp emp);
DynamicSQLMapper.xml中:
select * from t_emp where
emp_name = #{empName}
and age = #{age}
and gender = #{gender}
List集合作为方法的返回值,以防查出多个数据。
以上用if条件作为sql的查询判断筛选结果,但存在问题,原意是判断如果查询条件中姓名不为空(即需要查询姓名)则将姓名条件赋值,后面对年龄、性别的if语句也是做同样的判断,实现最终sql语句的拼接。
创建测试方法DynamicSQLMapperTest
public void testGetEmpByCondition(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
Emp emp = new Emp(null, "大大", 7, "女");
List empByCondition = mapper.getEmpByCondition(emp);
empByCondition.forEach(System.out::println);
}
从赋值条件可以看出,是实现查询姓名为大大、年龄为7、性别为女的记录。如下得到对应的查询结果,我们可以知道如果只有性别做了指定,到那时其余为空,则我们将查询到男或女的所有数据。(这个实现其实就是if的逻辑,如果我们设定的条件不为空则会拼接到sql语句,进行条件查询)
但是如果第一个条件(上述代码为对empName是否赋值的判断)不成立,where后则会直接凭借下一个语句,为符合和语法(where后面不可以直接加and),一般会在where语句后加上一个恒成立条件,拼接较为完善的sql语句
select * from t_emp where 1=1
and emp_name = #{empName}
and age = #{age}
and gender = #{gender}
2、where
where和if一般结合使用:
select * from t_emp
emp_name = #{empName}
and age = #{age}
and gender = #{gender}
a>若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字
eg:上述条件都不满足,则会执行select * from t_emp
b>若where标签中的if条件满足,则where标签会自动添加where关键字,
eg:第一个条件满足,但前面没有where会自动添加即select * from t_emp where emp_name = #{empName}
并将条件最前方多余的and去掉 ,eg:第一个条件不满足,后面带有and的条件满足,则自动去掉and拼接,
select * from t_emp where age = #{age} and gender = #{gender} (后面两个都满足) 注意:where标签不能去掉条件最后多余的and(即把and放在条件后面时,age = #{age} and)
3、trim
trim用于去掉或添加标签中的内容 常用属性: prefix:在trim标签中的内容的前面添加某些内容 prefixOverrides:在trim标签中的内容的前面去掉某些内容 suffix:在trim标签中的内容的后面添加某些内容 suffixOverrides:在trim标签中的内容的后面去掉某些内容
select * from t_emp
emp_name = #{empName} and
age = #{age} and
gender = #{gender} and
4、choose、when、otherwise
choose、when(if else...if)、otherwise(else)相当于if...else if..else
(when至少设置一个,otherwise最多设置一个)
select * from t_emp
emp_name = #{empName}
age = #{age}
gender = #{gender}
上述逻辑:当为empName赋值查询(即不为null或空字符串时)将emp_name = #{empName}拼接到sql语句,但是后面的内容将不再判断执行,只要有一个满足要求,后面都不会再继续判断,而当前面都不满足代码中有othwise标签,则执行该标签的内容(即都没有给empName合age赋值,则根据gender赋值查询(注意,当查询内容条件都为空时,因为在where标签下,会自动补上where,则查询语句变成select * from t_emp WHERE gender = ?,查询结果如下
a
5、foreach
1、用foreach实现批量添加
insert into t_emp values
(null,#{emp.empName},#{emp.age},#{emp.gender},null)
如果传输过来的是list集合数据,collection属性应该写list,可以采取@param注解方法,那么下次直接填写设置的参数名即可。即@param(“emps”),则collection=emps获取该list集合数据。
且item的赋值就是个参数名,可以自己取,记得插入的值不是empName,而是emp.empName(因为item在这里为emp,所以是item.empName),我们获取的是list集合,里面都是由Emp对象组成,所以要获取单个属性值,应该是对象.属性名的形式(我是这么理解的)
上面代码的相关属性如下,可以知道separator=”,“是为了实现插入多个数值并隔开的效果,values(),(),(),()(不是单纯的在插入语句后加,因为最后还有会一个逗号存在
属性:
collection:设置要循环的数组或集合
item:表示集合或数组中的每一个数据
separator:设置循环体之间的分隔符
open:设置foreach标签中的内容的开始符
close:设置foreach标签中的内容的结束符
测试代码如下,
public void testinsertMoreEmp(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
Emp emp = new Emp(null, "小饿", 3, "男");
Emp emp1 = new Emp(null, "紫紫", 7, "女");
Emp emp2 = new Emp(null, "凹凸", 4, "女");
List emps = Arrays.asList(emp,emp1,emp2);
mapper.insertMoreEmp(emps);
}
插入结果如图
(补充:mapper接口的方法中参数值为list的时候,mybatis都会把数据放在map中,以list为键,当前参数为值,如果是数组,则以array为键,当前参数为值
eg
如下为数组形式的测试方法:
public void testinsertMoreEmpArray(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
Emp emp = new Emp(null, "小粉", 3, "女");
Emp emp1 = new Emp(null, "小黑", 4, "女");
Emp emp2 = new Emp(null, "三日兔", 7, "女");
Emp[] emps = new Emp[]{emp,emp1,emp2};
mapper.insertMoreEmpArray(emps);
}
所以还是用注解好,直接写注解取的名字。
2、用foreach实现批量删除
delete from t_emp where emp_id in
(
#{empId}
)
其括号可以如下替换表示
或是
(seperator=or,其实在拼接sql语句时or前后自动由空格)
如下为测试方法,删除id为10和13的记录
public void testdeleteMoreEmp(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
Integer[] empIds = {10, 13};
mapper.deleteMoreEmp(empIds);
}
SQL片段
sql标签,将常用的sql片段进行记录,用include的标签在需要时引入。
emp_id,emp_name,age,gender,dept_id
select from t_emp
id名自取
MyBatis的缓存
1、MyBatis的一级缓存(默认开启)
一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问
使一级缓存失效的四种情况:
1) 不同的SqlSession对应不同的一级缓存
(所以如果是如下测试创建并使用了不同的SqlSession,
public void testGetEmpById(){
SqlSession sqlSession1 = SqlSessionUtil.getSqlSession();
CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);
Emp empById = mapper1.getEmpById(1);
System.out.println(empById);
Emp empById1 = mapper1.getEmpById(1);
System.out.println(empById1);
SqlSession sqlSession2 = SqlSessionUtil.getSqlSession();
CacheMapper mapper2 = sqlSession2.getMapper(CacheMapper.class);
Emp empById2 = mapper2.getEmpById(1);
System.out.println(empById2);
}
则会执行两次sql语句,第一次打印两个结果(对应empById、empById1,结果缓存,直接读取),第二次就是后面再次创建调用SqlSession,再次执行了sql语句
2) 同一个SqlSession但是查询条件不同
3) 同一个SqlSession两次查询期间执行了任何一次增删改操作
(因为任意一次增删改会清除缓存,查询数据更新)
4) 同一个SqlSession两次查询期间手动清空了缓存
sqlSession1.clearCache();
2、MyBatis的二级缓存
二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取
(二级缓存需要手动设置,一级不用)
二级缓存开启的条件: a>在核心配置文件中,设置全局配置属性cacheEnabled="true",默认为true,不需要设置 b>在映射文件中设置标签 c>二级缓存必须在SqlSession关闭或提交之后有效
sqlSession.close() d>查询的数据所转换的实体类类型必须实现序列化的接口
public void testCache() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
CacheMapper mapper = sqlSession.getMapper(CacheMapper.class);
Emp empById = mapper.getEmpById(1);
System.out.println(empById);
sqlSession.close();//数据默认保存到一级缓存,只要关闭或提交sqlSession后才会将存入二级缓存
SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);
Emp empById1 = mapper1.getEmpById(1);
System.out.println(empById1);
}
}
上述代码没有用工具类,因为要确保。通过同一个SqlSessionFactory创建的SqlSession查询 使二级缓存失效的情况:
两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效
3、二级缓存的相关配置
在mapper配置文件中添加的cache标签可以设置一些属性:
eviction属性:缓存回收策略
LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。
FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
默认的是 LRU。
flushInterval属性:刷新间隔,单位毫秒
默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新
size属性:引用数目,正整数
代表缓存最多可以存储多少个对象,太大容易导致内存溢出
readOnly属性:只读,true/false
true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了
很重要的性能优势。
false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是
false。
4、MyBatis缓存查询的顺序
先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
如果二级缓存没有命中,再查询一级缓存
如果一级缓存也没有命中,则查询数据库
SqlSession关闭之后,一级缓存中的数据会写入二级缓存
5、整合第三方缓存EHCache(针对二级缓存,整合第三方缓存实现二级缓存
Ehcache 是一个流行的开源 Java 缓存框架,用于将数据存储在内存中,以提高应用程序的性能和响应速度。MyBatis 提供了对 Ehcache 的集成支持,可以将 Ehcache 作为 MyBatis 的二级缓存实现。
a>添加依赖
org.mybatis.caches
mybatis-ehcache
1.2.1
ch.qos.logback
logback-classic
1.2.3
b>各jar包功能
c>在resources下创建EHCache的配置文件ehcache.xml
上面的路径是指将日志等存储到我们电脑的路径,如下是最后运行所生成的文件及其存放路径
配置文件说明
d>设置二级缓存的类型
在 MyBatis 的 XML 配置文件中,使用 标签,通过设置 type 属性为 org.mybatis.caches.ehcache.EhcacheCache,可以启用 Ehcache 缓存作为二级缓存。这样配置后,MyBatis 将使用 Ehcache 来缓存查询结果,减少与数据库的交互次数,提高系统的性能。
在CacheMapper.xml文件中:
e>加入logback日志 存在SLF4J时,作为简易日志的log4j将失效,此时我们需要借助SLF4J的具体实现logback来打印日志。 在resources下创建logback的配置文件logback.xml
[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger]
[%msg]%n
(这部分只要了解可以第三方配置即可)
MyBatis的逆向工程
正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的。 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成Java实体类、Mapper接口 、Mapper映射文件
1、创建逆向工程的步骤
a>添加依赖和插件 (在pom.xml文件中添加)
org.mybatis
mybatis
3.5.7
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.0
org.mybatis.generator
mybatis-generator-core
1.3.2
com.mchange
c3p0
0.9.2
mysql
mysql-connector-java
5.1.8
b>创建MyBatis的核心配置文件
c>创建逆向工程的配置文件(文件名必须是:generatorConfig.xml
(注意是userId不是username)
我们知道到这一步后,文件目录如下
在配置完成后点击下图阴影部分
再看文件目录可以发现,生成很多之前我们需要手动创建的文件
(注意,
1、上述自动构建的过程,只是满足我们单表操作的需求。记得utils包下的工具类等要自己取创建,properitise文件等。(只是生成基本的数据表对应的实体类,接口和配置文件等)
2、如果想要再次生成已经生成的文件,记得把原来的文件删除,避免在原有基础上追加出现问题。
3、在接口中生成的基本的增删改查,且生成的实体类只有简单的getter和setter方法,没有toString,要自己手动添加。(属性名有一定规律,符合字段的驼峰形式,例如emp_id
字段对应的属性名empId)
4、生成后我们在自己完善mybatis-config.xml内容。
5、MyBatis3Simple: 生成基本的CRUD(清新简洁版) MyBatis3: 生成带条件的CRUD(奢华尊享版)
(CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中DataBase或者持久层的基本操作功能。)
下面将会生成Mybatis3
(如果是在之前生成了的基础上再去进行如下操作,记得删掉之前自动生成的文件)
在generatorConfig.xml中修改targetRuntime
再执行
结果如图
(和前面的区别主要就是生成的接口方法更多更全面
(记得如果要用@Test注解,使用测试单元,要在配置文件添加junit依赖
junit
junit
4.12
发现如下问题,
答案是:pom.xml文件中要把MySQL驱动配置放在标签外面,而且我也修改了这个版本,应该和版本没关系。
创建测试文件去使用自动生成的方法,发现还挺好用。
我们要根据方法名知道其用法,上述代码中selectByPrimaryKey是根据主键去查询,
empExample.createCriteria().andEmpNameEqualTo("紫紫").andAgeGreaterThan(3);
empExample.or().andGenderEqualTo("女");也是根据其意思知道,逻辑是匹配名字为紫紫且年龄大于3的数据,还有将性别为女的记录全部输出。
创建条件对象,通过andXXX方法为SQL添加查询添加,每个条件之间是and关系,将之前添加的条件通过or拼接其他条件。
public void testMBG(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
EmpExample empExample = new EmpExample();
empExample.createCriteria().andEmpNameEqualTo("大大");
List emps = mapper.selectByExample(empExample);
emps.forEach(System.out::println);
Emp emp1 = new Emp(null,"小紫",null,"女",3);
int i = mapper.updateByExampleSelective(emp1, empExample);
System.out.println(i);
}
上面对比结果可以知道,一些方法的用法,尤其是selective的方法,和之前的清晰简洁版不一样的是,会对一些条件进行判断,如上面使用的方法(updateByExampleSelective(emp1, empExample);)的意思就是对比empExample,如果emp1中有条件为null(即未被赋值条件)时不会直接用null覆盖原来的值,而简洁版生成的方法,会将null直接覆盖。
分页插件
1、分页插件使用步骤
先了解一下相关知识
limit index,pageSize
pageSize:每页显示的条数
pageNum:当前页的页码
index:当前页的起始索引,index=(pageNum-1)*pageSize
count:总记录数
totalPage:总页数
totalPage = count / pageSize;
if(count % pageSize != 0){
totalPage += 1;
}
pageSize=4,pageNum=1,index=0 limit 0,4
(当前为第一页,每页数据有4条数据,第一页第一条数据索引为0
pageSize=4,pageNum=3,index=8 limit 8,4
(当前为第三页,每页数据有4条数据,第三页第一条数据索引为2X4=8,前面有两页共8条数据,又因为索引从0开始,所以就是原本为9-1=8.直接2X4=8的规律即index=(pageNum-1)*pageSize
pageSize=4,pageNum=6,index=20 limit 20,4
(当前为第六页,每页数据有4条数据,第六页第一条数据索引为5X4=20
首页 上一页 2 3 4 5 6 下一页 末页 (一般的样式都是这样的)
a>添加依赖
com.github.pagehelper
pagehelper
5.2.0
b>配置分页插件 在MyBatis的核心配置文件中配置插件(注意标签位置,有顺序的)
2、分页插件的使用
public void testPage(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
//查询功能之前开启分页功能
Page page = PageHelper.startPage(1, 4);
List list = mapper.selectByExample(null);
list.forEach(System.out::println);
System.out.println(page);
}
a>在查询功能之前使用PageHelper.startPage(int pageNum, int pageSize)开启分页功能
pageNum:当前页的页码 pageSize:每页显示的条数
如下代码测试,结果确实只打印四条数据
当我们打印输出一下page的值时可以看到关于分页的相关数据
b>在查询获取list集合之后,使用PageInfo pageInfo = new PageInfo<>(List list, int navigatePages)获取分页相关数据
public void testPage(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
//查询功能之前开启分页功能
Page page = PageHelper.startPage(1, 4);
List list = mapper.selectByExample(null);
//查询功之后可以获取分页相关的所有数据
PageInfo pageInfo = new PageInfo<>(list, 5);
System.out.println(page);
System.out.println("------------");
System.out.println(pageInfo);
}
list:分页之后的数据 navigatePages:导航分页的页码数
如下表示的泛型为当前数据要转化的实体类类型
(上图最后面只输出了1-4范围empid的数据,因为上上面代码执行的查询结果就是输出四条)
c>分页相关数据(常用数据): pageNum:当前页的页码 pageSize:每页显示的条数 size:当前页显示的真实条数 total:总记录数 pages:总页数 prePage:上一页的页码 nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页 hasPreviousPage/hasNextPage:是否存在上一页/下一页 navigatePages:导航分页的页码数 navigatepageNums:导航分页的页码,[1,2,3,4,5] (这是为后面实现ssm整合时提的基础知识,分页的内容)
你可能感兴趣的:(mybatis,java)
JAVA--集合
xiaoxiaobaozhu
java开发语言
集合的概念集合类存放的都是对象的引用,而非对象本身。集合中不能存放基本数据类型,只能存放引用数据类型。集合是一个动态的数组,数组的长度不可发生改变,集合的长度是可以改变的。Collection的特点Collection接口中的元素是可重复的但无序的;Lis集合元素是可重复的有序的,每一个元素都存在一个索引;ArryList集合对数组进行封装,是顺序结构;特点查询快,增删慢,线程不安全,效率高;链式
wiredtiger java_mongodb数据库损坏,丢失WiredTIger.wt等meta文件,通过collection*.wt恢复数据...
又逢账号起名时
wiredtigerjava
mongodb恢复wiredtiger数据Backgroundmongodb是一款开源NoSQL非关系型数据库,通过database,collection组织存储数据文件,其中在每个collection中,每条数据被存储为一个document,而每个document为一组键值对。此外,mongodb默认使用WiredTiger作为数据存储引擎,WiredTiger为数据管理提供了不同粒度的并发控制
java json-rpc_JSON-RPC(jsonrpc4j)使用demo
马晓波
javajson-rpc
服务端开发,在很多情况下,需要使用到RPC框架,今天发现一款很轻量的RPC框架——JSON-RPC。jsonrpc是一种以json为消息格式的远程调用服务,它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。这种远程过程调用可以使用http作为传输协议,也可以使用其它传输协议,传输的内容是json消息体。jsonrpc和xmlrpc相比具有很多优点。
Implementing JSON RPC 2.0 over WebSocket with Spring Bo
AI天才研究院
Python实战Java实战深度学习实战自然语言处理人工智能语言模型编程实践开发语言架构设计
作者:禅与计算机程序设计艺术1.简介JSON-RPC(RemoteProcedureCall)是一种远程过程调用(RPC)协议。它允许客户端通过网络从远端服务器请求服务。本文将展示如何在SpringBoot框架上实现JSON-RPC协议。基于WebSocket,前端通过JavaScript调用后端的方法并获取结果。我们还将讨论关于性能,容错性,可扩展性等方面的问题。2.基本概念及术语JSONJav
ReentrantLock的多个条件用法
众乐乐_2008
面试java算法开发语言
Condition是java.util.concurrent.locks包中的一个接口,它提供了类似于传统的线程间通信机制(如wait()、notify()、notifyAll())的功能,但更强大和灵活。通过lock.newCondition()可以创建多个条件变量。以下是一个简单的示例,展示了如何使用ReentrantLock和Condition来支持多个条件变量:importjava.uti
推荐开源项目:json-rpc-2.0 - 灵活强大的JSON-RPC 2.0框架
秦贝仁Lincoln
推荐开源项目:json-rpc-2.0-灵活强大的JSON-RPC2.0框架项目地址:https://gitcode.com/gh_mirrors/js/json-rpc-2.01、项目介绍json-rpc-2.0是一个轻量级的JavaScript库,它让你的客户端和服务器能够通过符合JSON-RPC2.0规范的功能调用进行通信。无论你是基于HTTP、WebSocket,甚至是TCP或UDP,这个
用java实现word(docx)转换为pdf格式文档(简单版)
xiaoxiaobaozhu
javawordpdf
导入依赖com.documents4jdocuments4j-local1.0.3com.documents4jdocuments4j-transformer-msoffice-word1.0.3代码//word文档替换成pdf文档privatestaticvoidreplaceWordToPdf(StringwordPath,StringpdfPath){FileinputWord=newFil
Python基于Django的漏洞扫描系统【附源码、文档说明】
Java老徐
Python毕业设计pythondjango漏洞扫描系统漏洞扫描Python漏洞扫描系统PythonDjango
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌文末获取源码联系精彩专栏推荐订阅不然下次找不到哟2024-2025年Java毕业设计选题推荐Python基于Django的微博热搜、微博舆论可视化系统(V3.0)基于PythonDjango的北极星招聘数据可视化系统感兴趣的可以先收
Spring Security与OAuth2:构建安全Web应用的强大组合
小码快撩
springjava后端
引言随着Web应用的普及,安全性成为了开发者必须面对的重要问题。为了保障用户数据和隐私的安全,认证和授权成为了应用程序的核心需求。在Java生态系统中,SpringSecurity和OAuth2是两个广受欢迎的解决方案,它们共同提供了全面的安全机制。本文将深入探讨如何使用SpringSecurity和OAuth2来构建安全的Web应用。一、SpringSecurity概述身份验证(Authenti
LambdaQueryWrapper的使用
java
原文链接项目GitHub地址:https://github.com/Snowstorm0/learn-lambda-query-wrapper项目Gitee地址:https://gitee.com/Snowstorm0/learn-lambda-query-wrapper1添加maven依赖在pom中添加如下依赖:com.baomidoumybatis-plus-boot-starter3.5.3
Go语言常量和iota:比Java更优雅的常量定义方式
后端
Go语言常量和iota:比Java更优雅的常量定义方式前言嘿,各位开发者们!今天我们来聊一个有趣的话题——Go语言中的常量。如果你觉得常量这个话题很无聊,那可要打起精神了,因为Go语言的常量设计可是别出心裁,尤其是那个神奇的iota,简直就是常量定义界的"黑科技"!一、常量的基本认识在开始之前,让我们先看看Go语言中常量的基本使用方式://单个常量定义constPi=3.14159//多个常量定义
Stack(栈)
alien爱吃蛋挞
Javajava数据结构
定义:在Java编程语言中,栈(Stack)是一种非常重要的数据结构,具有后进先出的特性,即最后入栈的元素最先出栈。栈通常用于存储临时性的数据,如方法调用过程中的局部遍历、操作数栈等。图像理解:我们在这里要理解栈顶和栈底。这里的"顶"和"底"与我们常识中的顶端和底端是相反的。栈顶(Top):栈顶是栈中最后加入的元素的位置。在栈的操作中,所有入栈(push)和出栈(pop)的操作都是针对栈顶元素进行
程序员方法论系列:类为啥是类?class为啥是class?咱得唠明白!
FoyoDesigner
程序员方法论java程序人生改行学it
类到底是啥玩意儿?咱程序员天天写类(class),可类到底是啥玩意儿?当年学Java的时候,老师说过一句话:“类是对代码的建模单位。”这话听着挺高大上,但啥是“建模”?咱那会儿也是一脸懵。多年后的今天,咱终于琢磨明白了:类是对现实世界的抽象映射,是一种建模方式。类的构成:属性、方法、构造器说到类,咱得先唠唠它的构成。类一般由三部分组成:1.属性:描述对象的特征,比如椅子的颜色、腿的数量。2.方法:
2月第二讲:mybatis是如何识别分表位的
2501_90442144
mybatis
带着问题,我花了不少时间深入了读了一下这部分的源码,终于搞清楚了,借本文分享一下。本文主要环境是mybatis-plus-boot-starter3.4.3,不过用的基本上仍然是mybatis的特性。流程图以查询为例,可以先看下流程图,大致了解一下整个过程。关键的类和对象在流程图里出现了一些类和其实例化的对象,有必要选其中关键的介绍一下。MappedStatement类全名org.apache.i
正则表达式(竞赛篇)
alien爱吃蛋挞
Javajava
为了更深入了解正则表达式,我们需要首先学习与正则表达式有关的类以及方法。如Pattern和Matcher类,以及部分字符串方法。我们这里先将简单的字符串方法(String类)进行讲解在Java中,String类提供了许多用于字符串操作的方法,其中matches()、split()和replaceAll()等方法是非常有用的几个。这些方法在进行字符串匹配、分割和替换操作时非常高效。同时,Java也提
2025年DeepSeek大火之下的程序员突围指南:跳槽速成与35岁职业破局实战策略!职业规划真的太重要了!
马士兵教育
跳槽开发语言java后端职场和发展考研deepseek
2025年DeepSeek大火之下的程序员突围指南:跳槽速成与35岁职业破局实战策略!职业规划真的太重要了!【马士兵】_哔哩哔哩_bilibili2.大四考研失败,如何突击就业?_哔哩哔哩_bilibili3.35岁真的职业生涯截止了吗?_哔哩哔哩_bilibili4.22岁大二学生,211学历,想进大厂实习,选Java还是C++?_哔哩哔哩_bilibili5.北京,27岁,5年经验,C+cob
LeetCode热题100(Hot100) 每日题目记录)_JavaScript实现_2022-4-24 周末总结
Papper_Shark
力扣热题100javascriptleetcode
2022-4-24周末总结方法:模拟LeetCode思路出现1的时候就记录1的索引,然后和之前出现1的索引位置进行比较,遍历完的最大值就是要找的值。代码实现/***@param{number}n*@return{number}*/constbinaryGap=function(n){lettemp=n.toString(2)letres=0for(leti=0,preIndex=0;in则说明末尾
Java面试经验个人总结(十五)——Tomcat
爱喝牛奶的小喵
Java面试经验Tomcat
Tomcat一、使用tomcat的原因1.用来管理servlet的生命周期;2.处理客户端请求的网络连接,并发负载分派到不同的服务器这些网络服务器的基本功能也是这些像Tomcat一样的服务器需要处理的。二、Tomcat的请求流程(客户的请求为:http://localhost:8080/test/index.jsp)1.请求被发送到本机端口8080,被在那里侦听的CoyoteHTTP/1.1Con
Java面试——SpringBoot
梅西库里RNG
面试javaspringboot面试
0、SpringBoot启动顺序先创建Spring容器,再启动web容器,再实例化dispatchServlet;如何启动web容器;先从spring容器中取出所有web容器类型,再通过配置的web容器名称与取出的类型匹配,匹配到1个就正常启动该web容器,没匹配的、或者匹配到多个就报错。1、Springboot的理解/Springboot的功能/Springboot的优缺点springboot是
【LeetCode Hot100 子串】和为 k 的子数组、滑动窗口最大值、最小覆盖子串
落啦啦
数据结构与算法leetcode算法数据结构
子串1.和为k的子数组题目描述解题思路主要思路步骤时间复杂度与空间复杂度代码实现2.滑动窗口最大值题目描述解题思路双端队列的原理:优化步骤:Java实现3.最小覆盖子串题目描述解题思路滑动窗口的基本思路:具体步骤:算法的关键点:Java实现1.和为k的子数组题目描述给定一个整数数组nums和一个整数k,你需要在数组中找到连续子数组的个数,使得这些子数组的和等于k。解题思路我们可以通过前缀和的方法来
Tomcat服务器:Java Web应用的强大后盾
互联网动态分析
tomcat
在当今的Web开发领域,ApacheTomcat作为开源的Servlet容器和JavaServerPages(JSP)引擎,扮演着举足轻重的角色。它不仅为JavaWeb应用提供了一个稳定、高效的运行环境,还以其灵活的配置和丰富的功能赢得了广大开发者的青睐。本文将深入探讨Tomcat的基本概念、架构特点、配置与优化,以及在实际应用中的常见问题与解决方案。一、Tomcat概述Tomcat是由Apach
Tomcat性能优化与负载均衡实现
互联网动态分析
tomcat
在现代互联网应用中,ApacheTomcat作为一个广泛使用的JavaWeb应用服务器,扮演着至关重要的角色。随着用户数量的不断增加和业务的不断扩展,如何提升Tomcat的性能和实现高可用性成为了开发者们关注的焦点。本文将介绍Tomcat的性能优化技巧以及如何通过负载均衡技术来提升系统的整体性能和可用性。一、Tomcat性能优化Tomcat自身配置管理页面配置:通过配置tomcat-users.x
实现多线程对同一个变量线程共享
贺公子之数据科学与艺术
JavaWebjava开发语言
在Java中,可以使用synchronized关键字或ReentrantLock类来解决多线程访问同一个变量时可能出现的数据不一致问题。以下是使用synchronized关键字的示例代码:publicclassThreadExample{privatestaticintcount=0;publicstaticvoidmain(String[]args){Runnabletask=()->{for(
Android技术栈(四)Android-Jetpack-MVVM-完全实践
2401_85112677
作者\/androidandroidjetpack
本文包含Android中MVVM体系中的很多部分,主要对ViewModel+DataBinding+RxJava+LiveData+Lifecycle等笔者所使用的技术体系进行解析.本文字数较多,内容较为完整并且后续还会追加更新,阅读本篇文章需要较长时间,建议读者分段阅读.所有文字均为个人学习总结和理解,仅供参考,如有纰漏还请指出,笔者不胜感激.1.1配置环境笔者的AndroidStudio版本=
前端性能优化全面指南:从基础到进阶
尤山海
前端性能优化
前端性能优化全面指南:从基础到进阶欢迎来到前端性能优化的全面指南!本文将带你深入了解从基础到进阶的各种优化策略,帮助你全面提升网页的加载速度和用户体验。1.关键渲染路径(CriticalRenderingPath)优化最小化关键资源:确保页面加载的初始请求尽可能少,合并CSS和JavaScript文件,使用内联CSS和JavaScript(对于非常小的脚本和样式)。异步/延迟加载非关键资源:使用a
蓝桥杯——Python初级入门
YAmlei
蓝桥杯——Python蓝桥杯python
蓝桥杯中的Python是近段时间才开设的一项比赛,网上大部门只有关于Java和C语言的题解,写这篇博客算是自己的对参与蓝桥杯Python组学习的记录和找到自己不足的方面。目录一、运算符练习二、分支练习一、运算符练习题目1003:[编程入门]密码破译要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"Ch
【无标题】
Fansv587
数据结构
牛客刷题记录错题Java只能输入零和非零开头的数字,正确的正则表达式是:^(0|[1-9][0-9]*)$在一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行(9)次比较:Whichstatementdeclaresavariableawhichissuitableforreferringtoanarrayof50stringobjects?在java中,声明一个数
pg建表和建索引
cyw8998
python开发语言
java代码:packagecom.geo.mine.util;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;publicclassCreateTableAndOther{//PostgreSQL数据库的JDBCURLString
如何使用Jsoup获取动态加载的内容
小爬虫程序猿
java爬虫开发语言
Jsoup是一个强大的Java库,用于解析HTML文档。然而,它主要用于解析静态HTML内容。对于动态加载的内容(如通过JavaScript生成的内容),Jsoup本身无法直接处理。不过,可以通过以下几种方法来解决这个问题:一、分析网络请求对于动态加载的内容,通常可以通过浏览器的开发者工具(如ChromeDevTools)来分析网络请求。找到加载动态内容的API接口后,可以直接使用Jsoup或Ht
Junit4使用详解(一)
weixin_34194702
测试java
我们写单元测试,一般都会用到一个或多个单元测试框架,在这里,我们介绍一下JUnit4这个测试框架。这是Java界用的最广泛,也是最基础的一个框架,其他的很多框架,包括我们后面会看到的Robolectric,都是基于或兼容JUnit4的。然而首先要解决的问题是。。。为什么要使用单元测试框架呢或者换句话说,单元测试框架能够为我们做什么呢?从最基本的开始说起,假如我们有这样一个类:publicclass
项目中 枚举与注解的结合使用
飞翔的马甲
javaenumannotation
前言:版本兼容,一直是迭代开发头疼的事,最近新版本加上了支持新题型,如果新创建一份问卷包含了新题型,那旧版本客户端就不支持,如果新创建的问卷不包含新题型,那么新旧客户端都支持。这里面我们通过给问卷类型枚举增加自定义注解的方式完成。顺便巩固下枚举与注解。
一、枚举
1.在创建枚举类的时候,该类已继承java.lang.Enum类,所以自定义枚举类无法继承别的类,但可以实现接口。
【Scala十七】Scala核心十一:下划线_的用法
bit1129
scala
下划线_在Scala中广泛应用,_的基本含义是作为占位符使用。_在使用时是出问题非常多的地方,本文将不断完善_的使用场景以及所表达的含义
1. 在高阶函数中使用
scala> val list = List(-3,8,7,9)
list: List[Int] = List(-3, 8, 7, 9)
scala> list.filter(_ > 7)
r
web缓存基础:术语、http报头和缓存策略
dalan_123
Web
对于很多人来说,去访问某一个站点,若是该站点能够提供智能化的内容缓存来提高用户体验,那么最终该站点的访问者将络绎不绝。缓存或者对之前的请求临时存储,是http协议实现中最核心的内容分发策略之一。分发路径中的组件均可以缓存内容来加速后续的请求,这是受控于对该内容所声明的缓存策略。接下来将讨web内容缓存策略的基本概念,具体包括如如何选择缓存策略以保证互联网范围内的缓存能够正确处理的您的内容,并谈论下
crontab 问题
周凡杨
linuxcrontabunix
一: 0481-079 Reached a symbol that is not expected.
背景:
*/5 * * * * /usr/IBMIHS/rsync.sh
让tomcat支持2级域名共享session
g21121
session
tomcat默认情况下是不支持2级域名共享session的,所有有些情况下登陆后从主域名跳转到子域名会发生链接session不相同的情况,但是只需修改几处配置就可以了。
打开tomcat下conf下context.xml文件
找到Context标签,修改为如下内容
如果你的域名是www.test.com
<Context sessionCookiePath="/path&q
web报表工具FineReport常用函数的用法总结(数学和三角函数)
老A不折腾
Webfinereport总结
ABS
ABS(number):返回指定数字的绝对值。绝对值是指没有正负符号的数值。
Number:需要求出绝对值的任意实数。
示例:
ABS(-1.5)等于1.5。
ABS(0)等于0。
ABS(2.5)等于2.5。
ACOS
ACOS(number):返回指定数值的反余弦值。反余弦值为一个角度,返回角度以弧度形式表示。
Number:需要返回角
linux 启动java进程 sh文件
墙头上一根草
linuxshelljar
#!/bin/bash
#初始化服务器的进程PId变量
user_pid=0;
robot_pid=0;
loadlort_pid=0;
gateway_pid=0;
#########
#检查相关服务器是否启动成功
#说明:
#使用JDK自带的JPS命令及grep命令组合,准确查找pid
#jps 加 l 参数,表示显示java的完整包路径
#使用awk,分割出pid
我的spring学习笔记5-如何使用ApplicationContext替换BeanFactory
aijuans
Spring 3 系列
如何使用ApplicationContext替换BeanFactory?
package onlyfun.caterpillar.device;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import
Linux 内存使用方法详细解析
annan211
linux内存Linux内存解析
来源 http://blog.jobbole.com/45748/
我是一名程序员,那么我在这里以一个程序员的角度来讲解Linux内存的使用。
一提到内存管理,我们头脑中闪出的两个概念,就是虚拟内存,与物理内存。这两个概念主要来自于linux内核的支持。
Linux在内存管理上份为两级,一级是线性区,类似于00c73000-00c88000,对应于虚拟内存,它实际上不占用
数据库的单表查询常用命令及使用方法(-)
百合不是茶
oracle函数单表查询
创建数据库;
--建表
create table bloguser(username varchar2(20),userage number(10),usersex char(2));
创建bloguser表,里面有三个字段
&nbs
多线程基础知识
bijian1013
java多线程threadjava多线程
一.进程和线程
进程就是一个在内存中独立运行的程序,有自己的地址空间。如正在运行的写字板程序就是一个进程。
“多任务”:指操作系统能同时运行多个进程(程序)。如WINDOWS系统可以同时运行写字板程序、画图程序、WORD、Eclipse等。
线程:是进程内部单一的一个顺序控制流。
线程和进程
a. 每个进程都有独立的
fastjson简单使用实例
bijian1013
fastjson
一.简介
阿里巴巴fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库;包括“序列化”和“反序列化”两部分,它具备如下特征:
【RPC框架Burlap】Spring集成Burlap
bit1129
spring
Burlap和Hessian同属于codehaus的RPC调用框架,但是Burlap已经几年不更新,所以Spring在4.0里已经将Burlap的支持置为Deprecated,所以在选择RPC框架时,不应该考虑Burlap了。
这篇文章还是记录下Burlap的用法吧,主要是复制粘贴了Hessian与Spring集成一文,【RPC框架Hessian四】Hessian与Spring集成
【Mahout一】基于Mahout 命令参数含义
bit1129
Mahout
1. mahout seqdirectory
$ mahout seqdirectory
--input (-i) input Path to job input directory(原始文本文件).
--output (-o) output The directory pathna
linux使用flock文件锁解决脚本重复执行问题
ronin47
linux lock 重复执行
linux的crontab命令,可以定时执行操作,最小周期是每分钟执行一次。关于crontab实现每秒执行可参考我之前的文章《linux crontab 实现每秒执行》现在有个问题,如果设定了任务每分钟执行一次,但有可能一分钟内任务并没有执行完成,这时系统会再执行任务。导致两个相同的任务在执行。
例如:
<?
//
test
.php
java-74-数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字
bylijinnan
java
public class OcuppyMoreThanHalf {
/**
* Q74 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字
* two solutions:
* 1.O(n)
* see <beauty of coding>--每次删除两个不同的数字,不改变数组的特性
* 2.O(nlogn)
* 排序。中间
linux 系统相关命令
candiio
linux
系统参数
cat /proc/cpuinfo cpu相关参数
cat /proc/meminfo 内存相关参数
cat /proc/loadavg 负载情况
性能参数
1)top
M:按内存使用排序
P:按CPU占用排序
1:显示各CPU的使用情况
k:kill进程
o:更多排序规则
回车:刷新数据
2)ulimit
ulimit -a:显示本用户的系统限制参
[经营与资产]保持独立性和稳定性对于软件开发的重要意义
comsci
软件开发
一个软件的架构从诞生到成熟,中间要经过很多次的修正和改造
如果在这个过程中,外界的其它行业的资本不断的介入这种软件架构的升级过程中
那么软件开发者原有的设计思想和开发路线
在CentOS5.5上编译OpenJDK6
Cwind
linuxOpenJDK
几番周折终于在自己的CentOS5.5上编译成功了OpenJDK6,将编译过程和遇到的问题作一简要记录,备查。
0. OpenJDK介绍
OpenJDK是Sun(现Oracle)公司发布的基于GPL许可的Java平台的实现。其优点:
1、它的核心代码与同时期Sun(-> Oracle)的产品版基本上是一样的,血统纯正,不用担心性能问题,也基本上没什么兼容性问题;(代码上最主要的差异是
java乱码问题
dashuaifu
java乱码问题js中文乱码
swfupload上传文件参数值为中文传递到后台接收中文乱码 在js中用setPostParams({"tag" : encodeURI( document.getElementByIdx_x("filetag").value,"utf-8")});
然后在servlet中String t
cygwin很多命令显示command not found的解决办法
dcj3sjt126com
cygwin
cygwin很多命令显示command not found的解决办法
修改cygwin.BAT文件如下
@echo off
D:
set CYGWIN=tty notitle glob
set PATH=%PATH%;d:\cygwin\bin;d:\cygwin\sbin;d:\cygwin\usr\bin;d:\cygwin\usr\sbin;d:\cygwin\us
[介绍]从 Yii 1.1 升级
dcj3sjt126com
PHPyii2
2.0 版框架是完全重写的,在 1.1 和 2.0 两个版本之间存在相当多差异。因此从 1.1 版升级并不像小版本间的跨越那么简单,通过本指南你将会了解两个版本间主要的不同之处。
如果你之前没有用过 Yii 1.1,可以跳过本章,直接从"入门篇"开始读起。
请注意,Yii 2.0 引入了很多本章并没有涉及到的新功能。强烈建议你通读整部权威指南来了解所有新特性。这样有可能会发
Linux SSH免登录配置总结
eksliang
ssh-keygenLinux SSH免登录认证Linux SSH互信
转载请出自出处:http://eksliang.iteye.com/blog/2187265 一、原理
我们使用ssh-keygen在ServerA上生成私钥跟公钥,将生成的公钥拷贝到远程机器ServerB上后,就可以使用ssh命令无需密码登录到另外一台机器ServerB上。
生成公钥与私钥有两种加密方式,第一种是
手势滑动销毁Activity
gundumw100
android
老是效仿ios,做android的真悲催!
有需求:需要手势滑动销毁一个Activity
怎么办尼?自己写?
不用~,网上先问一下百度。
结果:
http://blog.csdn.net/xiaanming/article/details/20934541
首先将你需要的Activity继承SwipeBackActivity,它会在你的布局根目录新增一层SwipeBackLay
JavaScript变换表格边框颜色
ini
JavaScripthtmlWebhtml5css
效果查看:http://hovertree.com/texiao/js/2.htm代码如下,保存到HTML文件也可以查看效果:
<html>
<head>
<meta charset="utf-8">
<title>表格边框变换颜色代码-何问起</title>
</head>
<body&
Kafka Rest : Confluent
kane_xie
kafkaRESTconfluent
最近拿到一个kafka rest的需求,但kafka暂时还没有提供rest api(应该是有在开发中,毕竟rest这么火),上网搜了一下,找到一个Confluent Platform,本文简单介绍一下安装。
这里插一句,给大家推荐一个九尾搜索,原名叫谷粉SOSO,不想fanqiang谷歌的可以用这个。以前在外企用谷歌用习惯了,出来之后用度娘搜技术问题,那匹配度简直感人。
环境声明:Ubu
Calender不是单例
men4661273
单例Calender
在我们使用Calender的时候,使用过Calendar.getInstance()来获取一个日期类的对象,这种方式跟单例的获取方式一样,那么它到底是不是单例呢,如果是单例的话,一个对象修改内容之后,另外一个线程中的数据不久乱套了吗?从试验以及源码中可以得出,Calendar不是单例。
测试:
Calendar c1 =
线程内存和主内存之间联系
qifeifei
java thread
1, java多线程共享主内存中变量的时候,一共会经过几个阶段,
lock:将主内存中的变量锁定,为一个线程所独占。
unclock:将lock加的锁定解除,此时其它的线程可以有机会访问此变量。
read:将主内存中的变量值读到工作内存当中。
load:将read读取的值保存到工作内存中的变量副本中。
schedule和scheduleAtFixedRate
tangqi609567707
javatimerschedule
原文地址:http://blog.csdn.net/weidan1121/article/details/527307
import java.util.Timer;import java.util.TimerTask;import java.util.Date;
/** * @author vincent */public class TimerTest {
erlang 部署
wudixiaotie
erlang
1.如果在启动节点的时候报这个错 :
{"init terminating in do_boot",{'cannot load',elf_format,get_files}}
则需要在reltool.config中加入
{app, hipe, [{incl_cond, exclude}]},
2.当generate时,遇到:
ERROR
按字母分类:
ABCDEFGHIJKLMNOPQRSTUVWXYZ其他
首页 -
关于我们 -
站内搜索 -
Sitemap -
侵权投诉
版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.