溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

BeetlSQL框架學(xué)習(xí)(一)——初識(shí)BeetlSQL,特點(diǎn),內(nèi)置sql的使用,Pojo代碼生成等

發(fā)布時(shí)間:2020-06-09 12:33:25 來源:網(wǎng)絡(luò) 閱讀:30010 作者:墨營(yíng) 欄目:軟件技術(shù)

學(xué)習(xí)BeetlSQL總結(jié)(1)
一.BeetlSQL特點(diǎn):
1.開發(fā)效率:
(1)無(wú)需注解,能自動(dòng)使用大量的內(nèi)置sql,快速完成增,刪,改,查的功能
(2)數(shù)據(jù)模型支持Pojo,也支持Map/List這種快速模型,也支持混合模型
(3)SQL模板基于B eetl實(shí)現(xiàn),更容易寫和調(diào)試,以及擴(kuò)展
(4)可以針對(duì)單個(gè)表(或者視圖)生成Pojo類和sql模型,甚至是整個(gè)數(shù)據(jù)庫(kù),能有效的減少代碼的編寫量
2.維護(hù)性:
(1)SQL以更加簡(jiǎn)潔的方式,Markdown方式集中管理,同時(shí)方便程序的開發(fā)和數(shù)據(jù)庫(kù)sql的調(diào)試
(2)可以自動(dòng)將sql文件自動(dòng)映射為dao接口類
(3)靈活直觀的支持一對(duì)一,一對(duì)多,多對(duì)多的關(guān)系映射而不引入復(fù)雜的OR Maping概念和技術(shù)
(4)具備Interceptor功能,可以調(diào)試,性能診斷SQL,以及擴(kuò)展其他的功能
3.其他:
(1)內(nèi)置支持主從數(shù)據(jù)庫(kù)支持的開源工具
(2)性能數(shù)倍于JPA,Mybatis
(3)支持跨數(shù)據(jù)庫(kù)平臺(tái),將開發(fā)者的工作量減少到最少,目前支持的跨數(shù)據(jù)庫(kù)有mysql,postgres,oracle,sqlserver,h3,sqllite,DB2
二,以mevan工程為例(理解BeetlSQL)
因?yàn)槲乙呀?jīng)完成了本次所展示的所有代碼,所以提前展示一下代碼結(jié)構(gòu)
BeetlSQL框架學(xué)習(xí)(一)——初識(shí)BeetlSQL,特點(diǎn),內(nèi)置sql的使用,Pojo代碼生成等

1.創(chuàng)建mevan工程(BeetlSQL)
我已經(jīng)創(chuàng)建好了mevan工程,結(jié)構(gòu)如下:
BeetlSQL框架學(xué)習(xí)(一)——初識(shí)BeetlSQL,特點(diǎn),內(nèi)置sql的使用,Pojo代碼生成等
2.添加BeetlSQL框架(配置pom.xml)

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.com.dhcc.beetl</groupId>
    <artifactId>BeetlSQL</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>BeetlSQL Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <!-- 單元測(cè)試 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- 2.日志 -->
        <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- Beetl SQL框架相關(guān)包 -->
        <!-- https://mvnrepository.com/artifact/com.ibeetl/beetl -->
        <dependency>
            <groupId>com.ibeetl</groupId>
            <artifactId>beetl</artifactId>
            <version>2.8.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.ibeetl/beetlsql -->
        <dependency>
            <groupId>com.ibeetl</groupId>
            <artifactId>beetlsql</artifactId>
            <version>2.10.31</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>BeetlSQL</finalName>
    </build>
</project>

3.因?yàn)槲覀兪且獙?duì)數(shù)據(jù)庫(kù)進(jìn)行操作,所以第二步我們創(chuàng)建數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)表

CREATE DATABASE beetlsql;
USE beetlsql;
CREATE TABLE USER(
 id INT(11) NOT NULL AUTO_INCREMENT,
 NAME VARCHAR(64) DEFAULT NULL,
 age INT(4) DEFAULT NULL,
 username VARCHAR(64) DEFAULT NULL COMMENT '用戶名',
 roleId INT(11) DEFAULT NULL COMMENT '用戶角色',
 create_date DATETIME NULL DEFAULT NULL,
 PRIMARY KEY(id)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

4.接下來編寫數(shù)據(jù)表user對(duì)應(yīng)的entity實(shí)體類(后面將展示代碼自動(dòng)生成)

package cn.com.dhcc.beetlsql.entity;

import java.util.Date;
//用戶實(shí)體類
public class User {
    private Integer id;
    private Integer age;
    //用戶角色
    private Integer roleId;
    private String name;
    //用戶名稱
    private String userName;
    private Date createDate;

    public User() {

    }

    public User(Integer id, Integer age, Integer roleId, String name, String userName, Date createDate) {
        super();
        this.id = id;
        this.age = age;
        this.roleId = roleId;
        this.name = name;
        this.userName = userName;
        this.createDate = createDate;
    }

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Integer getRoleId() {
        return roleId;
    }
    public void setRoleId(Integer roleId) {
        this.roleId = roleId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Date getCreateDate() {
        return createDate;
    }
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", age=" + age + ", roleId=" + roleId + ", name=" + name + ", userName=" + userName
                + ", createDate=" + createDate + "]";
    }

}

5.下來我們寫一個(gè)main方法來對(duì)BeetlSQL進(jìn)行功能測(cè)試以及理解
(1)建立數(shù)據(jù)庫(kù)的連接,這里我們沒有寫配置文件,各項(xiàng)數(shù)據(jù)庫(kù)連接所需參數(shù)就在主方法中設(shè)定

String mysqlDriver="com.mysql.jdbc.Driver";
        String url="jdbc:mysql://localhost:3306/beetlsql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false";
        String userName="root";
        String password="qitao1996";
        ConnectionSource source=ConnectionSourceHelper.getSimple(mysqlDriver, url, userName, password);
        DBStyle mysql=new MySqlStyle();

        //SQL語(yǔ)句放于classpath的sql目錄下
        SQLLoader loader=new ClasspathLoader("/sql");
        //數(shù)據(jù)庫(kù)命名和java命名一樣,所以采用DefaultNameConversion,還有一個(gè)UnderlinedNameConversion下劃線風(fēng)格的
        UnderlinedNameConversion nc=new UnderlinedNameConversion();
        //最后,創(chuàng)建一個(gè)SQLManager,DebugInterceptor,不是必須的,但可以通過它查看SQL的執(zhí)行情況
        SQLManager sqlManager=new SQLManager(mysql, loader,source,nc,new Interceptor[]{new DebugInterceptor()});

(2)接下里我們就先使用內(nèi)置的sql語(yǔ)句對(duì)數(shù)據(jù)庫(kù)表進(jìn)行操作,代碼如下

//1.使用內(nèi)置的生成的sql新增用戶,如果需要獲取主鍵,可以傳入KeyHolder
        System.out.println("開始使用內(nèi)置sql進(jìn)行用戶添加...");
        User user=new User();
        user.setAge(19);
        user.setName("曼斯坦因");
        int num=sqlManager.insert(user);
        if(num>0) {
            System.out.println("使用內(nèi)置sql用戶添加成功!!!!");
        }   

        //2.使用內(nèi)置sql查詢用戶
        int id=1;
        System.out.println("開始使用內(nèi)置sql進(jìn)行用戶查詢...");
        user=sqlManager.unique(User.class, id);
        System.out.println("使用內(nèi)置sql進(jìn)行用戶查詢完畢??!");

        //3.更新(修改)數(shù)據(jù),僅僅根據(jù)id更新值不為null的列
        System.out.println("開始使用內(nèi)置sql更新用戶信息...");
        User newUser=new User();
        newUser.setId(1);
        newUser.setName("朱可夫");
        int num1=sqlManager.updateTemplateById(newUser);
        if(num1>0) {
            System.out.println("使用內(nèi)置sql更新用戶信息成功!!!!");
        }

        //4.模板查詢
        User query=new User();
        query.setName("曼斯坦因");
        System.out.println("開始進(jìn)行模板查詢...");
        List<User> userList=sqlManager.template(query);
        System.out.println("打印查詢結(jié)果:");
        for(User u:userList) {
            System.out.println(u);
        }
        System.out.println("使用模板查詢成功...");

執(zhí)行結(jié)果如下:
開始使用內(nèi)置sql進(jìn)行用戶添加...
┏━━━━━ Debug [user._gen_insert] ━━━
┣ SQL: insert into user (name,age,create_date) VALUES (?,?,?)
┣ 參數(shù): [曼斯坦因, 19, null]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:52)
┣ 時(shí)間: 319ms
┣ 更新: [1]
┗━━━━━ Debug [user._gen_insert] ━━━

使用內(nèi)置sql用戶添加成功!!!!
開始使用內(nèi)置sql進(jìn)行用戶查詢...
┏━━━━━ Debug [user._gen_selectById] ━━━
┣ SQL: select * from user where id = ?
┣ 參數(shù): [1]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:60)
┣ 時(shí)間: 37ms
┣ 結(jié)果: [User [id=1, age=19, roleId=null, name=朱可夫, userName=null, createDate=null]]
┗━━━━━ Debug [user._gen_selectById] ━━━

使用內(nèi)置sql進(jìn)行用戶查詢完畢!!
開始使用內(nèi)置sql更新用戶信息...
┏━━━━━ Debug [user._gen_updateTemplateById] ━━━
┣ SQL: update user set name=? where id = ?
┣ 參數(shù): [朱可夫, 1]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:68)
┣ 時(shí)間: 168ms
┣ 更新: [1]
┗━━━━━ Debug [user._gen_updateTemplateById] ━━━

使用內(nèi)置sql更新用戶信息成功!!!!
開始進(jìn)行模板查詢...
┏━━━━━ Debug [user._gen_selectByTemplate] ━━━
┣ SQL: select * from user where 1=1 and name=?
┣ 參數(shù): [曼斯坦因]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:77)
┣ 時(shí)間: 91ms
┣ 結(jié)果: [10]
┗━━━━━ Debug [user._gen_selectByTemplate] ━━━

打印查詢結(jié)果:
User [id=2, age=19, roleId=null, name=曼斯坦因, userName=mansitanying, createDate=null]
User [id=3, age=19, roleId=null, name=曼斯坦因, userName=deguoyuanshuai, createDate=null]
User [id=4, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=5, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=6, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=7, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=8, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=9, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=10, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=11, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
使用模板查詢成功...
開始使用sql文件中sql語(yǔ)句進(jìn)行查詢....
┏━━━━━ Debug [user.select] ━━━
┣ SQL: select * from user where 1=1
┣ 參數(shù): []
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:88)
┣ 時(shí)間: 78ms
┣ 結(jié)果: [11]
┗━━━━━ Debug [user.select] ━━━

User [id=1, age=19, roleId=null, name=朱可夫, userName=null, createDate=null]
User [id=2, age=19, roleId=null, name=曼斯坦因, userName=mansitanying, createDate=null]
User [id=3, age=19, roleId=null, name=曼斯坦因, userName=deguoyuanshuai, createDate=null]
User [id=4, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=5, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=6, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=7, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=8, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=9, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=10, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=11, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]

(3)展示代碼生成:
##1.我們先在數(shù)據(jù)庫(kù)中建立一張person表,用以生成Pojo類以及sql

CREATE TABLE person(
 id INT(11) NOT NULL AUTO_INCREMENT,
 NAME VARCHAR(64) DEFAULT NULL,
 age INT(4) DEFAULT NULL,
 pername VARCHAR(64) DEFAULT NULL COMMENT '人名',
 roleId INT(11) DEFAULT NULL COMMENT '個(gè)人角色',
 create_date DATETIME NULL DEFAULT NULL,
 PRIMARY KEY(id)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

##2.用以生成代碼的代碼:

//利用genPojoCodeToConsole 生成代碼
        System.out.println("開始生成代碼:");
        try {
            sqlManager.genPojoCodeToConsole("person");
            sqlManager.genSQLTemplateToConsole("person");
            sqlManager.genSQLTemplateToConsole("user");
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("代碼生成結(jié)束....");

執(zhí)行結(jié)果:
開始生成代碼:
package com.test;
import java.math.*;
import java.util.Date;
import java.sql.Timestamp;
import org.beetl.sql.core.annotatoin.Table;

/*

  • gen by beetlsql 2018-08-17*/
    @Table(name="beetlsql.person")
    br/>*/
    @Table(name="beetlsql.person")

    private Integer id ;
    private Integer age ;
    /
    個(gè)人角色
    /
    private Integer roleid ;
    private String name ;
    /
    人名
    /
    private String pername ;
    private Date createDate ;

    public Person() {
    }

    public Integer getId(){
    return id;
    }
    public void setId(Integer id ){
    this.id = id;
    }

    public Integer getAge(){
    return age;
    }
    public void setAge(Integer age ){
    this.age = age;
    }

    /**

    • 個(gè)人角色
      @return
      /
      public Integer getRoleid(){
      return roleid;
      }
      /**
    • 個(gè)人角色
      @param roleid
      /
      public void setRoleid(Integer roleid ){
      this.roleid = roleid;
      }

    public String getName(){
    return name;
    }
    public void setName(String name ){
    this.name = name;
    }

    /**

    • 人名
      @return
      /
      public String getPername(){
      return pername;
      }
      /**
    • 人名
      @param pername
      /
      public void setPername(String pername ){
      this.pername = pername;
      }

    public Date getCreateDate(){
    return createDate;
    }
    public void setCreateDate(Date createDate ){
    this.createDate = createDate;
    }

}

sample

  • 注釋

    select #use("cols")# from person where #use("condition")#

cols

id,NAME,age,pername,roleId,create_date

updateSample

id=#id#,NAME=#name#,age=#age#,pername=#pername#,roleId=#roleid#,create_date=#createDate#

condition

1 = 1  
@if(!isEmpty(id)){
 and id=#id#
@}
@if(!isEmpty(name)){
 and NAME=#name#
@}
@if(!isEmpty(age)){
 and age=#age#
@}
@if(!isEmpty(pername)){
 and pername=#pername#
@}
@if(!isEmpty(roleid)){
 and roleId=#roleid#
@}
@if(!isEmpty(createDate)){
 and create_date=#createDate#
@}

sample

===

  • 注釋

    select #use("cols")# from user where #use("condition")#

cols

id,name,age,username,roleId,create_date

updateSample

id=#id#,name=#name#,age=#age#,username=#username#,roleId=#roleid#,create_date=#createDate#

condition

1 = 1  
@if(!isEmpty(id)){
 and id=#id#
@}
@if(!isEmpty(name)){
 and name=#name#
@}
@if(!isEmpty(age)){
 and age=#age#
@}
@if(!isEmpty(username)){
 and username=#username#
@}
@if(!isEmpty(roleid)){
 and roleId=#roleid#
@}
@if(!isEmpty(createDate)){
 and create_date=#createDate#
@}

(4)利用外部sql文件進(jìn)行數(shù)據(jù)庫(kù)表的操作

##1.編寫md格式的sql文件結(jié)構(gòu)以及內(nèi)容如下(以查詢?yōu)槔?/p>

select
====

    select * from user where 1=1
    @if(!isEmpty(age)){
    and age=#age#
    @}
    @if(!isEmpty(name)){
    and name=#name#
    @}

##2.主方法代碼

    //5.利用sql文件中sql語(yǔ)句進(jìn)行查詢
    User query2 = new User();
    query.setName("xiandafu");
    System.out.println("開始使用sql文件中sql語(yǔ)句進(jìn)行查詢....");
    List<User> list2 = sqlManager.select("user.select",User.class,query2);
    for(User u:list2) {
        System.out.println(u);
    }
    System.out.println("sql文件中sql語(yǔ)句進(jìn)行查詢成功...");     

執(zhí)行結(jié)果:
開始使用sql文件中sql語(yǔ)句進(jìn)行查詢....
┏━━━━━ Debug [user.select] ━━━
┣ SQL: select * from user where 1=1
┣ 參數(shù): []
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:88)
┣ 時(shí)間: 78ms
┣ 結(jié)果: [11]
┗━━━━━ Debug [user.select] ━━━

User [id=1, age=19, roleId=null, name=朱可夫, userName=null, createDate=null]
User [id=2, age=19, roleId=null, name=曼斯坦因, userName=mansitanying, createDate=null]
User [id=3, age=19, roleId=null, name=曼斯坦因, userName=deguoyuanshuai, createDate=null]
User [id=4, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=5, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=6, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=7, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=8, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=9, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=10, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=11, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
sql文件中sql語(yǔ)句進(jìn)行查詢成功...

這里我們看見了sql文件,本章不做詳細(xì)說明,我們先來簡(jiǎn)單的了解一下sql問價(jià)可能的編寫(5)簡(jiǎn)單了解sql文件的編寫
##1.采用md格式,===上面是sql語(yǔ)句的唯一標(biāo)示,下面則是sql語(yǔ)句
##2.@和回車符是定界符號(hào),可以在里面寫beetl語(yǔ)句
br/>(5)簡(jiǎn)單了解sql文件的編寫
##1.采用md格式,===上面是sql語(yǔ)句的唯一標(biāo)示,下面則是sql語(yǔ)句
##2.@和回車符是定界符號(hào),可以在里面寫beetl語(yǔ)句
##4.isEmpty是beetll的一個(gè)函數(shù),用來判斷變量是否為空或者是否不存在
##5.文件名約定為類名,首字母小寫
(6)sqlId到sql文件的映射
sqlId 到sql文件的映射是通過類SQLIdNameConversion來完成的,默認(rèn)提供了DefaultSQLIdNameConversion實(shí)現(xiàn),即 以 "." 區(qū)分最后一部分是sql片段名字,前面轉(zhuǎn)為為文件相對(duì)路徑,如sqlId是user.select,則select是sql片段名字,user是文件名,beetlsql會(huì)在根目錄下尋找/user.sql,/user.md ,也會(huì)找數(shù)據(jù)庫(kù)方言目錄下尋找,比如如果使用了mysql數(shù)據(jù)庫(kù),則優(yōu)先尋找/mysql/user.md,/mysql/user.sql 然后在找/user.md,/user.sql.
如果sql是 test.user.select,則會(huì)在/test/user.md(sql) 或者 /mysql/test/user.md(sql) 下尋找“select”片段
【本次總結(jié)完畢】

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI