一、前文
TDengine 入门教程——导读
二、JDBC Demo下载
TDengine 官方提供的示例程序源码位于TDengine / TDengine 的 TDengine/examples/JDBC
下:
- JDBCDemo:JDBC 最简单的demo。
- connectionPools:HikariCP, Druid, dbcp, c3p0 等连接池中使用 taos-jdbcdriver。
- SpringJdbcTemplate:Spring JdbcTemplate 中使用 taos-jdbcdriver。
- mybatisplus-demo:Mybatis 中使用 taos-jdbcdriver。
- springbootdemo:Springboot 中使用 taos-jdbcdriver。
三、最简单的Demo 浅析
pom.xml
添加依赖
<dependencies>
<dependency>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdbcdriver</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
- 通过
url
和properties
连接数据库 - 执行SQL语句
drop database if exists test
:如果test数据库存在,则删除test数据库create database if not exists test
:如果test数据库不存在,则新建test数据库use test
:切换到test数据库create table test.weather(ts timestamp, temperature float) tags(location nchar(64))
:创建weather表insert into t2 using test.weather tags('厦门') values(now, 17.2)
:往t2子表插入数据select * from t2
:查询t2子表
- 关闭连接
public class JdbcRestfulDemo {
private static final String host = "localhost";
private static final String dbname = "test";
private static final String user = "root";
private static final String password = "taosdata";
public static void main(String[] args) {
try {
String url = "jdbc:TAOS-RS://" + host + ":6041/?user=" + user + "&password=" + password;
Properties properties = new Properties();
properties.setProperty("charset", "UTF-8");
properties.setProperty("locale", "en_US.UTF-8");
properties.setProperty("timezone", "UTC-8");
Connection conn = DriverManager.getConnection(url, properties);
Statement stmt = conn.createStatement();
stmt.execute("drop database if exists " + dbname);
stmt.execute("create database if not exists " + dbname);
stmt.execute("use " + dbname);
stmt.execute("create table " + dbname + ".weather(ts timestamp, temperature float) tags(location nchar(64))");
stmt.executeUpdate("insert into t2 using " + dbname + ".weather tags('厦门') values(now, 17.2)");
// ResultSet rs = stmt.executeQuery("select * from " + dbname + ".weather");
// ResultSet rs = stmt.executeQuery("select temperature,location from t2");
ResultSet rs = stmt.executeQuery("select * from t2");
ResultSetMetaData meta = rs.getMetaData();
while (rs.next()) {
for (int i = 1; i <= meta.getColumnCount(); i++) {
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
}
System.out.println();
}
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- IDEA启动配置
- 打印输出
五、数据库连接池
最简单的JDBC demo已经能实现基本功能,但是细节上并不完善。
因为其每次执行数据库读写,都需要打开和关闭数据库连接。一旦短时间内有成千上万请求,就会:
- 浪费大量的网络时间;
- 大量的数据库连接,加重数据库的负载;
- 临时对象较多,内存无法及时释放,不必要的系统开销;
所以,常见的数据库操作通常都会用到数据库连接池,常见的数据库连接池有哪些:
proxool
:性能不错,稳定性稍差,并发较高的情况下会出错;dbcp
:apache上的一个 java 连接池项目,也是 tomcat 使用的连接池组件;druid
:alibba出品,功能比较全面,且扩展性较好的数据库连接池,比较方便对jdbc接口进行监控跟踪等;HikariCP
:性能强劲,稳定性也不差。目前被SpringBoot2官方推荐使用的数据库连接池;
就性能而言,HikariCP
最强,但是我们选择druid
,因为druid
最为全面,没有短板。
四、基于SpringBoot的Demo浅析
除了需要Druid
连接池之外,我们还需要Mybatis
持久层框架。
4.1 pom依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdbcdriver</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
4.2 properties配置
# datasource config
spring.datasource.driver-class-name=com.taosdata.jdbc.TSDBDriver
spring.datasource.url=jdbc:TAOS://127.0.0.1:6030/test
spring.datasource.username=root
spring.datasource.password=taosdata
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=5
# max wait time for get connection, ms
spring.datasource.druid.max-wait=60000
spring.datasource.druid.validation-query=select server_status();
spring.datasource.druid.validation-query-timeout=5000
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=600000
spring.datasource.druid.max-evictable-idle-time-millis=900000
# mybatis
mybatis.mapper-locations=classpath:mapper/*.xml
# log
logging.level.com.taosdata.jdbc.springbootdemo.dao=debug
4.3 框架浅析
- Controller控制层,负责请求和响应控制。
- Service服务层,负责业务逻辑代码的处理。
- Dao持久层,负责数据库的增删改查。
Controller控制层
Service服务层
Dao持久层
所以,如下图,简而言之:
- 功能逻辑代码主要在
WeatherService.java
- TDengine数据库的SQL操作主要在
WeatherMapper.xml
4.4 运行调试
-
application.properties
配置文件修改ok后,即可运行启动。 -
通过ApiPost6工具请求接口
-
init
接口,初始化数据库,随机插入20条数据 -
count
接口,查询当前数据库有多少条数据 -
save
接口,数据库数据写入。
以此接口为例,浅谈程序源码WeatherController.java
@PostMapping("/{temperature}/{humidity}")
public int saveWeather(@PathVariable float temperature, @PathVariable float humidity) {
return weatherService.save(temperature, humidity);
}
WeatherService.java
public int save(float temperature, float humidity) {
Weather weather = new Weather();
weather.setTs(new Timestamp(new Date().getTime()));
weather.setTemperature(temperature);
weather.setHumidity(humidity);
weather.setLocation("厦门");
weather.setNote("save测试");
weather.setGroupId(30);
weatherMapper.createTable(weather);
return weatherMapper.insert(weather);
}
WeatherMapper.xml
<insert id="insert" parameterType="com.taosdata.example.springbootdemo.domain.Weather">
insert into test.t#{groupId} (ts, temperature, humidity, note)
values (#{ts}, ${temperature}, ${humidity}, #{note})
</insert>
lastOne
接口,数据库数据查询