- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
服务端(ubuntu 20.04):TDengine-server:2.4.0.5
客户端(windows 10):TDengine-client:2.4.0.5
依赖:taos-jdbcdriver:2.0.34
springboot:spring-boot.version>2.3.7.RELEASE
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdbcdriver</artifactId>
<version>2.0.34</version>
</dependency>
<!-- MySQL的JDBC数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
注意:这里taos-jdbcdriver的版本可以参考下面的参数
taos-jdbcdriver 版本 | TDengine 2.0.x.x 版本 | TDengine 2.2.x.x 版本 | TDengine 2.4.x.x 版本 | JDK 版本 |
---|---|---|---|---|
2.0.38 | X | X | 2.4.0.14 及以上 | 1.8.x |
2.0.37 | X | X | 2.4.0.6 及以上 | 1.8.x |
2.0.36 | X | 2.2.2.11 及以上 | 2.4.0.0 - 2.4.0.5 | 1.8.x |
2.0.35 | X | 2.2.2.11 及以上 | 2.3.0.0 - 2.4.0.5 | 1.8.x |
2.0.33 - 2.0.34 | 2.0.3.0 及以上 | 2.2.0.0 及以上 | 2.4.0.0 - 2.4.0.5 | 1.8.x |
2.0.31 - 2.0.32 | 2.1.3.0 - 2.1.7.7 | X | X | 1.8.x |
2.0.22 - 2.0.30 | 2.0.18.0 - 2.1.2.1 | X | X | 1.8.x |
2.0.12 - 2.0.21 | 2.0.8.0 - 2.0.17.4 | X | X | 1.8.x |
2.0.4 - 2.0.11 | 2.0.0.0 - 2.0.7.3 | X | X | 1.8.x |
@Data
public class Temperature {
private Timestamp ts;
private float temperature;
private String location;
private int tbIndex;
}
TDengine 类型对应Java类型
TDengine 目前支持时间戳、数字、字符、布尔类型,与 Java 对应类型转换如下
TDengine DataType | JDBCType (driver 版本 < 2.0.24) | JDBCType (driver 版本 >= 2.0.24) |
---|---|---|
TIMESTAMP | java.lang.Long | java.sql.Timestamp |
INT | java.lang.Integer | java.lang.Integer |
BIGINT | java.lang.Long | java.lang.Long |
FLOAT | java.lang.Float | java.lang.Float |
DOUBLE | java.lang.Double | java.lang.Double |
SMALLINT | java.lang.Short | java.lang.Short |
TINYINT | java.lang.Byte | java.lang.Byte |
BOOL | java.lang.Boolean | java.lang.Boolean |
BINARY | java.lang.String | byte array |
NCHAR | java.lang.String | java.lang.String |
JSON | - | java.lang.String |
注意:JSON类型仅在tag中支持
@Repository
@Mapper
public interface TemperatureMapper{
@Update("CREATE TABLE if not exists temperature(ts timestamp, temperature float) tags(location nchar(64), tbIndex int)")
int createSuperTable();
@Update("create table #{tbName} using temperature tags( #{location}, #{tbindex})")
int createTable(@Param("tbName") String tbName, @Param("location") String location, @Param("tbindex") int tbindex);
@Update("drop table if exists temperature")
void dropSuperTable();
@Insert("insert into t${tbIndex}(ts, temperature) values(#{ts}, #{temperature})")
int insertOne(Temperature one);
@Select("select * from temperature where location = #{location}")
List<Temperature> selectTemperatureByLocation(@Param("location") String location);
@Select("select * from temperature")
List<Temperature> selectAll();
@Select("select count(*) from temperature where temperature = 0.5")
int selectCount();
@Update("create database if not exists test")
void createDB();
@Update("drop database if exists test")
void dropDB();
}
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = {"com.yolo.springboottdengine.mapper"}, sqlSessionFactoryRef = "TDengineSqlSessionFactory")
public class TDengineConfiguration {
@Bean(name = "TDengineDataSource")
public DataSource tdengineDataSource() throws Exception {
// 125 TDengine测试环境
String taosHost = "127.0.0.1";
String taosPort = "6030";
String taosUsername = "root";
String taosPassword = "root";
String taosDB = "test";
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.taosdata.jdbc.TSDBDriver");
dataSource.setUrl("jdbc:TAOS://" + taosHost + ":" + taosPort + "/" + taosDB
+ "?charset=UTF-8&locale=zh_CN.UTF-8&timezone=UTC-8");
dataSource.setPassword(taosPassword);
dataSource.setUsername(taosUsername);
dataSource.setInitialSize(5);
dataSource.setMinIdle(10);
dataSource.setMaxActive(100);
dataSource.setMaxWait(30000);
dataSource.setValidationQuery("select server_status()");
return dataSource;
}
@Bean(name = "TDengineTransactionManager")
public DataSourceTransactionManager tdengineTransactionManager() throws Exception {
return new DataSourceTransactionManager(tdengineDataSource());
}
@Bean(name = "TDengineSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("TDengineDataSource") DataSource dataSource, PageHelper pageHelper) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setPlugins(pageHelper);
return sessionFactory.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("TDengineSqlSessionFactory")SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean
public PageHelper pageHelper() {
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
p.setProperty("offsetAsPageNum", "true");
p.setProperty("rowBoundsWithCount", "true");
p.setProperty("reasonable", "true");
p.setProperty("dialect", "mysql");
pageHelper.setProperties(p);
return pageHelper;
}
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class TemperatureTest {
private static final Random random = new Random(System.currentTimeMillis());
private static final String[] locations = {"北京", "上海", "深圳", "广州", "杭州"};
@Autowired
private TemperatureMapper temperatureMapper;
@Test
public void createDatabase(){
temperatureMapper.dropDB();
temperatureMapper.createDB();
}
@Test
public void init() {
temperatureMapper.dropSuperTable();
// create table temperature
temperatureMapper.createSuperTable();
// create table t_X using temperature
for (int i = 0; i < 10; i++) {
temperatureMapper.createTable("t" + i, locations[random.nextInt(locations.length)], i);
}
// insert into table
int affectRows = 0;
// insert 10 tables
for (int i = 0; i < 10; i++) {
// each table insert 5 rows
for (int j = 0; j < 5; j++) {
Temperature one = new Temperature();
one.setTs(new Timestamp(System.currentTimeMillis()));
one.setTemperature(random.nextFloat() * 50);
one.setLocation("望京");
one.setTbIndex(i);
affectRows += temperatureMapper.insertOne(one);
}
}
Assert.assertEquals(50, affectRows);
}
/**
* 根据名称查询
*/
@Test
public void testSelectByLocation() {
List<Temperature> temperatureList = temperatureMapper.selectTemperatureByLocation("广州");
System.out.println(temperatureList);
}
/**
* 查询所有
*/
@Test
public void testSelectAll() {
List<Temperature> temperatures = temperatureMapper.selectAll();
System.out.println(temperatures.size());
}
/**
* 插入数据
*/
@Test
public void testInsert() {
//时间一样的时候,数据不会发现改变 1604995200000
Temperature one = new Temperature();
one.setTs(new Timestamp(1604995222224L));
one.setTemperature(1.2f);
int i = temperatureMapper.insertOne(one);
System.out.println(i);
}
/**
* 查询数量
*/
@Test
public void testSelectCount() {
int count = temperatureMapper.selectCount();
System.out.println(count);
}
/**
* 分页查询
*/
@Test
public void testPage() {
//查询之前,设置当前页和当前页的数量
PageHelper.startPage(1, 2);
List<Temperature> temperatureList = temperatureMapper.selectAll();
//把查询结果放入到pageInfo对象中
PageInfo<Temperature> pageInfo = new PageInfo<>(temperatureList);
long total = pageInfo.getTotal();
int pageNum = pageInfo.getPageNum();
List<Temperature> list = pageInfo.getList();
System.out.println("总数:" + total);
System.out.println("页数:" + pageNum);
System.out.println(list);
}
}
public class Weather {
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS", timezone = "GMT+8")
private Timestamp ts;
private Float temperature;
private Float humidity;
private String location;
private String note;
private int groupId;
//省略构造方法和get/set方法
}
app.td.rest.url=http://127.0.0.1:6041/rest/sql
app.td.rest.basic=Basic cm9vd90
app.td.db=test
@SpringBootTest
@RunWith(SpringRunner.class)
public class WeatherTest {
private static final Logger logger = LoggerFactory.getLogger(WeatherTest.class);
@Value("${app.td.rest.url}")
@NotBlank
private String tdRestUrl;
@Value("${app.td.rest.basic}")
@NotBlank
private String tdRestBasic;
@Value("${app.td.db}")
@NotBlank
private String db;
private final Random random = new Random(System.currentTimeMillis());
private final String[] locations = {"北京", "上海", "广州", "深圳", "天津"};
@Test
public void createDB() {
String sql = "create database if not exists test";
String url = tdRestUrl;
tdengineRestful(url, sql);
}
@Test
public void dropDB() {
String sql = "drop database if exists test";
tdengineRestful2(tdRestUrl, sql);
}
@Test
public void createSuperTable() {
String sql = "create table if not exists test.weather (ts timestamp,temperature float,humidity float,note binary(64)) tags(location nchar(64), groupId int)";
tdengineRestful2(tdRestUrl, sql);
}
@Test
public void createTable() {
String url = tdRestUrl + "/" + db;
long ts = System.currentTimeMillis();
long thirtySec = 1000 * 30;
Weather weather = new Weather(new Timestamp(ts + (thirtySec)), 30 * random.nextFloat(), random.nextInt(100));
weather.setLocation(locations[random.nextInt(locations.length)]);
weather.setGroupId(1);
weather.setNote("note-" + 1);
//create table if not exists test.t#{groupId} using test.weather tags(#{location},#{groupId})
StringBuilder sb = new StringBuilder();
sb.append("create table if not exists test.t")
.append(weather.getGroupId()).append(" ")
.append("using test.weather tags(")
.append("'").append(weather.getLocation()).append("'").append(",")
.append(weather.getGroupId()).append(")");
String s = sb.toString();
tdengineRestful2(url, sb.toString());
}
@Test
public void insertTable() {
String url = tdRestUrl + "/" + db;
long ts = System.currentTimeMillis();
long thirtySec = 1000 * 30;
for (int i = 0; i < 5; i++) {
Weather weather = new Weather(new Timestamp(ts + (thirtySec * i)), 30 * random.nextFloat(), random.nextInt(100));
weather.setLocation(locations[random.nextInt(locations.length)]);
weather.setGroupId(1);
weather.setNote("note-" + 1);
//insert into test.t#{groupId} (ts, temperature, humidity, note)values (#{ts}, ${temperature}, ${humidity}, #{note})
StringBuilder sb = new StringBuilder();
sb.append("insert into test.t").append(weather.getGroupId()).append(" ")
.append("(ts, temperature, humidity, note)").append(" ")
.append("values (").append(weather.getTs().getTime()).append(",")
.append(weather.getTemperature()).append(",")
.append(weather.getHumidity()).append(",")
.append("'").append(weather.getNote()).append("'")
.append(")");
String sql = sb.toString();
tdengineRestful2(url,sql);
}
}
@Test
public void selectCount(){
String url = tdRestUrl + "/" + db;
String sql = "select count(*) from test.weather";
TDengineRestfulInfo tDengineRestfulInfo = tdengineRestful2(url, sql);
System.out.println(tDengineRestfulInfo);
}
@Test
public void selectOne(){
String url = tdRestUrl + "/" + db;
String sql = "select * from test.weather where humidity = 13";
TDengineRestfulInfo tDengineRestfulInfo = tdengineRestful2(url, sql);
System.out.println(tDengineRestfulInfo);
}
@Test
public void selectTbname(){
String url = tdRestUrl + "/" + db;
String sql = "select tbname from test.weather";
TDengineRestfulInfo tDengineRestfulInfo = tdengineRestful2(url, sql);
System.out.println(tDengineRestfulInfo);
}
@Test
public void selectLastOne(){
String url = tdRestUrl + "/" + db;
String sql = "select last_row(*), location, groupid from test.weather";
TDengineRestfulInfo tDengineRestfulInfo = tdengineRestful2(url, sql);
System.out.println(tDengineRestfulInfo);
}
@Test
public void selectAVG(){
String url = tdRestUrl + "/" + db;
String sql = "select avg(temperature), avg(humidity) from test.weather interval(1m)";
TDengineRestfulInfo tDengineRestfulInfo = tdengineRestful2(url, sql);
System.out.println(tDengineRestfulInfo);
}
@Test
public void selectLimit(){
String url = tdRestUrl + "/" + db;
String sql = "select * from test.weather order by ts desc limit 3";
TDengineRestfulInfo tDengineRestfulInfo = tdengineRestful2(url, sql);
System.out.println(tDengineRestfulInfo);
}
public TDengineRestfulInfo tdengineRestful2(String url, String sql) {
TDengineRestfulInfo tDengineRestfulInfo = null;
// 获取默认配置 的OkHttpClient 对象
OkHttpClient httpClient = new OkHttpClient.Builder().build();
MediaType mediaType = okhttp3.MediaType.parse("application/json; charset=utf-8");
RequestBody requestBody = RequestBody.create(mediaType, sql);
Request request = new Request.Builder()
.url(url)
.addHeader("Authorization", tdRestBasic)
.post(requestBody)
.build();
Response response = null;
try {
response = httpClient.newCall(request).execute();
if (response.code() == HttpStatus.OK.value()) {
if (response.body() != null) {
String s = response.body().string();
tDengineRestfulInfo = JSONUtil.toBean(s, TDengineRestfulInfo.class);
}
} else {
logger.error("tdengineRestful 查询状态码异常,状态码是:" + response.code() + " ,异常消息是:" + response.message());
}
} catch (Exception e) {
logger.error("tdengineRestful 查询出现错误:" + e);
} finally {
if (response != null) {
response.close();
}
}
return tDengineRestfulInfo;
}
}
注意这里新增一条数据的时候ts,俩种方式,要注意引号
“ts”: 1626324781093
“ts”: “2021-07-19 14:53:01.093”
前言 这个东西有啥用,好玩? 确实, 好玩归好玩,其实很有使用场景。 可以自己选则一些业务节点触发这个机器人助手的消息推送; 简单举例: 有人给你的系统留下反馈意见了,推送到运营群去; 2.项目部署成
1. JWT 简介 JSON Web Token(JWT) 是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信
我的页面上有多个 ajax 调用,我想将它们合并为一个函数。 目前我在几个地方都有这种类型的功能: function AjaxCallOne () { //do something $.ajax(
我的 Facebook 集成基本上可以在我的应用程序中运行:出现 Facebook 对话框,用户可以选择“允许”或“不允许”。但是,我不明白 API 是如何工作的!我有一个使用此代码的 Activit
我必须将文件夹结构从我的应用程序共享到 OneDrive。 我已经检查了一个驱动器的 sdk,但在那个 sdk 中只能共享文件而不是文件夹,并且没有在该 sdk 中创建文件夹的选项 https://g
我是支付网关集成方面的新手。我必须在我的项目 (CORE PHP) 中集成 CCAvenue 支付网关集成。但是我不知道如何为开发人员测试创建商户帐户,如何获取商户 key 等。我已经进行了研发,但是
我正在尝试将“社交选项”集成到我的应用程序中。 我有 iOS6,但我的想法是有一个适用于 iOS5 的应用程序。使用 Twitter 框架非常简单,并且可以在 r.0 版本和 6.0 版本的设备上运行
我正在尝试将 flurryAds 集成到我的 iPhone 应用程序中,但我无法做到这一点。我导入名为 的 .h 文件 #import "Flurry.h" #import "FlurryAds.h"
我正在尝试在我的网站中实现类似 facebook 的按钮和评论,但我在 IE7 中遇到了评论框问题。 COMMENT USING 下拉框不知何故没有显示其他可用选项。这是我用来实现它的代码片段:
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve th
我正在使用 SOAP API 进行 PayPal 集成(Express Checkout)。在 DoExpressCheckout 调用后,我调用 GetExpressCheckoutDetails。
我正在尝试将 paypal 作为支付网关之一集成到我的应用程序中,但在我点击支付按钮后它会返回以下错误。 错误 java.lang.RuntimeException:无法使用 Intent { cmp
我目前正在尝试将 paypal 结账与我们的在线商店集成。我们正在针对 Sandbox 进行测试。除了 IPN(即时付款通知)之外的所有内容都有效。 我们阅读了很多有关 Paypal 更改其安全模型的
我正在开发一个 android 应用程序,我想在其中集成 facebook 之类的。我正在浏览链接 http://developers.facebook.com/docs/guides/mobile/
所以我正在尝试构建一个集成了 FitBit 的 iOS 应用程序 (Swift 2)。 一旦用户打开“步行”页面,用户应该能够看到他每天的步数。 理想情况下,我们不希望每个用户都注册到 FitBit。
我是集成投递箱的新手,但我不太确定如何生成调用以获取请求 token secret 。 https://www.dropbox.com/developers/reference/api#request
我已经成功集成了 PayPal。一切正常。但我希望我的表格在成功付款后重定向到我的网站。另一个问题:如何从 PayPal 得到回应?这是我的 Paypal 表格。谢谢。 `
我在我的 Android 应用程序中集成了 Paypal 。我有一个主要 Activity - 和关于 Activity ,我在其中显示 Paypal 按钮。关于从主 Activity 访问的 Act
前言: 小编引入的图片和文字描述都是来自于尚硅谷的视频讲解,在此感谢尚硅谷的老师,同时也结合 seata文档官方文档进行整合 项目地址(gitee): https://gitee.com/qine
目录 1. demo project 1.1 接口准备 1.2 配置准备 2. docker 开启远程连接
我是一名优秀的程序员,十分优秀!