java的数据库原生使用jdbc,中间件有很多,例如说hibernate、mybatis、jdbi,这几种是最常用的中间件。

怎么选择

一般情况下,如果始终只会使用到一种数据库,jdbc就是最好的选择了,使用这种方式,就是直接使用最底层的东西,定位问题等都非常方便。

数据库中间件就是节省开发人力,用很少的代码就可以快速开发。但是也会引入一些复杂度,特别是如果对中间件不熟悉或者中间件存在bug,会导致更高复杂度。

如果使用数据库中间件,各种中间件都有各自的优劣势,对于相关的东西需要了解清楚,否则会导致不恰当的选择。

jdbi

jdbi是我比较喜欢的一个数据库中间件,它是非ORM的,特别适合于数据库固定不变的场景,即不会对应多种数据库,以后也不会更换数据库的场景。如果不是这种场景,那么使用jdbc或者最好选择hibernate等对多种数据库兼容较好的中间件。

基于上述使用场景,jdbi的优点有:

和jdbci比较接近,使用和掌握非常简单。

与时俱进,例如说现在最新的jdbi3,增加了流式编程函数式等编程风格。

源代码的实现思路非常清晰,有一种美感。使用jdbi封装出的数据库代码也非常清晰。

jdbi的两种风格

Fluent Api

handle.createUpdate("INSERT INTO user(id, name) VALUES (:id, :name)")

.bind("id", 2)

.bind("name", "Clarice")

.execute();

这里就是java8的流式风格,用连贯式表达式将一个sql实现串在一起

Declarative Api

// Define your own declarative interface

public interface UserDao {

@SqlUpdate("CREATE TABLE user (id INTEGER PRIMARY KEY, name VARCHAR)")

void createTable();

@SqlUpdate("INSERT INTO user(id, name) VALUES (?, ?)")

void insertPositional(int id, String name);

@SqlUpdate("INSERT INTO user(id, name) VALUES (:id, :name)")

void insertNamed(@Bind("id") int id, @Bind("name") String name);

@SqlUpdate("INSERT INTO user(id, name) VALUES (:id, :name)")

void insertBean(@BindBean User user);

@SqlQuery("SELECT * FROM user ORDER BY name")

@RegisterBeanMapper(User.class)

List listUsers();

}

声明式的主要是使用注解来实现,在实际的面向对象风格的代码中,我个人觉得声明式的比较简洁,容易阅读和维护。所以下面都按照Declarative Api的方式。

一些关键性的问题

对于jdbi的实现,需要自己去看jdbi的主页,http://jdbi.org/,这里讲一些实际使用中遇到的需要注意到的问题

返回自动递增的主键

jdbc方式怎么做的呢?

try {

Connection conn = DBUtil2.getConnection();

//PreparedStatement ps =

// conn.prepareStatement(SAVE_SQL, new String[] { "id" });

//应该返回生成的主键,上下两种方式都可

PreparedStatement ps = conn.prepareStatement(SAVE_SQL,PreparedStatement.RETURN_GENERATED_KEYS);

ps.setString(1, user.getName());

ps.setFloat(2, user.getSalary());

ps.setInt(3, user.getAge());

if (ps.executeUpdate() > 0) {

//获取主键

ResultSet rs = ps.getGeneratedKeys();

rs.next();

int i = rs.getInt(1);

user.setId(i);

ps.close();

return true;

}

ps.close();

} catch (SQLException e) {

e.printStackTrace();

} finally {

DBUtil2.closeConnection();

}

jdbi提供的机制:

public interface UserDao {

@SqlBatch("INSERT INTO users (name) VALUES(?)")

@GetGeneratedKeys

List createUsers(String... names);

}

非常直观简洁

查询

jdbc方式,我们在查询大数据量时,一般使用数据库游标,逐条查询。

jdbi的查询是什么样的呢?如下:

public interface UserDao {

@SqlQuery("select name from users")

List listNames();

}

但是这个时候,如果遇到大数据量怎么办,jdbi提供的解决方案:

public interface UserDao {

@SqlQuery("select name from users")

ResultIterator getNamesAsIterator();

}

这里使用了迭代器,依次去查询,和jdbi游标的作用是一样的。

批量插入

jdbi的插入,当一个列表插入,如果要提升效率,就是拆分插入,拆分插入jdbi提供了机制SqlBatch

public interface UserDao {

@SqlBatch("insert into users (tenant_id, id, name) " +

"values (:tenantId, :user.id, :user.name)")

void bulkInsert(@Bind("tenantId") long tenantId,

@BindBean("user") User... users);

}

小结

jdbi是非常简洁优美的数据库中间件组件,当在数据库唯一特别是pg数据库,个人认为是首选方式,有效的把jdbc封装了一下,更加适合于开发。

jdbi和jdbc_数据库中间件-jdbi相关推荐

  1. 开源分布式数据库中间件

    转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性 ...

  2. 为了给你们讲清楚数据库中间件有哪些,我也是拼了!

    来自:会点代码的大叔 如果是 IT 老鸟,对于中间件.数据库中间件这些名词一定都不陌生,但是如果是程序员新人,如果你向他解释:"中间件就是和业务无关的技术组件":有些新人可能依然会 ...

  3. 数据库中间件MyCat学习总结(1)——MyCat入门简介

    为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代.如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷. MyCat的目标就是:低成本 ...

  4. 数据库中间件支持数据库集群方案

    咏南数据库中间件支持数据库集群方案 通过咏南数据库中间件作为PROXY(数据库代理)实现的数据库集群,非数据库层面集群. 数据库可以分库分表进行水平或垂直拆分成数据库集群. 咏南中间件作为数据库集群代 ...

  5. 数据库中间件mycat

    介绍: 中国企业级的,开源数据库中间件 特点: 1 高性能的读写分离 读写分离: 在数据库集群中,主节点负责写,从节点负责读数据,能够满足系统对读的要求和次数较高的特点;一个分片进行读写分离的设置,可 ...

  6. (转载)MyCat:开源分布式数据库中间件

    发现MyCat这个东西,觉得还是有很多应用场合,之前为了mysql读写分离.分布等伤透脑筋,没想到有现成的中间件工具,看来很多有经验的公司是受到过折磨,才整出好工具.方法和工具的发明,总是因为问题的存 ...

  7. 【干货】浅谈分布式数据库中间件之分库分表

    分库分表,顾名思义就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上.那么关于分库分表,你了解多少呢?接下来,我们将从什么是数据分片及如何进行分片两方面对DDM ...

  8. 手把手带你用数据库中间件Mycat+SpringBoot完成分库分表

    一.背景 随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的磁盘.IO.系统开销,甚至性能上的瓶颈,而一台服务的资源终究是有限的,因此需要对数据库和表进 ...

  9. java中间件_Java技术分享:一致性更强的分布式数据库中间件

    分布式数据库中间件 ShardingSphere 将 Sea t a 分布式事务能力进行整合,旨在打造一致性更强的分布式 数据库中间件 . 背景 数据库领域,分布式事务的实现主要包含:两阶段的 XA ...

最新文章

  1. Android 双目 单usb,【android9.0】无法打开usb uvc camera
  2. 真的汉子不多,褚时健褚老算一个
  3. 【leetcode】910. Smallest Range II
  4. IntelliJ IDEA内部设计
  5. rtosucos和linux区别,为什么我们需要uCos?带你透彻理解RTOS
  6. [读书笔记] 机器学习 (一)绪论
  7. mobomarket android,MoboMarket
  8. ExcelToSQLServer-批量导入Excel文件到SQL Server数据库
  9. 中兴面试题 01背包问题
  10. 图像批处理高斯滤波降噪+峰值信噪比计算
  11. 审计人员需要哪些计算机知识,审计人员应具备的知识与技能
  12. 计算机显示发送报告,Word文档打不开提示发送错误报告的解决方法
  13. cad画钟表_CAD中,如何绘制时钟表? 来看看吧
  14. 在网页中插入视频代码大全
  15. 第十六届“振兴杯”计算机网络管理员赛项理论参考题库(1)单选
  16. python数据结构二叉树的查找算法_在路上---学习篇(一)Python 数据结构和算法 (5)二分查找、二叉树遍历...
  17. leetcode 每日一题—274.H指数
  18. 1079: PIPI的存钱罐
  19. JAVA用Math 给pi赋值_导入Math.PI作为参考或值
  20. java多线程运行结果写入文件错误java.io.IOException: Stream closed

热门文章

  1. 详解vue-router 中的导航钩子
  2. ResultSetMetaData.getColumnName踩坑记
  3. 扩散模型:Diffusion models as plug-and-play priors作为即插即用先验的扩散模型
  4. 世界上最短的DVD解码程序
  5. abstract修饰符
  6. java装修默认方案_Java 装饰模式
  7. java中String类型对象在克隆时候的特殊性
  8. 2023年了,还有开发人员还不知道commit 规范 ??
  9. WebSocket心跳
  10. ctfshow萌新区web1~21