介绍
dbVisitor(原HasorDB) 是一个全功能数据库访问工具,提供对象映射、丰富的类型处理、动态SQL、存储过程、 内置分页方言20+、 支持嵌套事务、多数据源、条件构造器、INSERT 策略、多语句/多结果。并兼容 Spring 及 MyBatis 用法。 它不依赖任何其它框架,因此可以很方便的和任意一个框架整合在一起使用。
功能特性
熟悉的方式
JdbcTemplate 接口方式(高度兼容 Spring JDBC)
Mapper 文件方式(高度兼容 MyBatis)
LambdaTemplate (高度接近 MyBatis Plus、jOOQ 和 BeetlSQL)
@Insert、@Update、@Delete、@Query、@Callable 注解(类似 JPA)
事务支持
支持 5 个事务隔离级别、7 个事务传播行为(与 Spring tx 相同)
提供 TransactionTemplate、TransactionManager 接口方式声明式事务控制能力(用法与 Spring 相同)
特色优势
支持 分页查询 并且提供多种数据库方言(20+)
支持 INSERT 策略(INTO、UPDATE、IGNORE)
更加丰富的 TypeHandler(MyBatis 40+,HasorDB 60+)
Mapper XML 支持多语句、多结果
提供独特的规则机制,让动态 SQL 更加简单
支持 存储过程
支持 JDBC 4.2 和 Java8 中时间类型
支持多数据源
引入依赖
截止到目前为止 dbVisitor 的最新版本为:4.3.0
在 https://mvnrepository.com/artifact/net.hasor/hasor-db 上也可以查询到最新版本
net.hasor
hasor-db
4.3.0
然后再引入数据库驱动以 MySQL,Maven 方式为例:
mysql
mysql-connector-java
8.0.22
使用 HasorDB 可以不依赖数据库连接池,但有数据库连接池是大多数项目的标配。这里选用 Alibaba 的 Druid
com.alibaba
druid
1.1.23
最后准备一个数据库表,并初始化一些数据(CreateDB.sql
文件)
drop table if exists `test_user`;
create table `test_user` (
`id` int(11) auto_increment,
`name` varchar(255),
`age` int,
`create_time` datetime,
primary key (`id`)
);
insert into `test_user` values (1, 'mali', 26, now());
insert into `test_user` values (2, 'dative', 32, now());
insert into `test_user` values (3, 'jon wes', 41, now());
insert into `test_user` values (4, 'mary', 66, now());
insert into `test_user` values (5, 'matt', 25, now());
执行 SQL
使用 SQL 的方式读取数据,PrintUtils
和 DsUtils
两个工具类可以在例子工程中找到
// 创建数据源
DataSource dataSource = DsUtils.dsMySql();
// 创建 JdbcTemplate 对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// 加载测试数据脚本
jdbcTemplate.loadSQL("CreateDB.sql");
// 查询数据并 Map 形式返回
List> mapList = jdbcTemplate.queryForList("select * from test_user");
// 打印测试数据
PrintUtils.printMapList(mapList);
控制台可以得到如下结果
/--------------------------------------------\
| id | name | age | create_time |
|--------------------------------------------|
| 1 | mali | 26 | 2021-11-12 19:14:06.0 |
| 2 | dative | 32 | 2021-11-12 19:14:06.0 |
| 3 | jon wes | 41 | 2021-11-12 19:14:06.0 |
| 4 | mary | 66 | 2021-11-12 19:14:06.0 |
| 5 | matt | 25 | 2021-11-12 19:14:06.0 |
\--------------------------------------------/
如果想使用 DTO 对象接收数据,则需要创建一个 DTO 对象。
// 如果属性名和列名可以完全匹配,那么无需任何注解。
// - 本列中由于 `test_user` 的表名和列名符合驼峰转下划线,那么可以简单的通过 @Table 注解声明一下。
// - 如果需要映射表名和列名请参照注解 @Table、@Column 更多的属性
@Table(mapUnderscoreToCamelCase = true)
public class TestUser {
private Integer id;
private String name;
private Integer age;
private Date createTime;
// getters and setters omitted
}
// 然后通过 `queryForList` 方法直接查询,控制台就可以得到相同的结果
String sqlString = "select * from test_user";
List dtoList = jdbcTemplate.queryForList(sqlString, TestUser.class);
PrintUtils.printObjectList(dtoList);
单表 CRUD
对于单表 CRUD 操作可以使用 JdbcTemplate
的子类 LambdaTemplate
// 创建数据源
DataSource dataSource = DsUtils.dsMySql();
// 创建 LambdaTemplate 对象和创建 JdbcTemplate 一样
LambdaTemplate lambdaTemplate = new LambdaTemplate(dataSource);
// 初始化一些数据
lambdaTemplate.loadSQL("CreateDB.sql");
// 查询,所有数据
List dtoList = lambdaTemplate.lambdaQuery(TestUser.class)
.queryForList();
PrintUtils.printObjectList(dtoList);
// 插入新数据
TestUser newUser = new TestUser();
newUser.setName("new User");
newUser.setAge(33);
newUser.setCreateTime(new Date());
int result = lambdaTemplate.lambdaInsert(TestUser.class)
.applyEntity(newUser)
.executeSumResult();
// 更新,将name 从 mali 更新为 mala
TestUser sample = new TestUser();
sample.setName("mala");
int result = lambdaTemplate.lambdaUpdate(TestUser.class)
.eq(TestUser::getId, 1)
.updateToBySample(sample)
.doUpdate();
// 删除,ID 为 2 的数据
int result = lambdaTemplate.lambdaUpdate(TestUser.class)
.eq(TestUser::getId, 1)
.updateToBySample(sample)
.doUpdate();
使用 DAO
使用 DAO 可以继承 BaseMapper
通用 DAO 接口来完成一些基本操作,仍然以单表 CRUD 为例。
// DAO 的一些接口需要识别 ID 属性,因此有必要在 DTO 对象上通过 @Column 注解标记出它们
@Table(mapUnderscoreToCamelCase = true)
public class TestUser {
@Column(primary = true)
private Integer id;
private String name;
private Integer age;
private Date createTime;
// getters and setters omitted
}
// 创建数据源
DataSource dataSource = DsUtils.dsMySql();
// 创建通用 DAO
DalSession session = new DalSession(dataSource);
BaseMapper baseMapper = session.createBaseMapper(TestUser.class);
// 初始化一些数据
baseMapper.template().loadSQL("CreateDB.sql");
// 查询数据
List dtoList = baseMapper.query().queryForList();
PrintUtils.printObjectList(dtoList);
// 插入新数据
TestUser newUser = new TestUser();
newUser.setName("new User");
newUser.setAge(33);
newUser.setCreateTime(new Date());
int result = baseMapper.insert(newUser);
// 更新,将name 从 mali 更新为 mala
TestUser sample = baseMapper.queryById(1);
sample.setName("mala");
int result = baseMapper.updateById(sample);
// 删除,ID 为 2 的数据
int result = baseMapper.deleteById(2);
作为 DAO 可以定义自己的方法,并通过注解配置具体执行的 SQL 语句。
// BaseMapper 是可选的,继承它相当于多了一组单表 CURD 的扩展功能。
@SimpleMapper
public interface TestUserDAO extends BaseMapper {
@Insert("insert into `test_user` (name,age,create_time) values (#{name}, #{age}, now())")
public int insertUser(@Param("name") String name,
@Param("age") int age);
@Update("update `test_user` set age = #{age} where id = #{id}")
public int updateAge(@Param("id") int userId,
@Param("age") int newAge);
@Delete("delete from `test_user` where age > #{age}")
public int deleteByAge(@Param("age") int age);
@Query(value = "select * from `test_user` where #{beginAge} < age and age < #{endAge}",
resultType = TestUser.class)
public List queryByAge(@Param("beginAge") int beginAge,
@Param("endAge") int endAge);
}
// 创建 DalRegistry 并注册 TestUserDAO
DalRegistry dalRegistry = new DalRegistry();
dalRegistry.loadMapper(TestUserDAO.class);
// 使用 DalRegistry 创建 Session
DalSession session = new DalSession(dataSource, dalRegistry);
// 创建 DAO 接口
TestUserDAO userDAO = session.createMapper(TestUserDAO.class);
使用 Mapper
统一管理 SQL 的最佳场所仍然是 Mapper 文件,而且 HasorDB 的 Mapper 文件高度兼容 MyBatis 学习成本极低。
// 利用 @RefMapper 注解将 Mapper 文件和 接口类联系起来(继承 BaseMapper 是可选的)
@RefMapper("/mapper/quick_dao3/TestUserMapper.xml")
public interface TestUserDAO extends BaseMapper {
public int insertUser(@Param("name") String name,
@Param("age") int age);
public int updateAge(@Param("id") int userId,
@Param("age") int newAge);
public int deleteByAge(@Param("age") int age);
public List queryByAge(@Param("beginAge") int beginAge,
@Param("endAge") int endAge);
}
为了更好了解和使用 HasorDB 的 Mapper 文件建议增加 DTD加以验证。另外 HasorDB 兼容 MyBatis3 的 DTD 对于绝大部分 MyBatis 工程都可以正常兼容。
name,age,create_time
insert into `test_user` (
) values (
#{name}, #{age}, now()
)
update `test_user` set age = #{age} where id = #{id}
#{age}
]]>
select id,
from `test_user`
where #{beginAge} < age and age < #{endAge}
:::caution 由于 Mapper 文件无法感知 BaseMapper 接口的范型,如果需要 Mapper 文件混合 BaseMapper 一起使用。 则建议 @Table
、@Column
注解配置也加上。这部分内容请参考文档中的 对象映射 :::
快速条件拼接
快速条件拼接包含 快速'与'条件
和 快速'或'条件
它们是两个规则用于取代简单的 if
标签和简单的 foreach
标签。 如下语句,当参数不为空时候才拼接 sql
select * from `test_user`
where 1 = 1
and age = #{age}
可以简化为快速规则写法,其中 :age
为属性名。
select * from `test_user`
@{and, age = :age}
例如如下 foreach
操作:
select * from `test_user`
where
id in
#{item}
可以简化为快速规则写法,其中 :list
为集合属性名。
select * from `test_user`
@{and, id in (:list)}
分页查询
HasorDB 的分页能力仅在 LambdaTemplate
、BaseMapper
、Mapper DAO
三个层面上受到支持。下面为不同的使用方式:
使用 LambdaTemplate
进行分页查询
// 构造 LambdaTemplate 和初始化一些数据
DataSource dataSource = DsUtils.dsMySql();
LambdaTemplate lambdaTemplate = new LambdaTemplate(dataSource);
lambdaTemplate.loadSQL("CreateDB.sql");
// 构建分页对象,每页 3 条数据(默认第一页的页码为 0)
Page pageInfo = new PageObject();
pageInfo.setPageSize(3);
// 分页查询数据
List pageData1 = lambdaTemplate.lambdaQuery(TestUser.class)
.usePage(pageInfo)
.queryForList();
// 分页查询下一页数据
pageInfo.nextPage();
List pageData2 = lambdaTemplate.lambdaQuery(TestUser.class)
.usePage(pageInfo)
.queryForList();
用接口 BaseMapper
进行分页查询
// 构造 BaseMapper 和初始化一些数据
DataSource dataSource = DsUtils.dsMySql();
DalSession session = new DalSession(dataSource);
BaseMapper baseMapper = session.createBaseMapper(TestUser.class);
baseMapper.template().loadSQL("CreateDB.sql");
// 构建分页对象,每页 3 条数据(默认第一页的页码为 0)
Page pageInfo = new PageObject();
pageInfo.setPageSize(3);
// 分页查询数据
PageResult pageData1 = baseMapper.pageBySample(null, pageInfo);
// 分页查询下一页数据
pageInfo.nextPage();
PageResult pageData2 = baseMapper.pageBySample(null, pageInfo);
若想分页查询 Mapper 文件中的查询,仅需在对应 DAO 接口方法中增加一个 Page 参数即可。
@RefMapper("/mapper/quick_page3/TestUserMapper.xml")
public interface TestUserDAO extends BaseMapper {
// 可以直接返回分页之后的数据结果
public List queryByAge(@Param("beginAge") int beginAge,
@Param("endAge") int endAge,
Page pageInfo);
// 也可以返回包含分页信息的分页结果
public List queryByAge(@Param("beginAge") int beginAge,
@Param("endAge") int endAge,
Page pageInfo);
}
// 构建分页条件
Page pageInfo = new PageObject();
pageInfo.setPageSize(3);
// 分页方式查询 mapper 中的查询
List data1 = userDAO.queryByAge(25, 100, pageInfo);
PageResult page1 = userDAO.queryByAge2(25, 100, pageInfo);
// 分页方式查询 mapper 中的查询
pageInfo.nextPage();
List data2 = userDAO.queryByAge(25, 100, pageInfo);
PageResult page2 = userDAO.queryByAge2(25, 100, pageInfo);
使用事务
HasorDB 提供了三种方式使用事务,分别为:
声明式事务 ,通过调用 TransactionManager
接口来实现事务控制。
模版事务 ,通过 TransactionTemplate
接口来实现事务控制。
注解事务 ,基于 @Transaction
的注解事务控制(开发中...)
声明式事务
启动和递交一个事务,例如:
DataSource dataSource = DsUtils.dsMySql();
TransactionManager manager = DataSourceManager.getManager(dataSource);
TransactionStatus tranA = manager.begin();
...
manager.commit(tranA);
或者使用快捷方式
DataSource dataSource = DsUtils.dsMySql();
TransactionManager manager = DataSourceManager.getManager(dataSource);
manager.begin(); // 开启一个事务
...
manager.commit(); //递交最近的一个事务
启动和递交多个事务,例如:
DataSource dataSource = DsUtils.dsMySql();
TransactionManager manager = DataSourceManager.getManager(dataSource);
TransactionStatus tranA = manager.begin();
TransactionStatus tranB = manager.begin();
TransactionStatus tranC = manager.begin();
...
manager.commit(tranC);
manager.commit(tranB);
manager.commit(tranA);
通过 begin
方法的参数可以设置事务的 传播属性 和 隔离级别
TransactionStatus tranA = manager.begin(
Propagation.REQUIRES_NEW, // 传播属性
Isolation.READ_COMMITTED // 隔离级别
);
模版事务
通常使用事务都会遵循下列逻辑:
try {
manager.begin(behavior, level);
...
manager.commit();
} catch (Throwable e) {
manager.rollBack();
throw e;
}
而模版事务会遵循这个常规逻辑使其变为一个更加通用 API 调用方式,下面这段代码就是模版事务类的实现逻辑:
public T execute(TransactionCallback callBack,
Propagation behavior, Isolation level) throws Throwable {
TransactionStatus tranStatus = null;
try {
tranStatus = this.transactionManager.begin(behavior, level);
return callBack.doTransaction(tranStatus);
} catch (Throwable e) {
if (tranStatus != null) {
tranStatus.setRollback();
}
throw e;
} finally {
if (tranStatus != null && !tranStatus.isCompleted()) {
this.transactionManager.commit(tranStatus);
}
}
}
使用模版事务的方式为:
Object result = template.execute(new TransactionCallback() {
@Override
public Object doTransaction(TransactionStatus tranStatus) {
...
return null;
}
});
// 使用 Java8 Lambda 语法可以简化为下面这种
Object result = template.execute(tranStatus -> {
return ...;
});
在事务模版中抛出异常会导致事务回滚,同时异常会继续上抛:
try {
Object result = template.execute(new TransactionCallback() {
public Object doTransaction(TransactionStatus tranStatus) {
throw new Exception("...");
}
});
} catch (Throwable e) {
... run here
}
也可以设置事务状态为 rollBack
或 readOnly
也会导致回滚
Object result = template.execute(new TransactionCallback() {
public Object doTransaction(TransactionStatus tranStatus) {
tranStatus.setReadOnly();
// 或
tranStatus.setRollback();
return ...;
}
});
没有返回值的模版事务,需要用到 TransactionCallbackWithoutResult
接口。具体用法如下:
template.execute((TransactionCallbackWithoutResult) tranStatus -> {
...
});
联系方式
官方首页是:https://www.dbvisitor.net/ 如果你想进一步探讨,可以在它的官方网站上找到更多联系方式。
原文
你可能感兴趣的:(Java,Hasor,java,spring,orm,mybatis,sql)
Oracle数据库从入门到精通系列之二十五:ERROR: ORA-12541: TNS:no listener错误详细的解决方法
快乐骑行^_^
数据库 Oracle数据库 ERROR ORA-12541 TNS no listener
Oracle数据库从入门到精通系列之二十五:ERROR:ORA-12541:TNS:nolistener错误详细的解决方法一、登陆Oracle数据库报错ORA-12541:TNS:nolistener二、检查Oracle数据库监听器的状态三、启动监听四、切换用户五、启动监听六、连接数据库一、登陆Oracle数据库报错ORA-12541:TNS:nolistenersqlplusc##dbzuser
简化API 工作流程:Apipost整合了 Postman、Swagger 和 JMeter
绿色果酱
postman jmeter 测试工具
作为一名Java开发者,始终追求开发过程的高效性。使用IntelliJIDEA编写代码只是开始。一般来说,代码完成后,我们会切换到Postman进行API调试。在确保API表现符合预期后,我们会使用Swagger为前端团队生成文档。最后,再使用JMeter进行性能和负载测试,以确保API工作流顺畅且自动化。Apipost=Postman+Swagger+JMeter然而,这种多工具的方法存在诸多挑
Java8使用stream实现list中对象属性的合并(去重并求和)
yellowatumn
JAVA linq java c#
前言需要对一个List中的对象进行唯一值属性去重,属性求和,对象假设为BillsNums,有id、nums、sums三个属性,其中id表示唯一值,需要nums与sums进行求和,并最后保持一份。例如说:(“s1”,1,1),(“s1”,2,3),(“s2”,4,4),求和并去重的话,就是(“s1”,3,4),(“s2”,4,4)对象与属性123456789101112131415161718192
YashanDB事务管理
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E6%A6%82%E5%BF%B5%...事务结构YashanDB事务由一条或多条SQL语句(DML或DDL)以及一条特殊的SETTRANSACTION语句组成。事务可以分为如下两类:一条或多条DML语句的组合,一起构成对数据库的原子修改一条DDL语句以从账户A给账户
Node.js 中 fs 模块文件操作的应用教程
猿小白klp
node node.js 前端 后端 学习 css
Node.js是一个基于ChromeV8引擎的JavaScript运行环境,它可以让JavaScript代码在服务器端运行。在Node.js中,fs模块是用来处理文件系统操作的模块。通过fs模块,我们可以进行文件的读取、写入、删除等操作。本教程将介绍如何在Node.js中运用fs模块进行文件操作。1.安装Node.js首先,确保你的计算机上已经安装了Node.js。你可以从Node.js官网下载安
【面试题】Node.js高频面试题
城仕
node.js 面试题
简述Node.js基础概念?Node.js是一个基于ChromeV8引擎的JavaScript运行环境。它使得JavaScript可以在服务器端运行,从而进行网络编程,如构建Web服务器、处理网络请求等。Node.js采用事件驱动、非阻塞I/O模型,使其轻量且高效,尤其适用于数据密集型实时应用。**主要特点**:1.**异步I/O**:Node.js几乎所有的API都是异步的,如读写文件、网络请求
java-net-php-python-springboot社区志愿者管理系统计算机毕业设计程序
鸿源网络
java php spring boot
java-net-php-python-springboot社区志愿者管理系统计算机毕业设计程序java-net-php-python-springboot社区志愿者管理系统计算机毕业设计程序本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据
mysql多表联查并修改
小布布的不
mysql 多表联查修改
参考此篇文章https://blog.csdn.net/joyous/article/details/53898972
2023版idea ssh 远程linux docker 报错: Only key-pair ssh auth type is supported for docker connections.
小布布的不
idea docker intellij-idea ssh linux docker
2023版ideassh远程linuxdocker报错:Cannotconnect:java.lang.llegalArgumentException:Onlykey-pairsshauthtypeissupportedfordockerconnections.环境:idea2023.3.2centos7安装docker报错截图:正确操作步骤:idea选择连接方式ssh点“+”号依次填入信息,点击
SpringBoot整合easy-es
m0_74824865
面试 学习路线 阿里巴巴 spring boot elasticsearch 后端
一、easy-es简介EasyES是一款基于Elasticsearch官方提供的RestHighLevelClient开发的ORM框架,旨在简化开发流程并提高效率。EasyES在保持RestHighLevelClient原有功能的基础上进行增强,而不做任何改变。它采用与Mybatis-Plus相似的语法,使得开发者可以无缝迁移至EasyES,无需额外学习成本。EasyES的核心理念是将简单、易用性
Canva迁移策略深度解析:应对每日5000万素材增长,从MySQL到DynamoDB的蜕变
微服务技术分享
mysql 数据库
随着数字化设计的蓬勃发展,Canva作为一款备受欢迎的在线设计平台,面临着日益增长的用户生成内容挑战。每天,平台上新增的素材数量高达5000万,这对数据库系统提出了前所未有的要求。为了应对这一挑战,Canva决定对其数据库系统进行一次重大迁移,从传统的MySQL转向高性能、可扩展的AmazonDynamoDBNoSQL数据库服务。MySQL的挑战MySQL作为一款关系型数据库,在许多应用场景中表现
前端面试题】—53道常见NodeJS基础面试题(附答案)
秋の本名
前端 node.js 前端
Node.js是一个不错的选择,它是基于JavaScript语法的一套服务器端(后端)语言。想要在企业中做得更好,开发者需要更多地了解它,并掌握它的有关用法。1、你了解Node.js吗?Node.js是一个基于Chromev8引擎的服务器端JavaScript运行环境;Node.js是一个事件驱动、非阻塞式I/O的模型,轻量而又高效;Node.js的包管理器npm是全球最大的开源库生态系统。2、N
前端大文件上传
爱学习的前端er
前端
1.开场概述“大文件上传是前端开发中常见的需求,但由于文件体积较大,直接上传可能会遇到网络不稳定、服务器限制等问题。因此,通常需要采用分片上传、断点续传、并发控制等技术来优化上传体验”2.核心实现方案“我通常会采用以下方案来实现大文件上传:文件分片:将大文件切割成固定大小的块(例如1MB或5MB),通过Blob.slice()方法实现。分片上传:通过FormData将每个分片上传到服务器,使用ax
Oracle错误:ORA-12541 TNS无监听程序 - MySQL
JfpBlockchain
oracle mysql 数据库
概述:当尝试连接到Oracle数据库时,可能会遇到"ORA-12541TNS无监听程序"错误。这个错误通常表示无法建立与数据库的网络连接,原因是目标数据库实例没有运行监听程序或监听程序无法访问。在本文中,我们将探讨此错误的常见原因,并提供一些解决方法。错误原因:ORA-12541错误通常由以下几个常见原因引起:目标数据库实例未启动监听程序。目标数据库实例的监听程序未正确配置。目标数据库实例的监听程
@RestController和@RequestBody注解含义
编程就是如此
Java注解 java
一、@RestController(一)含义@RestController是SpringFramework中的一个组合注解,主要用于简化创建RESTfulWeb服务的过程。它结合了@Controller和@ResponseBody注解的功能,使得开发者可以更简洁地编写处理HTTP请求的控制器类。(二)用途@Controller:标记一个类为SpringMVC控制器,通常用于处理视图请求。@Resp
SprinBoot整合HTTP API:从零开始的实战指南
C_V_Better
java java spring boot 后端 开发语言 spring http
在现代Web开发中,HTTPAPI是前后端交互的核心。SpringBoot作为Java生态中备受欢迎的框架,提供了简洁而强大的方式来构建和整合HTTPAPI。本文将带你从零开始,通过具体代码示例,展示如何在SpringBoot中整合HTTPAPI,实现高效、稳定的前后端通信。一、为什么选择SpringBoot整合HTTPAPI?SpringBoot提供了开箱即用的特性,简化了传统Spring应用的
Node.js中fs模块的作用和使用方法
星光璀抱
node.js 编程
Node.js是一个基于ChromeV8引擎的JavaScript运行环境,它提供了丰富的内置模块,用于处理文件系统操作。其中,fs模块是Node.js核心模块之一,用于对文件系统进行读取、写入、修改和删除等操作。本文将详细介绍fs模块的使用方法,并提供相应的源代码示例。要使用fs模块,首先需要在Node.js脚本中通过require语句引入该模块:constfs=require('fs');引入
数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)
钊兵
数据库 数据库 oracle mysql 达梦 驱动 postgresql
数据库驱动找起来好麻烦,我整理到了一起,需要的朋友免费下载:驱动下载目前收录了Oracle、Mysql、达梦、Postgresql的数据库驱动的多个版本,后续可能会分享更多。
Node.js高频面试题精选及参考答案
大模型大数据攻城狮
node.js 前端面试 前端面经 跨域 前端背压 vue 混合开发
目录什么是Node.js?它的主要特点有哪些?Node.js的事件驱动和非阻塞I/O模型是如何工作的?为什么Node.js适合处理高并发场景?Node.js与传统后端语言(如Java、Python)相比,有哪些优势和劣势?简述Node.js的运行原理,包括V8引擎的作用。什么是Node.js的REPL环境?它有什么用途?如何在Node.js中使用命令行参数?Node.js有哪些全局对象?它们的作用
FreeSwitch的应用类模块
狂爱代码的码农
VOIP那些事 运维
FreeSWITCH应用类模块(Applications)完整表格模块名称功能描述mod_callcenter提供呼叫中心功能,支持队列、座席管理、监控等。mod_conference提供多方会议功能,支持音频、视频会议。mod_blacklist提供黑名单功能,阻止特定号码的呼叫。mod_db提供数据库操作功能,支持SQLite、PostgreSQL等数据库。mod_curl提供HTTP请求功能
java redis 分页查询_Redis分页查询缓存方案
科瓦利斯的鹿
java redis 分页查询
常规分页查询缓存方案我们都知道,通过缓存查询的结果,可以极大的提升系统的服务能力,以及降低底层服务或者是数据库的压力。对于有分页条件的缓存,我们也可以按照不同的分页条件来缓存多个key,比如分页查询产品列表,page=1&limit=10和page=1&limit=5这两次请求可以这样缓存查询结果productList:page:1:limit:10productList:page:1:limit
Cannot resolve com.suntools1.8解决方法
rkmhr_sef
前端 html 面试 java github maven
解决办法最下面。我是引入阿里的druid启动器,druid-spring-boot-starter-1.2.6.pomcom.alibabadruid-spring-boot-starter1.2.6启动器应用的druid,druid-1.2.6.pomcom.alibabadruid1.2.6重点是里面的profiles,会根据系统选择。这里只选择windows的jconsoletrue-->$
django-vue-lyadmin---学习-菜单结构lyadmin_menu.sql
大胖丫
android javascript 开发语言
SETNAMESutf8mb4;SETFOREIGN_KEY_CHECKS=0;--------------------------------Tablestructureforlyadmin_menu------------------------------DROPTABLEIFEXISTS`lyadmin_menu`;CREATETABLE`lyadmin_menu`(`id`varchar
springboot源码怎么运行二讲解怎么导入运行springboot源码
道阻且长-行则将至-行而不辍-未来可期
手撕SpringMVC源码实现 spring boot java maven
前言结合自己负责的项目进行重构,同时面试他人的前提下,进行学习SPringBoot源码。因为Springboot源码2.3版本之后不在使用pom依赖,所以maven工程导入是打不开的!通过上一篇文章的讲解前提条件准备完成之后,进行这一篇内容,讲解如何运行SPringBoot源码,我这边本地运行的是SPringBoot版本是2.4版本的源码!要满足前提条件:java安装JDK最好jdk8和jdk11
【华为OD技术面试手撕真题】111、拆炸弹 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)(0ms)
KJ.JK
华为OD技术面试手撕真题 华为od 面试 c语言 华为od机试真题 华为od机试E卷 python 拆炸弹
文章目录一、题目题目描述样例1二、代码参考C语言思路C语言代码C++语言思路C++代码Java语言思路Java代码Python语言思路Python代码JS语言思路JS代码作者:KJ.JK个人博客首页:KJ.JK专栏介绍:本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C&C++&Java&Python&JS),思路分析都非常详细,争取实现最低的时间复杂度和高通过率,每
【设计模式】【创建型模式】单例模式(Singleton)
FLZJ_KL
设计模式 设计模式 单例模式 java
hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD2025本人正在沉淀中…博客更新速度++欢迎点赞、收藏、关注,跟上我的更新节奏当你的天空突然下了大雨,那是我在为你炸乌云文章目录一、入门什么是单例模式?为什么要单例模式?如何实现单例模式?懒汉式双重检查(DCL)静态内部类枚举二、单例模式在框架源码中的运用Java标准库RunTime类SpringFramework三
CPU多级缓存结构以及缓存一致性协议MESI
又菜又爱玩٩( ö̆ ) و
并发编程 缓存 硬件架构
CPU多级缓存结构现代CPU分为物理核和逻辑核,比如我们日常办公电脑常见的4核8线程,就是指的4个物理核、8个逻辑核。超线程的技术使得一个物理核可以同时做两件事,也就是执行两个线程,但是能真正执行两个线程的场景很少。Java中API获取的核数,就是指的逻辑核。CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。现代CPU为了提升执行效率,减少CPU与内存
Java零工市场小程序如何实现一站式服务
汇匠源
java 小程序 开发语言
零工市场小程序作为一个为自由职业者服务的平台,Java编程语言是其坚实的后盾,为自由职业者提供了良好的服务,提高了用户体验感和工作效率,实现了一站式服务。首先,用户只需在微信中就可使用,注册完善个人信息、上传简历后即可开始找兼职;通过Java,小程序可实现精准匹配,通过用户上传的简历来匹配适合的兼职,实现了高效率;小程序内置了沟通工具,自由职业者们可与用人单位进行沟通,交流后解决问题;小程序还设置
“【SpringBoot】SpringBoot整合RabbitMQ消息中间件,实现延迟队列和死信队列”文章说了啥?
百态老人
科技 经验分享
在SpringBoot中整合RabbitMQ以实现延迟队列和死信队列的功能,主要涉及以下几个关键步骤:1.引入依赖:首先,在项目的pom.xml文件中添加RabbitMQ的依赖。2.配置RabbitMQ:在application.properties或application.yml文件中配置RabbitMQ的相关参数,包括连接信息、交换机名称、队列名称等。3.创建交换机和队列:通过RabbitMQ
python审计底稿_代码分享:用Python编写的多协议弱密码审计工具集
weixin_39989215
python审计底稿
前几天与大家分享了我自己用C++实现的用于企业内部环境的ssh弱密码审计工具。在实际的工作中,我们还需要对多种常见的协议定期进行弱密码审计。为了灵活地适应企业内部复杂的网络环境,以及领导希望稳定可控的需求,我在Linux环境下基于Python和相关的库实现了telnet、smb、mssql、mysql、ftp等多个协议的弱密码审计工具,并取得了不错的效果,在此也与大家分享相关的代码和经验,希望能够
强大的销售团队背后 竟然是大数据分析的身影
蓝儿唯美
数据分析
Mark Roberge是HubSpot的首席财务官,在招聘销售职位时使用了大量数据分析。但是科技并没有挤走直觉。
大家都知道数理学家实际上已经渗透到了各行各业。这些热衷数据的人们通过处理数据理解商业流程的各个方面,以重组弱点,增强优势。
Mark Roberge是美国HubSpot公司的首席财务官,HubSpot公司在构架集客营销现象方面出过一份力——因此他也是一位数理学家。他使用数据分析
Haproxy+Keepalived高可用双机单活
bylijinnan
负载均衡 keepalived haproxy 高可用
我们的应用MyApp不支持集群,但要求双机单活(两台机器:master和slave):
1.正常情况下,只有master启动MyApp并提供服务
2.当master发生故障时,slave自动启动本机的MyApp,同时虚拟IP漂移至slave,保持对外提供服务的IP和端口不变
F5据说也能满足上面的需求,但F5的通常用法都是双机双活,单活的话还没研究过
服务器资源
10.7
eclipse编辑器中文乱码问题解决
0624chenhong
eclipse乱码
使用Eclipse编辑文件经常出现中文乱码或者文件中有中文不能保存的问题,Eclipse提供了灵活的设置文件编码格式的选项,我们可以通过设置编码 格式解决乱码问题。在Eclipse可以从几个层面设置编码格式:Workspace、Project、Content Type、File
本文以Eclipse 3.3(英文)为例加以说明:
1. 设置Workspace的编码格式:
Windows-&g
基础篇--resources资源
不懂事的小屁孩
android
最近一直在做java开发,偶尔敲点android代码,突然发现有些基础给忘记了,今天用半天时间温顾一下resources的资源。
String.xml 字符串资源 涉及国际化问题
http://www.2cto.com/kf/201302/190394.html
string-array
接上篇补上window平台自动上传证书文件的批处理问卷
酷的飞上天空
window
@echo off
: host=服务器证书域名或ip,需要和部署时服务器的域名或ip一致 ou=公司名称, o=公司名称
set host=localhost
set ou=localhost
set o=localhost
set password=123456
set validity=3650
set salias=s
企业物联网大潮涌动:如何做好准备?
蓝儿唯美
企业
物联网的可能性也许是无限的。要找出架构师可以做好准备的领域然后利用日益连接的世界。
尽管物联网(IoT)还很新,企业架构师现在也应该为一个连接更加紧密的未来做好计划,而不是跟上闸门被打开后的集成挑战。“问题不在于物联网正在进入哪些领域,而是哪些地方物联网没有在企业推进,” Gartner研究总监Mike Walker说。
Gartner预测到2020年物联网设备安装量将达260亿,这些设备在全
spring学习——数据库(mybatis持久化框架配置)
a-john
mybatis
Spring提供了一组数据访问框架,集成了多种数据访问技术。无论是JDBC,iBATIS(mybatis)还是Hibernate,Spring都能够帮助消除持久化代码中单调枯燥的数据访问逻辑。可以依赖Spring来处理底层的数据访问。
mybatis是一种Spring持久化框架,要使用mybatis,就要做好相应的配置:
1,配置数据源。有很多数据源可以选择,如:DBCP,JDBC,aliba
Java静态代理、动态代理实例
aijuans
Java静态代理
采用Java代理模式,代理类通过调用委托类对象的方法,来提供特定的服务。委托类需要实现一个业务接口,代理类返回委托类的实例接口对象。
按照代理类的创建时期,可以分为:静态代理和动态代理。
所谓静态代理: 指程序员创建好代理类,编译时直接生成代理类的字节码文件。
所谓动态代理: 在程序运行时,通过反射机制动态生成代理类。
一、静态代理类实例:
1、Serivce.ja
Struts1与Struts2的12点区别
asia007
Struts1与Struts2
1) 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。即使Action接口不是必须实现的,只有一个包含execute方法的P
初学者要多看看帮助文档 不要用js来写Jquery的代码
百合不是茶
jquery js
解析json数据的时候需要将解析的数据写到文本框中, 出现了用js来写Jquery代码的问题;
1, JQuery的赋值 有问题
代码如下: data.username 表示的是: 网易
$("#use
经理怎么和员工搞好关系和信任
bijian1013
团队 项目管理 管理
产品经理应该有坚实的专业基础,这里的基础包括产品方向和产品策略的把握,包括设计,也包括对技术的理解和见识,对运营和市场的敏感,以及良好的沟通和协作能力。换言之,既然是产品经理,整个产品的方方面面都应该能摸得出门道。这也不懂那也不懂,如何让人信服?如何让自己懂?就是不断学习,不仅仅从书本中,更从平时和各种角色的沟通
如何为rich:tree不同类型节点设置右键菜单
sunjing
contextMenu tree Richfaces
组合使用target和targetSelector就可以啦,如下: <rich:tree id="ruleTree" value="#{treeAction.ruleTree}" var="node" nodeType="#{node.type}"
selectionChangeListener=&qu
【Redis二】Redis2.8.17搭建主从复制环境
bit1129
redis
开始使用Redis2.8.17
Redis第一篇在Redis2.4.5上搭建主从复制环境,对它的主从复制的工作机制,真正的惊呆了。不知道Redis2.8.17的主从复制机制是怎样的,Redis到了2.4.5这个版本,主从复制还做成那样,Impossible is nothing! 本篇把主从复制环境再搭一遍看看效果,这次在Unbuntu上用官方支持的版本。 Ubuntu上安装Red
JSONObject转换JSON--将Date转换为指定格式
白糖_
JSONObject
项目中,经常会用JSONObject插件将JavaBean或List<JavaBean>转换为JSON格式的字符串,而JavaBean的属性有时候会有java.util.Date这个类型的时间对象,这时JSONObject默认会将Date属性转换成这样的格式:
{"nanos":0,"time":-27076233600000,
JavaScript语言精粹读书笔记
braveCS
JavaScript
【经典用法】:
//①定义新方法
Function .prototype.method=function(name, func){
this.prototype[name]=func;
return this;
}
//②给Object增加一个create方法,这个方法创建一个使用原对
编程之美-找符合条件的整数 用字符串来表示大整数避免溢出
bylijinnan
编程之美
import java.util.LinkedList;
public class FindInteger {
/**
* 编程之美 找符合条件的整数 用字符串来表示大整数避免溢出
* 题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0
*
* 假设当前正在搜索由0,1组成的K位十进制数
读书笔记
chengxuyuancsdn
读书笔记
1、Struts访问资源
2、把静态参数传递给一个动作
3、<result>type属性
4、s:iterator、s:if c:forEach
5、StringBuilder和StringBuffer
6、spring配置拦截器
1、访问资源
(1)通过ServletActionContext对象和实现ServletContextAware,ServletReque
[通讯与电力]光网城市建设的一些问题
comsci
问题
信号防护的问题,前面已经说过了,这里要说光网交换机与市电保障的关系
我们过去用的ADSL线路,因为是电话线,在小区和街道电力中断的情况下,只要在家里用笔记本电脑+蓄电池,连接ADSL,同样可以上网........
oracle 空间RESUMABLE
daizj
oracle 空间不足 RESUMABLE 错误挂起
空间RESUMABLE操作 转
Oracle从9i开始引入这个功能,当出现空间不足等相关的错误时,Oracle可以不是马上返回错误信息,并回滚当前的操作,而是将操作挂起,直到挂起时间超过RESUMABLE TIMEOUT,或者空间不足的错误被解决。
这一篇简单介绍空间RESUMABLE的例子。
第一次碰到这个特性是在一次安装9i数据库的过程中,在利用D
重构第一次写的线程池
dieslrae
线程池 python
最近没有什么学习欲望,修改之前的线程池的计划一直搁置,这几天比较闲,还是做了一次重构,由之前的2个类拆分为现在的4个类.
1、首先是工作线程类:TaskThread,此类为一个工作线程,用于完成一个工作任务,提供等待(wait),继续(proceed),绑定任务(bindTask)等方法
#!/usr/bin/env python
# -*- coding:utf8 -*-
C语言学习六指针
dcj3sjt126com
c
初识指针,简单示例程序:
/*
指针就是地址,地址就是指针
地址就是内存单元的编号
指针变量是存放地址的变量
指针和指针变量是两个不同的概念
但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样
*/
# include <stdio.h>
int main(void)
{
int * p; // p是变量的名字, int *
yii2 beforeSave afterSave beforeDelete
dcj3sjt126com
delete
public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);
if($insert) {
//这里是新增数据
} else {
//这里是更新数据
}
}
timertask
shuizhaosi888
timertask
java.util.Timer timer = new java.util.Timer(true);
// true 说明这个timer以daemon方式运行(优先级低,
// 程序结束timer也自动结束),注意,javax.swing
// 包中也有一个Timer类,如果import中用到swing包,
// 要注意名字的冲突。
TimerTask task = new
Spring Security(13)——session管理
234390216
session Spring Security 攻击保护 超时
session管理
目录
1.1 检测session超时
1.2 concurrency-control
1.3 session 固定攻击保护
公司项目NODEJS实践0.3[ mongo / session ...]
逐行分析JS源代码
mongodb session nodejs
http://www.upopen.cn
一、前言
书接上回,我们搭建了WEB服务端路由、模板等功能,完成了register 通过ajax与后端的通信,今天主要完成数据与mongodb的存取,实现注册 / 登录 /
pojo.vo.po.domain区别
LiaoJuncai
java VO POJO javabean domain
POJO = "Plain Old Java Object",是MartinFowler等发明的一个术语,用来表示普通的Java对象,不是JavaBean, EntityBean 或者 SessionBean。POJO不但当任何特殊的角色,也不实现任何特殊的Java框架的接口如,EJB, JDBC等等。
即POJO是一个简单的普通的Java对象,它包含业务逻辑
Windows Error Code
OhMyCC
windows
0 操作成功完成.
1 功能错误.
2 系统找不到指定的文件.
3 系统找不到指定的路径.
4 系统无法打开文件.
5 拒绝访问.
6 句柄无效.
7 存储控制块被损坏.
8 存储空间不足, 无法处理此命令.
9 存储控制块地址无效.
10 环境错误.
11 试图加载格式错误的程序.
12 访问码无效.
13 数据无效.
14 存储器不足, 无法完成此操作.
15 系
在storm集群环境下发布Topology
roadrunners
集群 storm topology spout bolt
storm的topology设计和开发就略过了。本章主要来说说如何在storm的集群环境中,通过storm的管理命令来发布和管理集群中的topology。
1、打包
打包插件是使用maven提供的maven-shade-plugin,详细见maven-shade-plugin。
<plugin>
<groupId>org.apache.maven.
为什么不允许代码里出现“魔数”
tomcat_oracle
java
在一个新项目中,我最先做的事情之一,就是建立使用诸如Checkstyle和Findbugs之类工具的准则。目的是制定一些代码规范,以及避免通过静态代码分析就能够检测到的bug。 迟早会有人给出案例说这样太离谱了。其中的一个案例是Checkstyle的魔数检查。它会对任何没有定义常量就使用的数字字面量给出警告,除了-1、0、1和2。 很多开发者在这个检查方面都有问题,这可以从结果
zoj 3511 Cake Robbery(线段树)
阿尔萨斯
线段树
题目链接:zoj 3511 Cake Robbery
题目大意:就是有一个N边形的蛋糕,切M刀,从中挑选一块边数最多的,保证没有两条边重叠。
解题思路:有多少个顶点即为有多少条边,所以直接按照切刀切掉点的个数排序,然后用线段树维护剩下的还有哪些点。
#include <cstdio>
#include <cstring>
#include <vector&