一、达梦数据库简介
说明:有关国产数据库完整的博客太少了,所以就想弄一个完整的专栏给大家提供一些帮助。在现在这种国际形势下,网络安全是每个企业,乃至整个国家重中之重的事,国产化是一种趋势,在整合之前先了解一下达梦数据库。达梦数据库官网:本篇主要讲整合,详细介绍会在别的文章中。
这里需要对JPA有一定的了解可以看我之前的几篇文章:《SpringBoot篇》09.Spring Data JPA简介与SpringBoot整合超详细教学
1.达梦数据库管理系统是达梦公司推出的数据库管理系统,简称DM。
达梦数据库管理系统的最新版本是8.0版本,简称DM8。
2.DM8采用全新的体系架构,在保证做了大量的研发和改进工作,极大提升了达梦数据库产品的,能同时兼顾OLTP和OLAP请求,从根本上提升了DM8产品的品质。
二、JPA整合达梦数据库
说明:本篇使用的是SpringBoot框架+JPA+达梦数据库的整合。
项目运行环境:
idea2020.2
DM8
jdk1.8
1、创建项目
其实创建项目可以省略的,但是还是给大家展示出来吧。详细的步骤就不啰嗦了。
选择组件就选lombok就OK了。其实我项目中使用的是springboot2.3.12.RELEASE
,因为适配用,非常的稳定。大家自己改用项目版本就可以了。
2、添加坐标
注:Dm8JdbcDriver18
,DmDialect-for-hibernate5.3
,hibernate-core
这几个版本都是相对应的,按这个来是一定没问题的。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--达梦数据库驱动-->
<!-- https://mvnrepository.com/artifact/com.dameng/Dm8JdbcDriver18 -->
<dependency>
<groupId>com.dameng</groupId>
<artifactId>Dm8JdbcDriver18</artifactId>
<version>8.1.1.49</version>
</dependency>
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmDialect-for-hibernate5.3</artifactId>
<version>8.1.1.49</version>
</dependency>
<dependency>
<!--注意:只有这个版本的hibernate兼容达梦数据库 -->
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.18.Final</version>
</dependency>
</dependencies>
3.编写配置文件
注:这里提供的是properties版。这里需要注意你的用户名与密码如果是默认创建的数据库就是这个用户名与密码(全部权限)。这里要先创建好模式(模式是达梦特有的名称类似于数据库名),创建达梦数据库会在之后的文章中单独写出来。
properties版
spring.datasource.url=jdbc:dm://127.0.0.1:5236
spring.datasource.username=SYSDBA
spring.datasource.password=SYSDBA
spring.datasource.driver-class-name=dm.jdbc.driver.DmDriver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DmDialect
spring.jpa.database-platform=org.hibernate.dialect.DmDialect
### 特别重要与spring.jpa.hibernate.ddl-auto=update适配
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.open-in-view=false
## 这里是告诉JPA要控制的是哪个模式,这个是默认创建的模式
spring.jpa.properties.hibernate.default_schema=SYSDBA
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
4.编写实体类
注:用过JPA的应该了解,可以直接通过实体类,在启动项目的时候就会生成模式的表(类似于mysql中数据库中的表)。
package com.sql.dmsql.domain;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Data
@Table(name = "AAA")
public class AAA {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "NAME")
private String name;
}
4.Repository类
注:这里使用的还是JPQL,也可以使用原生DM_SQL,可以与mysql进行完全适配,不用更改sql。这个会单独在之后博客写出。(内容太多了)。
package com.sql.dmsql.repository;
import com.sql.dmsql.domain.AAA;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
public interface ARepository extends PagingAndSortingRepository<AAA,Long> {
@Transactional
@Modifying
@Query("update AAA a set a.name = :name where a.id = :id")
void update(String name,Long id);
}
5.测试类
注:这里可以把这几个方法分开一个一个尝试,因为在实体类中设置的是id自动自增,所以不用设置id,只传入name就可以。删除的要最后执行否则会报找不到id的错误。
@SpringBootTest
class DmsqlApplicationTests {
@Autowired
private ARepository aRepository;
@Test
void contextLoads() {
// 添加数据
AAA aaa = new AAA();
aaa.setName("ccc");
aRepository.save(aaa);
Iterable<AAA> saUpdate = aRepository.findAll();
System.out.println(saUpdate);
System.out.println("------------------------------------------");
// 自定义更新
aRepository.update("aaaa",1L);
Iterable<AAA> upAfter = aRepository.findAll();
System.out.println(upAfter);
System.out.println("------------------------------------------");
// 删除
aRepository.deleteById(1L);
Iterable<AAA> deAfter = aRepository.findAll();
System.out.println(deAfter);
System.out.println("------------------------------------------");
}
}