一:环境准备
1.数据库和JDK的准备
要想使用YashanDB和SpringBoot,YashanDB的部署和JDK的安装是必须的,关于YashanDB的安装官方文档有很详细的教程,这里就不再花篇幅介绍了,可点击这里跳转官方文档,关于部署的一些小技巧和注意事项,笔者前面写过一篇文章有介绍到,具体可点击这里跳转查看。关于JDK的安装这里也不做介绍,下面是笔者的JDK版本。
2.JDBC驱动下载
由于YashanDB还没有上传jar包到镜像仓库,所以我们不能直接通过maven坐标进行jar包引入,这时候需要我们到官网下载JDBC驱动后续手动导入到SpringBoot项目中。
二:环境搭建
1.SpringBoot项目创建
①打开IDEA新建项目,以Web界面方式创建SpringBoot项目,如下图。
②添加所需的依赖,由于后面需要搭建的是网页项目,所以需要引入Spring Web依赖。为了能够简化和数据库的交互,引入了MyBatis框架,通过SQL语句便可满足操作数据库的所有要求。引入Lombok是为了能更方便地输出自定义日志信息,方便调试。
2.数据库连接
①开启YashanDB服务器
部署好YashanDB服务器后,通过执行如下命令打开服务器:
yasboot cluster start -c yashandb
如果显示拒绝连接,则说明YashanDB依赖的相关服务没有开启,执行如下命令开启服务:
yasboot process yasom start -c yashandb
yasboot process yasagent start -c yashandb
yasboot process yasdb start -c yashandb
如果显示账户被锁定,则参考这里进行解决。需要注意的是,按照官方教程进行部署是没有提到创建YASDBA用户组的,所以直接将数据库安装用户添加到YASDBA组时会提示不存在该组,需要手动创建一个再添加,执行如下命令即可。
groupadd YASDBA
usermod -a -G YASDBA yashan
②导入JDBC驱动
(1)在项目源目录下创建一个lib包用于存放JDBC驱动,项目结构如下
(2)将下载的JDBC驱动(yashandb-jdbc-x.x.x.jar)移到lib包里,右键将其添加为库
(3)pom.xml文件中添加如下依赖,groupId、artifactId和version可根据自己喜好进行调整。
<dependency>
<groupId>com.my</groupId>
<artifactId>yashandb</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/lib/yashandb-jdbc-1.5.1.jar</systemPath>
</dependency>
(4)修改resource目录下面的application.properties为application.yml,输入以下连接信息。host、port、database_name分别对应服务器主机地址、数据库端口号、数据库名,如果密码含有符号开头需要添加单引号将密码包起来。
spring:
datasource:
# config information
url: jdbc:yasdb://host:port/database_name
username: sys
password: yourPassword
driver-class-name: com.yashandb.jdbc.Driver
(5)执行Application的main函数
@Slf4j
@SpringBootApplication
public class YashanProApplication {
public static void main(String[] args) {
SpringApplication.run(YashanProApplication.class, args);
log.info("启动成功");
}
}
可以看出项目成功启动。
三:项目实战
这次用于实战的项目还是我们的老朋友——图书管理系统,能实现基本的增删改查操作。
1.数据库创建
需要创建一个tbl_book表用于存储图书信息,表的结构如下:
这里需要实现id自增功能,YashanDB的语法和Oracle是类似的,我们都知道MySQL只需在字段后面添加"AUTO_INCREMENT"即可实现自增,但是Oracle需要创建序列来实现,同理YashanDB也需要靠序列来实现,SQL语句如下:
CREATE SEQUENCE book_index; --创建序列
CREATE TABLE tbl_book
(
id INT DEFAULT book_index.NEXTVAL NOT NULL,
type VARCHAR(30) NULL,
name VARCHAR(60) NOT NULL,
description VARCHAR(300) NULL,
is_delete INT DEFAULT 0,
PRIMARY KEY (id)
);
2.项目搭建
①搭建如下项目结构,这里对几个包进行说明,common包存放的是自定义状态码以及返回结果类,exception包存放的是自定义异常类,resource下的static包存放的是前端文件。
②编写POJO类、Controller类、Dao接口、Service接口及实现类,主要代码如下:
POJO类
public class Book {
//id
private String id;
//图书类型
private String type;
//图书名
private String name;
//图书描述
private String description;
//是否删除(逻辑删除)
private Integer is_delete;
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", type='" + type + '\'' +
", name='" + name + '\'' +
", description='" + description + '\'' +
", is_delete=" + is_delete +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getIs_delete() {
return is_delete;
}
public void setIs_delete(Integer is_delete) {
this.is_delete = is_delete;
}
}
Controller类:
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
//新增图书
@PostMapping
public Result save(@RequestBody Book book) {
boolean flag = bookService.save(book);
return new Result(flag? Code.SAVE_OK:Code.SAVE_ERR,flag);
}
//更新图书信息
@PutMapping
public Result update(@RequestBody Book book) {
boolean flag = bookService.update(book);
return new Result(flag?Code.UPDATE_OK:Code.SAVE_ERR,flag);
}
//删除图书
@DeleteMapping("/{id}")
public Result delete(@PathVariable String id) {
boolean flag = bookService.delete(id);
return new Result(flag?Code.DELETE_OK:Code.DELETE_ERR,flag);
}
//按id查找图书,用于编辑回显
@GetMapping(value = ("/getById"))
public Result getById(@RequestParam("id") String id) {
Book book = bookService.getById(id);
Integer code = (book == null? Code.GET_ERR:Code.GET_OK);
String msg = (book == null? "数据查询失败!":"");
return new Result(code,book,msg);
}
//按条件查询图书
@GetMapping(value = ("/getByName"))
public Result getByName(@RequestParam("name") String name){
List<Book> bookList = bookService.getByName(name);
Integer code = (bookList == null ? Code.GET_ERR:Code.GET_OK);
String msg = (bookList == null? "系统繁忙,请稍后再试!":"");
return new Result(code,bookList,msg);
}
}
Dao接口:
@Mapper
public interface BookDao {
//插入数据
@Insert("insert into tbl_book(type,name,description) values(#{type},#{name},#{description})")
int save(Book book);
//更新图书信息
@Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
int update(Book book);
//删除图书(逻辑删除)
@Delete("update tbl_book set is_delete = 1 where id = #{id}")
int delete(String id);
//根据id获取图书信息用于回显
@Select("select * from tbl_book where id = #{id} and is_delete=0")
Book getById(String id);
//按条件查询
@Select("select * from tbl_book where name like concat('%',#{name},'%') and is_delete = 0")
List<Book> selectByName(String name);
}
Service接口及实现类:
@Transactional
public interface BookService {
//保存图书
boolean save(Book book);
//更新数据
boolean update(Book book);
//删除数据
boolean delete(String id);
//根据id查询
Book getById(String id);
//按书名查询
List<Book> getByName(String name);
}
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
@Override
public boolean save(Book book) {
return bookDao.save(book) > 0;
}
@Override
public boolean update(Book book) {
return bookDao.update(book) > 0;
}
@Override
public boolean delete(String id) {
return bookDao.delete(id) > 0;
}
@Override
public Book getById(String id) {
return bookDao.getById(id);
}
@Override
public List<Book> getByName(String name) {
return bookDao.selectByName(name);
}
}
为了节省篇幅,前端代码这里就不展示了,前端使用的是ElementUI组件。
3.项目运行
①运行Application类的main函数,显示运行成功
②进入网站,浏览器输入localhost:8080/index.html,成功进入网站,说明项目搭建成功。
③添加图书测试
点击新建按钮,输入图书信息,点击确定
返回主页查看图书信息,可以看到图书被成功添加
返回YashanDB查询,可以看到该条记录已被添加到数据库中
④修改图书测试
点击编辑按钮,修改原有图书信息
可以看到成功修改原有信息
数据库中的记录也发生了变化
⑤删除图书
删除图书实际上执行的还是修改操作,图书删除后is_delete字段将修改为1,执行删除操作,可以看到前端数据不展示,但是数据库还存在该数据,但是is_delete字段被修改为1。
四:使用感想
至此使用SpringBoot连接YashanDB进行项目开发的介绍就结束了,如今去“O”化的背后,不仅仅是为了降低成本,更是为了防范西方对我们的封锁。要知道,去年世界顶级数据库供应商Oracle公司暂停了面向俄罗斯的所有业务,这就意味着让很多关键业务系统瞬间陷入高风险之中,因为出现漏洞也无法进行修复,而我们谁也不能保证这一天不会在我们国家发生。当然在这样的背景下,对国产数据库而言既是机遇也是挑战,如今金融、政府、电信、医疗等行业基本上用的都是Oracle,而YashanDB的使用和Oracle类似,并且可满足上述行业对高性能、高并发及高安全性的要求,或许在不久的将来YashanDB能够在这些行业争得一席之地。但是一个后来者想要挑战拥有成熟生态的先行者,需要的投资非常大,想要进入这个“高端俱乐部”,需要战略上有着坚定的决心和持续多年的投入。
此外,笔者认为一款数据库的成功不仅仅需要技术上的成功,还需要声誉上的成功,虽然都说酒香不怕巷子深,但是其最后还是要靠那些品尝过的人进行宣传。所以笔者认为提高数据库的知名度很重要,不仅仅要在企业之间广泛被使用,还要在个人开发者、学校等场景被广泛使用,毕竟谁又能保证哪个开发者日后不会成为一名老板呢?毋庸置疑的是,YashanDB的出现,可以说是国产数据库的又一突破,相信在不久的将来,拥有自主创新能力的YashanDB也能像Oracle、MySQL等一流数据库一样广为人知且被广为认可。