1. 程式人生 > >BeetlSQL框架學習(一)——初識BeetlSQL,特點,內置sql的使用,Pojo代碼生成等

BeetlSQL框架學習(一)——初識BeetlSQL,特點,內置sql的使用,Pojo代碼生成等

spa imp 文件 無需 結束 innodb inter tostring postgre

學習BeetlSQL總結(1)
一.BeetlSQL特點:
1.開發效率:
(1)無需註解,能自動使用大量的內置sql,快速完成增,刪,改,查的功能
(2)數據模型支持Pojo,也支持Map/List這種快速模型,也支持混合模型
(3)SQL模板基於B eetl實現,更容易寫和調試,以及擴展
(4)可以針對單個表(或者視圖)生成Pojo類和sql模型,甚至是整個數據庫,能有效的減少代碼的編寫量
2.維護性:
(1)SQL以更加簡潔的方式,Markdown方式集中管理,同時方便程序的開發和數據庫sql的調試
(2)可以自動將sql文件自動映射為dao接口類
(3)靈活直觀的支持一對一,一對多,多對多的關系映射而不引入復雜的OR Maping概念和技術
(4)具備Interceptor功能,可以調試,性能診斷SQL,以及擴展其他的功能
3.其他:
(1)內置支持主從數據庫支持的開源工具
(2)性能數倍於JPA,Mybatis
(3)支持跨數據庫平臺,將開發者的工作量減少到最少,目前支持的跨數據庫有mysql,postgres,oracle,sqlserver,h2,sqllite,DB2
二,以mevan工程為例(理解BeetlSQL)
因為我已經完成了本次所展示的所有代碼,所以提前展示一下代碼結構
技術分享圖片

1.創建mevan工程(BeetlSQL)
我已經創建好了mevan工程,結構如下:
技術分享圖片
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>
        <!-- 單元測試 -->
        <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框架相關包 -->
        <!-- 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.因為我們是要對數據庫進行操作,所以第二步我們創建數據庫及數據庫表

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.接下來編寫數據表user對應的entity實體類(後面將展示代碼自動生成)

package cn.com.dhcc.beetlsql.entity;

import java.util.Date;
//用戶實體類
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.下來我們寫一個main方法來對BeetlSQL進行功能測試以及理解
(1)建立數據庫的連接,這裏我們沒有寫配置文件,各項數據庫連接所需參數就在主方法中設定

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語句放於classpath的sql目錄下
        SQLLoader loader=new ClasspathLoader("/sql");
        //數據庫命名和java命名一樣,所以采用DefaultNameConversion,還有一個UnderlinedNameConversion下劃線風格的
        UnderlinedNameConversion nc=new UnderlinedNameConversion();
        //最後,創建一個SQLManager,DebugInterceptor,不是必須的,但可以通過它查看SQL的執行情況
        SQLManager sqlManager=new SQLManager(mysql, loader,source,nc,new Interceptor[]{new DebugInterceptor()});

(2)接下裏我們就先使用內置的sql語句對數據庫表進行操作,代碼如下

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

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

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

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

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

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

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

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

打印查詢結果:
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語句進行查詢....
┏━━━━━ Debug [user.select] ━━━
┣ SQL: select * from user where 1=1
┣ 參數: []
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:88)
┣ 時間: 78ms
┣ 結果: [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.我們先在數據庫中建立一張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 ‘個人角色‘,
 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("代碼生成結束....");

執行結果:
開始生成代碼:
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 ;
    /
    個人角色
    /
    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;
    }

    /**

    • 個人角色
      @return
      /
      public Integer getRoleid(){
      return roleid;
      }
      /**
    • 個人角色
      @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文件進行數據庫表的操作

##1.編寫md格式的sql文件結構以及內容如下(以查詢為例)

select
====

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

##2.主方法代碼

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

執行結果:
開始使用sql文件中sql語句進行查詢....
┏━━━━━ Debug [user.select] ━━━
┣ SQL: select * from user where 1=1
┣ 參數: []
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:88)
┣ 時間: 78ms
┣ 結果: [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語句進行查詢成功...

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

BeetlSQL框架學習(一)——初識BeetlSQL,特點,內置sql的使用,Pojo代碼生成等